Kollision mit abprallen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

FuM4nnSchU

Betreff: Kollision mit abprallen

BeitragMo, Jan 29, 2007 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
hi @ all

ich bekomme keine Kollision zwischen den einzelnen Rechtecken hin
jedes Rechteck soll wenn es fertig ist an anderen im richtigen winkel wieder abprallen

nun der code:
Code: [AUSKLAPPEN]

;Grafik-Modus
Global screen_x = 1024
Global screen_y = 768
Global screen_depth = 32
Global screen_mode = 1

Graphics screen_x,screen_y,screen_depth,screen_mode
SetBuffer BackBuffer()
AppTitle "Grafikspielerei"

;Globals
Global anzahl = 200
Global frames = 50

;Types
Type TMain
   Field Flaeche.TFlaeche
End Type

Type TFlaeche
      Field x#
      Field y#
      Field width
      Field height
   Field colR
   Field colG
   Field colB
   Field speed
   Field winkel
End Type

Global Main.TMain = New TMain

;Hauptprogramm--------------------------------------------------------------------------------------------------------------------------

Init()
frame_timer = CreateTimer(frames)
Repeat
WaitTimer(frame_timer)
Cls
Main()
Flip
Until KeyHit(1)
FreeTimer(frame_timer)
End

;Funktionen-----------------------------------------------------------------------------------------------------------------------------

Function Init()

;Type-Init
For i = 1 To anzahl
      Main\Flaeche.TFlaeche = New TFlaeche
      Main\Flaeche\width = 20
      Main\Flaeche\height = 20
   Main\Flaeche\x = Rnd(0,screen_x - Main\Flaeche\width)
     Main\Flaeche\y = Rnd(0,screen_y - Main\Flaeche\height)
   Main\Flaeche\speed = Rand(1,10)
   Main\Flaeche\winkel = Rand(0,360)
   Main\Flaeche\colR = Rand(0,255)
   Main\Flaeche\colG = Rand(0,255)
   Main\Flaeche\colB = Rand(0,255)
Next

;Random-Init
SeedRnd(MilliSecs())

End Function

Function Main()

;Kollision
For Main\Flaeche.TFlaeche = Each TFlaeche
   If Main\Flaeche\x + Main\Flaeche\width >= screen_x Then Main\Flaeche\winkel = Main\Flaeche\winkel + 180 - Abs(Main\Flaeche\winkel) * 2
   If Main\Flaeche\x <= 0 Then Main\Flaeche\winkel = Main\Flaeche\winkel + 180 - Abs(Main\Flaeche\winkel + 180) * 2
   If Main\Flaeche\y + Main\Flaeche\height >= screen_y Then Main\Flaeche\winkel = Main\Flaeche\winkel + 180 - Abs(Main\Flaeche\winkel + 270) * 2
   If Main\Flaeche\y <= 0 Then Main\Flaeche\winkel = Main\Flaeche\winkel + 180 - Abs(Main\Flaeche\winkel + 90) * 2

   Main\Flaeche\winkel = (360 + Main\Flaeche\winkel) Mod 360
Next

;Bewegung
For Main\Flaeche.TFlaeche = Each TFlaeche
      Main\Flaeche\x = Main\Flaeche\x + Cos(Main\Flaeche\winkel) * Main\Flaeche\speed
   Main\Flaeche\y = Main\Flaeche\y + Sin(Main\Flaeche\winkel) * Main\Flaeche\speed
Next


;Zeichnen
For Main\Flaeche.TFlaeche = Each TFlaeche
      Color Main\Flaeche\colR,Main\Flaeche\colG,Main\Flaeche\colB
   Rect Main\Flaeche\x,Main\Flaeche\y,Main\Flaeche\width,Main\Flaeche\height,1
Next

End Function


vielleicht weis ja wer wie ich das machen könnte würde mich über einen ansatz sehr freuen...

mfG FuM4nnSchU
 

Dreamora

BeitragMo, Jan 29, 2007 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Abprallen geschieht indem man die Geschwindigkeit an der Oberflächennormale spiegelt. (im Weiteren als N für Normalenvektor bezeichnet)

Das spiegeln als solches ist nicht schwer.

Wenn N die Normale ist und V die alte Geschwindigkeit, so ist die neue Geschwindigkeit

neues V = - skalarProdukt(N,V)*N + ( V - skalarProdukt(N,V)*N ) = V - 2 * skalarProdukt(N,V)*N
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Di, Jan 30, 2007 7:59, insgesamt einmal bearbeitet

FuM4nnSchU

BeitragDi, Jan 30, 2007 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
könntest du mir vielleicht ein beispiel schreiben wie ich das spiegeln machen kann?
die grundkenntnisse im spiegeln hatte ich schon aber das problem ist das hier zwei bewegliche flächen aufeinander treffen...
 

Dreamora

BeitragDi, Jan 30, 2007 8:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Gleichung steht oben ja (das sind N und V sind Vektoren und Skalarprodukt müsste klar sein Smile )

