Physik test
Übersicht

![]() |
Raiden93Betreff: Physik test |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey ich hab zur Übung mal ein kleinen Test geschrieben.
Bei Betätigung Mousehit(1) wird ein Roter Würfel 20x20 an der gleichen stelle gespawnt wo der Maus Zeiger sich befindet.Sobald er gespawnt ist fällt er langsam bis auf Y = 0 und Stopt dann. Jetzt möchte ich gerne das meine Blöcke sich stapeln können nur weis ich nicht wie ich den einzelnen Blöcken sage hör mal da ist ein block stell dich auf ihr drauf anstatt hindurch. Es muss was mit Block\Y# sein nur wie gesagt finde ich einfach nicht heraus wie Block\Y# weis das da ein Block ist und sich auf ihn stapelt. Code: [AUSKLAPPEN] AppTitle "Block Versuche"
Graphics 800,600,32,2 SetBuffer BackBuffer() Type BlockTyp Field X#, Y#, Speed# End Type Global Block.BlockTyp Repeat Cls Color 0,0,255 Rect 0,0,200,600 Rect 600,0,200,600 If MouseHit(1) Block_Erstellung() End If Block_Malen Block_Physik Flip 0 Until KeyHit(1) Function Block_Erstellung() For i=1 To 1 Block.BlockTyp = New BlockTyp Block\Speed# = 0.05 Block\X# = MouseX() Block\Y# = MouseY() Next End Function Function Block_Malen() For Block.BlockTyp = Each BlockTyp Color 255,0,0 Rect Block\X#,Block\Y#,20,20 Next End Function Function Block_Physik() For Block.BlockTyp = Each BlockTyp Block\Y# = Block\Y# +Block\Speed# If Block\Y# >579 Block\Speed# = 0 End If Next End Function |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du mußt die bestehenden Blöcke gegen den fallenden Block (also alle dessen Speed also größer 0 ist) prüfen ob sie a) in X überhaupt auf Kollision laufen können und b) in Y schon kollidieren (Y+20>=Y_temporär). Trifft das zu stoppt der Block. Das ganze kannst Du mittels zweier verschachtelter Schleifen realisieren. Alles klar? ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich werde mich mal dran versuchen | ||
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe ein wenig rum Experimentiert und stoße immer wieder aufs gleiche.
Ich weiß nicht wie ich Block_Cache einen alten schon existierenden Block zuweise. Die X Koordinaten wollte ich erstmal weg lassen auch wenn es im freien stoppt wollte ich mich erstmal um Y kümmern. Kann mir jemand sagen wie ich meinem Block_Cache die Y Daten eines schon bestehenden Blocks zuweise? Code: [AUSKLAPPEN] AppTitle "Block Versuche"
Graphics 800,600,32,2 SetBuffer BackBuffer() Type BlockTyp Field X#, Y#, Speed# End Type Global Block.BlockTyp Global Block_Cache# Repeat Cls Color 0,0,255 Rect 0,0,200,600 Rect 600,0,200,600 If MouseHit(1) Block_Erstellung() End If Block_Malen Block_Physik Text 400,300,+Block_Cache# Flip 0 Until KeyHit(1) Function Block_Erstellung() For i=1 To 1 Block.BlockTyp = New BlockTyp Block\Speed# = 0.05 Block\X# = MouseX() Block\Y# = MouseY() Next End Function Function Block_Malen() For Block.BlockTyp = Each BlockTyp Color 255,0,0 Rect Block\X#,Block\Y#,20,20 Text 400,335,+Block\Y# Text 400,380,+Block\Speed# Next End Function Function Block_Physik() For Block.BlockTyp = Each BlockTyp Block\Y# = Block\Y# +Block\Speed# Block_Cache# = Block\Y# ;<----- Hier ist das Problem If Block\Y# >579 Block\Speed# = 0 End If If Block\Speed# < 1 If Block\Y+20 >= Block_Cache Block\Speed = 0 End If End If Next End Function |
||
![]() |
Johannes´ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mir deinen Code mal angesehen. Vielleicht solltest du jeden Stein mit jedem prüfen, quasi so
Code: [AUSKLAPPEN] If Block\Speed# < 1
For b.BlockTyp=Each BlockTyp If b\Y#-20< Block\Y# And b\speed#=0 Block\Speed# = 0 End If Next End If Hier brauchst du deine Block_Cache auch nicht. |
||
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
er zeigt mir dann Error Memory access violation an hmm ich glaub das geht nicht eine For schleife dann eine If Bedingungen und dan wieder eine for schleife Funktionieren also ich schreibe nochmal den Code hier rein will diene Theorie ja nicht vermiesen falls ich was falsch gemacht habe ![]() Code: [AUSKLAPPEN] AppTitle "Block Versuche"
Graphics 800,600,32,2 SetBuffer BackBuffer() Type BlockTyp Field X#, Y#, Speed# End Type Global Block.BlockTyp Repeat Cls Color 0,0,255 Rect 0,0,200,600 Rect 600,0,200,600 If MouseHit(1) Block_Erstellung() End If Block_Malen Block_Physik Flip 0 Until KeyHit(1) Function Block_Erstellung() For i=1 To 1 Block.BlockTyp = New BlockTyp Block\Speed# = 0.05 Block\X# = MouseX() Block\Y# = MouseY() Next End Function Function Block_Malen() For Block.BlockTyp = Each BlockTyp Color 255,0,0 Rect Block\X#,Block\Y#,20,20 Text 400,335,+Block\Y# Text 400,380,+Block\Speed# Next End Function Function Block_Physik() For Block.BlockTyp = Each BlockTyp Block\Y# = Block\Y# +Block\Speed# If Block\Y# >579 Block\Speed# = 0 End If If Block\Speed# < 1 For Block.BlockTyp = Each BlockTyp If Block\Y+20 < Block\Y# And Block\Speed# = 0 Block\Speed = 0 End If Next End If Next End Function |
||
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit ein paar y Vergleichen wird das nicht zu machen sein. Eventuell kriegst du recht hübsches Stapeln hin, aber sobald sich Blöcke auch drehen soll wirds haarig. Da brauchst du richtige Physik Simulation und Kollissionserkennung für beliebig gedrehte Körper.
lg ComNik |
||
WIP: Vorx.Engine |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
mir reicht eine einfache gleichgeformte Kollision ![]() |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du nennst die Block-Variable in der inneren Schleife genauso wie die in der äußeren. Woher soll der Computer jetzt wissen, welche gemeint ist? Außerdem prüfst du nur Blöcke, deren Geschwindigkeit kleiner 1 ist. | ||
1 ist ungefähr 3 |
![]() |
Johannes´ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst den Code schon richtig einbauen. In der inneren For-Schleife kannst du nicht noch einmal "Block" für die Types verwenden.
Dieser Code hier funktioniert bei mir: Code: [AUSKLAPPEN] AppTitle "Block Versuche"
Graphics 800,600,32,2 SetBuffer BackBuffer() Type BlockTyp Field X#, Y#, Speed# End Type Global Block.BlockTyp Repeat Cls Color 0,0,255 Rect 0,0,200,600 Rect 600,0,200,600 If MouseHit(1) Block_Erstellung() End If Block_Malen Block_Physik Flip 0 Until KeyHit(1) Function Block_Erstellung() For i=1 To 1 Block.BlockTyp = New BlockTyp Block\Speed# = 0.05 Block\X# = MouseX() Block\Y# = MouseY() Next End Function Function Block_Malen() For Block.BlockTyp = Each BlockTyp Color 255,0,0 Rect Block\X#,Block\Y#,20,20 Text 400,335,+Block\Y# Text 400,380,+Block\Speed# Next End Function Function Block_Physik() For Block.BlockTyp = Each BlockTyp Block\Y# = Block\Y# +Block\Speed# If Block\Y# >579 Block\Speed# = 0 End If If Block\Speed# < 1 For b.BlockTyp=Each BlockTyp If b\Y#-20< Block\Y# And b\speed#=0 Block\Speed# = 0 End If Next End If Next End Function Außerdem brauchst du "-20", da ja geprüft werden soll, ob der fallende Block auf einen anderen fällt, nicht ob er von unten darauf trifft. |
||
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Fertig habe die X Koordinaten auch eingebaut nur währe einer noch so lieb und würde mir das mit dem NewBlock den ich gemacht habe ist das der Alte oder der neue block das wusste ich jetzt nicht.
Code: [AUSKLAPPEN] AppTitle "Block Versuche"
Graphics 800,600,32,2 SetBuffer BackBuffer() Type BlockTyp Field X#, Y#, Speed# End Type Global Block.BlockTyp Global NewBlock.BlockTyp Repeat Cls Color 0,0,255 Rect 0,0,200,600 Rect 600,0,200,600 If MouseHit(1) Block_Erstellung() End If Block_Malen Block_Physik Flip 0 Until KeyHit(1) Function Block_Erstellung() Local i For i=1 To 1 Block.BlockTyp = New BlockTyp Block\Speed# = 0.05 Block\X# = MouseX() Block\Y# = MouseY() Next End Function Function Block_Malen() For Block.BlockTyp = Each BlockTyp Color 255,0,0 Rect Block\X#,Block\Y#,20,20 Next End Function Function Block_Physik() For Block.BlockTyp = Each BlockTyp Block\Y# = Block\Y# +Block\Speed# If Block\Y# >579 Block\Speed# = 0 End If If Block\Speed# < 1 For NewBlock.BlockTyp = Each BlockTyp If NewBlock\X#-20 < Block\X# And NewBlock\X# +20 > Block\X# If NewBlock\Y-20 < Block\Y# And NewBlock\Speed# = 0 Block\Speed = 0 End If End If Next End If Next End Function |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich verstehe deinen Satz nicht. Benutze bitte Satzzeichen. | ||
1 ist ungefähr 3 |
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe den Type Namen "b" auf NewBlock geändert. Und jetzt wollte ich wissen ob es überhaut der Neue Block ist und nicht der andere.Weil ich ja einmal Block habe und einmal "NewBlock". | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also du hast dieses:
Code: [AUSKLAPPEN] Global Block.BlockTyp
Global NewBlock.BlockTyp Das bedeutet: Block und NewBlock können unterschiedliche Instanzen von "BlockTyp" beinhalten, aber sie können auch die selben sein. Das musst du, wenn du die Funktion Block_Physik() betrachtest, selber entscheiden. Wenn gilt: Block=NewBlock zeigen die beiden Variablen auf ein und das selbe Objekt. Die Zwei for..each Schleifen, "zählen" ihre Variable mit, aber da beides ein BlockTyp ist, holen sie sich die Objekte von der selben Liste! |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
- Zuletzt bearbeitet von Xeres am Fr, Okt 01, 2010 16:20, insgesamt einmal bearbeitet
![]() |
Raiden93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ahhh so ist das also ist es das gleiche Object nur 2 verschiedene namen so gesagt wie bei uns eine Doppel Namen "Maria" "Celien" z.b und wird benötigt um sich selbst anzusprechen. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group