welche bälle nach vorne bezw. hinten bewegen?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mas93

Betreff: welche bälle nach vorne bezw. hinten bewegen?

BeitragMi, März 05, 2008 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute,
Ich arbeite gerade an einem kleinen zwischenprojekt und hab folgendes Problem.

Stellt euch folgende Situation vor:
user posted image

Die Bunten Bälle(ausgenommen der Ball mit der 1) bewegen sich alle von waypoint zu waypoint, haben sie diesen erreicht, gehen sie weiter zum nächsten...

Nun kann man von dem teil mit dem X in der Mitte neue Bälle in die vorhandene Ballschlange schießen.
In unserem Fall, wurde der Rote ball mit der nummer 1 geschossen und kollidiert mit Ball nr.2.

Nun müssen alle Bälle die vor Ball2 sind weiter dem waypoint folgen, und alle die hinter dem 2.Ball sind müssen sich zurrück richtung vorherigem waypoint bewegen.


Nun meine Frage:
Wie bekomme ich herraus, welcher Ball sich weiterbewegen muss und welcher zurrück muss?
Wie mache ich das am besten?

Wäre nett wenn ihr mir helfen könntet.



mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

kriD

BeitragMi, März 05, 2008 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
machs mit types.. da bekommst du ausgehend von dem kollisionsball ganz einfach heraus, welche typeeinträge nach und welche vor dem kollisionsball sind...befehle: BEFORE und AFTER

MfG kriD
Wenn ich du wäre, wäre ich lieber ich!

SpionAtom

BeitragDo, März 06, 2008 1:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ob Types oder Array ist doch egal, wichtig ist nur, dass die Kugeln ihrer Reihenfolge nach gespeichert werden. Ehrlich gesagt, weiß ich nicht, wo du da ein Problem siehst.

Und solltest du die Reihenfolge tatsächlich nicht wissen, so kannst du sie recht einfach rauskriegen. Da die Kugeln immer gerade Strecken zurücklegen, ist die erste immer die, die am nächsten zum weitesten Wegpunkt liegt, und die letzte eben die, die am weitesten vom nächsten Wegpunkt wegliegt.
Nagut, ganz so einfach ist es nicht. Wenn nicht alle Kugeln zwischen zwei Wegpunkten liegen, so musst du erst schauen, auf welchen Teilwegen sich die Schlange befindet. Mathematisch gesehen brauchst du nie mehr als die Abstandsformel und eine Winkelberechnung.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

mas93

BeitragDo, März 06, 2008 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
so, ich hatte das auch mit types gelöst, aber bei einer kollision kommt immer alles durcheinander.

Hier mal der Code zur bewegung der Bälle:

Code: [AUSKLAPPEN]
Function updateballs()
   For b.ball=Each ball
      For w.waypoint=Each waypoint
         
         If b\way=w\nummer Then b\winkel=ATan2(w\y-b\y,w\x-b\x)
         
         
         
         b\x=b\x+Cos(b\winkel)*0.5
         b\y=b\y+Sin(b\winkel)*0.5
         
         If b\way=w\nummer Then If RectsOverlap(b\x-5,b\y-5,10,10,w\x-5,w\y-5,10,10) Then b\way=b\way+1
         
      Next   
      DrawImage tiles,b\x,b\y,b\farbe
   Next
   
   ;Schuss-Koll
   
   For s.shot=Each shot
      For b.ball=Each ball
         If RectsOverlap(s\x-5,s\y-5,10,10,b\x-5,b\y-5,10,10)Then
            mx=b\x
            my=b\y
            mn=b\nummer
            mf=s\farbe
            
            koll=1
            
         EndIf
      Next
   Next
   
   
   If koll=1 Then
      For s.shot=Each shot
         For b.ball=Each ball
            
            
            If b\nummer<mn Then
               b\winkel=b\winkel+180
               
               For i=0 To 31
                  b\x=b\x+Cos(b\winkel)*1
                  b\y=b\y+Sin(b\winkel)*1
               Next
               
               b\winkel=b\winkel-180
               
            EndIf
            
            If b\nummer>=mn Then
               
               For i=0 To 31
                  b\x=b\x+Cos(b\winkel)*1
                  b\y=b\y+Sin(b\winkel)*1
               Next
               
            EndIf
            
            
         Next
      Next
      
      koll=0
      create_ball(mx,my,mf)
   EndIf
   
   
End Function


Habt ihr ne Idee, wie ich das besser machen kann?

mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

SpionAtom