Das einzige was du eigentlich selbst noch implementieren musst ist etwas was dir die Oberflächennormale am Aufschlagpunkt gibt, das wird dir Blitz in 2D nämlich nicht geben und ohne ist nix mit Abprallen. (in diesem Falle müsstest du wohl runde objekte nehmen da dort die Normale einfach Mittelpunkt -> Kollisionspunkt = Radius ist, das ganze natürlich normiert auf 1)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragDo, Feb 01, 2007 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hehe...immer noch an deinen Rechtecken FuM4nnSchU? Very Happy

Ähm ja.... ich bin an dem Thema auchmal interessiert... könnte mir hier bitte mal jemand erklären, was Skalarprodukte sind? Laughing
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

Mr Hopp

BeitragSo, März 11, 2007 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Nocheinmal die bitte... könnte nicht jemand einen Beispiel Code geben?? Du haust uns hier irgendne Formel hin, für die man wahrscheinlich studiert haben muss....
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, März 11, 2007 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, hab es mal versucht umzusetzen, aber da sind noch zwei Bugs drin!
Wenn ein Quadrat zwischen
Wand/Quadrat
oder
Quadrat/Quadrat
ist schieben diese sich teilweise soweit übereinander, das die Collie Abfrage nicht richtig funktioniert.
Code: [AUSKLAPPEN]
Graphics 1024 ,768
Const QuadratX% = 20
Const QuadratY% = 20
SetBuffer BackBuffer ()
Type Quad Field x#,y#,col%,Speed#,Winkel% End Type
Main ()
End

Function Main ()
    QuadErstellen (50)
    While Not KeyHit (1)
        QuadDraw ()
        QuadSetCollie ()
        Flip
        Cls
    Wend
   
End Function

Function QuadDraw ()
   
    For Q.Quad = Each Quad
        Color 0 ,0,Q\col%
        Rect Q\x#,Q\y#, QuadratX%, QuadratY%,1
    Next
   
End Function

Function QuadSetCollie ()
    ;draw
   
    For Q.Quad = Each Quad
        Q\x# = Q\x# + Cos (Q\Winkel%) * Q\Speed#
        Q\y# = Q\y# + Sin (Q\Winkel%) * Q\Speed#
    Next
   
    ;Collie Quadrat <> Quadrat
    For Q1.Quad = Each Quad ; jedes Quadrat mit jedemüberprüfen
        Q2.Quad = After Q1.Quad
       
        While Q2.Quad <> Null
           
            If RectsOverlap (Q1\x#,Q1\y#,QuadratX%,QuadratY%,Q2\x#,Q2\y#,QuadratX%,QuadratY%) Then
                ;Prüfen von welcher Seite die Quadrate treffen
                GradQuadQuad% = ATan2 (Q1\y - Q2\y,Q1\x - Q2\x) + 180
                GradQuadQuad% = (GradQuadQuad% + 45) Mod 360
                GradQuadQuad% = GradQuadQuad% / 90
               
                Select GradQuadQuad%
                 Case 0 ,2 VonGrad% = 180 ; treffen sich oben /unten
                 Case 1 ,3 VonGrad% = 360 ; treffen sich links /rechts
                End Select
               
                Q1\Winkel% = VonGrad% - Q1\Winkel%
                Q2\Winkel% = VonGrad% - Q2\Winkel%
            End If
           
            Q2.Quad = After Q2.Quad
        Wend
       
    Next
   
    ;Collie Quadrat <> Wand
   
    For Q.Quad = Each Quad
       
        If Q\x# < 0 Or Q\x# > (GraphicsWidth () - QuadratX%) Then
            Q\Winkel = 180 - Q\winkel%
        EndIf
       
        If Q\y# < 0 Or Q\y# > (GraphicsHeight () - QuadratY%) Then
            Q\Winkel = 360 - Q\winkel%
        EndIf
       
    Next
   
End Function

Function QuadErstellen (Anzahl%)
    For i = 0 To Anzahl% - 1
        Q.Quad = New Quad
        Q\x# = Rand ( QuadratX%,1024 - QuadratX%)
        Q\y# = Rand ( QuadratY%,768 - QuadratY%)
        Q\col% = Rand ($ffffff)
        Q\Speed# = Rand (1 ,5)
        Q\Winkel% = Rand (0 ,360)
    Next
   
    ;Prüfen das sich keiner überlagert beim erstellen
   
    For Q1.Quad = Each Quad
        Q2.Quad = After Q1.Quad
       
        While Q2.Quad <> Null
           
            If RectsOverlap (Q1\x#,Q1\y#,QuadratX%,QuadratY%,Q2\x#,Q2\y#,QuadratX%,QuadratY%) Then
                Delete Q2
                Geloeschte% = Geloeschte% + 1
                Exit
            End If
           
            Q2.Quad = After Q2.Quad
        Wend
       
    Next
    If Geloeschte% Then QuadErstellen (Geloeschte%)
End Function
[BB2D | BB3D | BB+]

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group