Physik test

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Physik test

BeitragDo, Sep 30, 2010 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 30, 2010 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Smile
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Raiden93

BeitragDo, Sep 30, 2010 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
ich werde mich mal dran versuchen

Raiden93

BeitragDo, Sep 30, 2010 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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´

BeitragDo, Sep 30, 2010 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 30, 2010 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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

BeitragDo, Sep 30, 2010 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 30, 2010 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
mir reicht eine einfache gleichgeformte Kollision Smile

das wurgel

BeitragDo, Sep 30, 2010 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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´

BeitragFr, Okt 01, 2010 9:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Okt 01, 2010 10:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Okt 01, 2010 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe deinen Satz nicht. Benutze bitte Satzzeichen.
1 ist ungefähr 3

Raiden93

BeitragFr, Okt 01, 2010 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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".

Xeres

Moderator

BeitragFr, Okt 01, 2010 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE 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

BeitragFr, Okt 01, 2010 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group