BeitragDo, März 06, 2008 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein geometrischer Ansatz ist nach längerer Betrachtung wohl doch nicht das Wahre. Gerade an Ecken und Kreuzungen gibts Überschneidungen, die ich nicht überprüfe, deswegen da besser nicht splitten...
Code: [AUSKLAPPEN]
Graphics 1024, 768, 0, 2
SetBuffer BackBuffer()
   
   Const maxwegpunkte = 5, maxkugeln = 50, maxkugelspeed = 3
   Dim wegpunkt#(maxwegpunkte - 1, 2)   
   Global kugeln = 0, kugelspeed = 8, gewaehlteKugel = -1, mouse_x, mouse_y, debug
   Dim kugel(maxkugeln - 1, 7) ;0-xpos 1-ypos 2-radius 3-wegpunktstart 4-direktion 5-winkel 6-strecke
   
   ;----------------;
   ;Wegpunkte setzen;
   ;----------------;   
   wp = 0
   Repeat   
      mouse_x = MouseX()
      mouse_y = MouseY()
   
      If MouseHit(1)
         FlushMouse()
         wegpunkt(wp, 0) = mouse_x
         wegpunkt(wp, 1) = mouse_y
         wp = wp + 1
      End If
      
      Cls
      For i = 0 To wp - 1
         If i > 0 Then Color 50, 50, 50: Line wegpunkt(i - 1, 0), wegpunkt(i - 1, 1), wegpunkt(i, 0), wegpunkt(i, 1)
         Color 50, 50, 50: Oval wegpunkt(i, 0) - 10, wegpunkt(i, 1) - 10, 20, 20, 0:   Text wegpunkt(i, 0) - 4, wegpunkt(i, 1) - 8, i
      Next
      
      Color 255, 255, 255
      Text 0, 0, "Setzen Sie " + maxwegpunkte + " Wegpunkte, indem Sie wild im Fenster um sich klicken"
      Flip()   
   
   Until KeyDown(1) Or wp = maxwegpunkte

   ;-------------------;
   ;erste Kugeln setzen;
   ;-------------------;   
   ;0-xpos 1-ypos 2-radius 3-wegpunktstart 4-direktion 5-winkel 6-strecke
   kugeln = 15
   For i = 0 To kugeln - 1
      kugel(i, 0) = wegpunkt(0, 0)
      kugel(i, 1) = wegpunkt(0, 1)
      kugel(i, 2) = Rand(3, 6) * 3
      kugel(i, 3) = 0
      kugel(i, 4) = 1
      kugel(i, 5) = Winkel#(wegpunkt(0, 0), wegpunkt(0, 1), wegpunkt(1, 0), wegpunkt(1, 1))
      If i = 0 Then kugel(i, 6) = 0 Else kugel(i, 6) = kugel(i - 1, 6) + kugel(i - 1, 2) + kugel(i, 2)
   Next


   ;-------------;
   ;Hauptschleife;
   ;-------------;
   Repeat
   
      mouse_x = MouseX()
      mouse_y = MouseY()
   
      If KeyDown(57) Then kugelspeed = 1 Else kugelspeed = maxkugelspeed
      If KeyHit(59) Then debug = 1 - debug
      If MouseHit(1) Then
         FlushMouse()
         If gewaehlteKugel >= 0 And gewaehlteKugel <= kugeln - 1 Then splitteKugeln(gewaehlteKugel)
      End If
            
      kugelnUpdate()

      Cls
      For i = 0 To wp - 1
         If i > 0 Then Color 50, 50, 50: Line wegpunkt(i - 1, 0), wegpunkt(i - 1, 1), wegpunkt(i, 0), wegpunkt(i, 1)
         Color 50, 50, 50: Oval wegpunkt(i, 0) - 10, wegpunkt(i, 1) - 10, 20, 20, 0:   Text wegpunkt(i, 0) - 4, wegpunkt(i, 1) - 8, i
      Next      
      Color 50, 50, 50: Line wegpunkt(maxwegpunkte - 1, 0), wegpunkt(maxwegpunkte - 1, 1), wegpunkt(0, 0), wegpunkt(0, 1)      
      kugelnZeichnen()
      
      Color 255, 255, 255
      Text 0, 0, "Drücken Sie die Leertaste, um die Kugeln zu verlangsamen."
      Text 0, 16, "Klicken Sie auf eine Kugeln, um die Schlange zu teilen "
      Text 0, 32, "Zeige Splitvorgang [F1] " + debug
      Flip()      
   
   
   Until KeyDown(1)
   End
   

