Kollision mit abprallen
Übersicht

![]() |
FuM4nnSchUBetreff: Kollision mit abprallen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Gleichung steht oben ja (das sind N und V sind Vektoren und Skalarprodukt müsste klar sein ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hehe...immer noch an deinen Rechtecken FuM4nnSchU? ![]() Ähm ja.... ich bin an dem Thema auchmal interessiert... könnte mir hier bitte mal jemand erklären, was Skalarprodukte sind? ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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+]
|
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group