welche bälle nach vorne bezw. hinten bewegen?
Übersicht

![]() |
mas93Betreff: welche bälle nach vorne bezw. hinten bewegen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Leute,
Ich arbeite gerade an einem kleinen zwischenprojekt und hab folgendes Problem. Stellt euch folgende Situation vor: 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group