Function splitteKugeln(split)
   ;0-xpos 1-ypos 2-radius 3-wegpunktstart 4-direktion 5-winkel 6-strecke
   i = split
   px# = kugel(i, 0)
   py# = kugel(i, 1)

   zp = kugel(i, 3)
   sp = kugel(i, 3) + kugel(i, 4)
      If sp > maxwegpunkte - 1 Then sp = 0 Else If sp < 0 Then sp = maxwegpunkte - 1
   w# = Winkel(wegpunkt(sp, 0), wegpunkt(sp, 1), wegpunkt(zp, 0), wegpunkt(zp, 1))
   d# = Distanz(wegpunkt(sp, 0), wegpunkt(sp, 1), wegpunkt(zp, 0), wegpunkt(zp, 1))
   s# = Distanz(wegpunkt(sp, 0), wegpunkt(sp, 1), px, py)
   
   Repeat
      get = getKugel(px, py)
      
      If get >= 0 Then
      
         If get <> i Then
            i = get
            ;direktion umdreken: Start, direktion, Winkel, Strecke
            kugel(i, 4) = -1 * kugel(i, 4)
            nzp = kugel(i, 3)
            nsp = kugel(i, 3) - kugel(i, 4)
               If nsp > maxwegpunkte - 1 Then nsp = 0 Else If nsp < 0 Then nsp = maxwegpunkte - 1
            kugel(i, 3) = nsp
            kugel(i, 5) = Winkel(wegpunkt(nsp, 0), wegpunkt(nsp, 1), wegpunkt(nzp, 0), wegpunkt(nzp, 1))            
            kugel(i, 6) = Distanz(wegpunkt(nsp, 0), wegpunkt(nsp, 1), kugel(i, 0), kugel(i, 1))
            If debug Then
               Color 100, 200, 255: Oval kugel(i, 0) - 5, kugel(i, 1) - 5, 10, 10
               Flip()
            End If
         End If

         px = wegpunkt(sp, 0) - Sin(w) * s
         py = wegpunkt(sp, 1) - Cos(w) * s
         s = s + 1

         If s >= d Then
            sp = zp
            zp = zp + kugel(i, 4)
               If zp > maxwegpunkte - 1 Then zp = 0 Else If zp < 0 Then zp = maxwegpunkte - 1
            w = Winkel(wegpunkt(sp, 0), wegpunkt(sp, 1), wegpunkt(zp, 0), wegpunkt(zp, 1))
            d = Distanz(wegpunkt(sp, 0), wegpunkt(sp, 1), wegpunkt(zp, 0), wegpunkt(zp, 1))
            s = 0
         End If         

      End If
      
      If debug Then
         Color 0, 0, 0: Rect 0, 50, 100, 16
         Color Rand(100, 255), 0, 0:   Text 0, 50, Int(px) + "," + Int(py)
         Oval px - 2, py - 2, 4, 4
         Flip()
      End If
   
   Until get = -1


End Function

Function getKugel(x, y)

   toleranz = 3
   For i = 0 To kugeln - 1
      If Distanz(kugel(i, 0), kugel(i, 1), x, y) <= (kugel(i, 2) + toleranz) Then Return i
   Next
   Return -1      

End Function


Function kugelnUpdate()
   ;0-xpos 1-ypos 2-radius 3-wegpunktstart 4-direktion 5-winkel 6-strecke
   gewaehlteKugel = -1
   
   For i = 0 To kugeln - 1
      
      For speedsteps = 1 To kugelspeed
         kugel(i, 0) = wegpunkt(kugel(i, 3), 0) - Sin(kugel(i, 5)) * kugel(i, 6)
         kugel(i, 1) = wegpunkt(kugel(i, 3), 1) - Cos(kugel(i, 5)) * kugel(i, 6)         
         kugel(i, 6) = kugel(i, 6) + 1         
         sp = kugel(i, 3)
         zp = sp + kugel(i, 4)         
            If zp < 0 Then zp = maxwegpunkte - 1 Else If zp > maxwegpunkte - 1 Then zp = 0
         If kugel(i, 6) >= Distanz(wegpunkt(sp, 0), wegpunkt(sp, 1), wegpunkt(zp, 0), wegpunkt(zp, 1)) Then               
            kugel(i, 3) = zp
            zp = zp + kugel(i, 4)
               If zp < 0 Then zp = maxwegpunkte - 1 Else If zp > maxwegpunkte - 1 Then zp = 0
            kugel(i, 5) = Winkel#(wegpunkt(kugel(i, 3), 0), wegpunkt(kugel(i, 3), 1), wegpunkt(zp, 0), wegpunkt(zp, 1))
            kugel(i, 6) = 0
         End If
      Next
      
      If Distanz(kugel(i, 0), kugel(i, 1), mouse_x, mouse_y) <= kugel(i, 2) Then gewaehlteKugel = i
    Next

End Function


Function kugelnZeichnen()

   For i = 0 To kugeln
      If i = gewaehlteKugel Then Color 100, 200, 255 Else Color 200, 200, 200
      Oval kugel(i, 0) - kugel(i, 2), kugel(i, 1) - kugel(i, 2), 2 * kugel(i, 2), 2 * kugel(i, 2), 1
   Next

End Function


   
;Berechnet den Winkel zwischen der X-Achse und einer Geraden durch zwei Punkte
Function Winkel#(x1#,y1#,x2#,y2#)
   Return (360+ATan2(x1#-x2#,y1#-y2#)) Mod 360
End Function

;Berechnet den Abstand zwischen zwei Punkten
Function Distanz#(x1#, y1#, x2#, y2#)
   Return Sqr((x1-x2)^2 + (y1-y2)^2)
End Function



Btw. hast du sowas vor? Luxor
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group