![]() |
ballbewegung in breakout spiel
hallo leute =)
ich bin gerade dabei mich an einem breakout-clon zu versuchen. dazu hab ich mir mal die tutorials zu andorra 2d angeschaut. nun bin ich soweit, dass ich ein spielfeld und einen schieber hab, den man auch schon bewegen kann. wie der ball sich im prinzip bewegt weiss ich, kenn ich ja vom schieber her. mein problem ist, dass ich das mit den kollisionen und der flugbahn nicht so ganz hinbekomme.. mir fehlt da irgentwie der ansatz und ich weiss so gar nicht wie man das realisieren könnte. es wäre toll wenn mir das mal jemand kurz, stichwortartig erklären könnte oder wenigstens ein paar stichwörter für google nennen könnte. ein beispiel wäre natürlich am besten :D gruß |
Re: ballbewegung in breakout spiel
Schau doch mal in den Demos zu Andorra 2D - da ist ein kleines Breakoutspiel dabei. Auch wenn dieses noch etwas verbesserungswürdig ist.
|
Re: ballbewegung in breakout spiel
Hi,
wenn ich es mir mal so überlege, ist der Balken ähnlich wie ein Pong-Balken. Daher kann ich dir mal gerade einen uralten Codeausschnitt meines Pong-Klons geben:
Delphi-Quellcode:
procedure TfrmMain.tTimer(Sender: TObject);
var Toleranz : Integer; begin Toleranz := Ball.Width div 2; // KI-Aktivierung KI; // Vereinbarungen Ball.Left := Ball.Left + XSpeed; Ball.Top := Ball.Top + YSpeed; // Ballkollision if (Abs(Ball.Left - Enemy.Left) <= 5) and (Abs(Ball.Top - Enemy.Top) <= 5) then XSpeed := -XSpeed; if (Ball.Top > Player1.Top -1-Toleranz) and (Ball.Top < Player1.Top + Player1.Height +1+Toleranz) and (Ball.Left = Player1.Left+Player1.width) then XSpeed := -XSpeed; // Kollisionserkennung if Ball.Left < 0 then begin t.Enabled := False; Ball.Visible := False; go_p2; end; end; |
Re: ballbewegung in breakout spiel
Das könntest du auch erstmal so lösen:
du hast zwei Boolean Variablen: z.b. links und Oben. bei einer Kollision vertauscht du diese. Beim zeichnen des Balles musst du natürlich dann aufpassen z.b
Delphi-Quellcode:
Es gibt zwar bessere Möglichkeiten, aber davon kenne ich noch keine. Ich meine sogar bei einer Delphi Version war mal so ein Pong als Beispiel dabei....
if links then
Ball.x-1 else ball.x+1 if Oben then ball.y-1 else ball.y+1 Und hier im Forum meine ich auch in der Code-Lib |
Re: ballbewegung in breakout spiel
Die grundlegende Variante ist "Einfallswinkel gleich Ausfallswinkel", sprich wenn der Ball auf den Schläger trifft, kehrt sich seine Bewegung in Richtung des Schlägers um. Ein Codebeispiel für diese Variante gibts weiter oben schon, dort wird mit zwei Variablen die Bewegung hoch/runter und links/rechts separat verarbeitet.
Die fortgeschrittenere Variante wäre dass sich der Ausfallswinkel ändert, je nachdem wo der Ball auf den Schläger trifft. In der Mitte bleibt alles wie gehabt, trifft der Ball jedoch auf die Aussenbereiche des Schlägers, bekommt er einen seitlichen Drall. Kann man sich als elastischen Aufprall vorstellen: Der Ball verformt sich beim Aufprall auf den Schläger, wenn er dabei über den Rand des Schlägers hinausragt, bewirkt das einen Drehimpuls zur Seite und der Ausfallwinkel wird flacher/steiler (je nach Richtung aus der der Ball kam und auf welche Kante er prallte) als der Einfallswinkel. |
Re: ballbewegung in breakout spiel
Könntest du mal zur "fortgeschrittenere Variante" ein kleines beispiel machen ?
Bisher habe ich immer nur die einfache Variante gekannt und auch umgesetzt. |
Re: ballbewegung in breakout spiel
Erinner mich bitte Mitte nächster Woche nochmal daran, ich schwitze gerade an einem Abgabetermin und hab deswegen wenig Zeit. :(
|
Re: ballbewegung in breakout spiel
Vielen Dank erstmal.... werde ich machen.
Dann viel glück das du es noch rechtzeitig schaffst. Das Beispiel muss ja nicht groß sein, nur ein kleines *G* |
Re: ballbewegung in breakout spiel
man könnte einfach die geschwindigkeit den schlägers zu der des ballles addieren (Vektoren).
zur Bewegung: ![]() |
Re: ballbewegung in breakout spiel
Das mit den Vektoren habe ich bis heute noch nicht verstanden:
Sind das einfache TPoints ? z.b. in den die Richtung drin steht ? z.b. TPoint.x:=4 TPoint.y:=5 ? Und jetzt müsste ich nur noch meine Object Position + dem TPoint machen ? und wenn da ein - drin steht macht er das trotzdem ? z.b. wenn der Ball nach Links fliegen soll. Evlt. sind das auch zu große werte die ich als beispiel genommen habe. Sollte ich bei einem BreakOut Clone kleinere Werte nehmen ? z.b. 0.4 oder so ? Damit es eine leichte Abweichung gibt ? Aber ich frage mich da wie man die dann Vertauschen könnte. (Zum Thema habe ich mir aber schon einige Tutorials angesehen) |
Re: ballbewegung in breakout spiel
du solltest garkeine festen werte nehmen sondern timebased movement. Also was addiert wird ist von der vergangenen Zeit und einer festgelegten Geschwindigkeit abhängig. Nur die Richtung ist fest. In dem verlinkten Artikel ist das gut beschrieben.
Beispiel:
Delphi-Quellcode:
PosX: double;
PosY: double; speedX: double; speedY: double; newPosX:=speedX * vergangene_Zeit + alte_PosX; newPosY:=speedY * vergangene_Zeit + alte_PosY; der Speed Vektor gibt die richtung vor und der Betrag(also länge des Vektor) die Geschwindigkeit . |
Re: ballbewegung in breakout spiel
Ich habe das jetzt bei mir so gelöst:
Delphi-Quellcode:
Dieser Code wird in einem Timer ausgeführt. Darum habe ich eine zeitschleife verwendet.
var
px,py:Integer; begin if BallMove then begin if b_t +1 >=20 then begin b_t:=0; if Hori = cLeft then px:=Ball.Left-p_Hori.x else px:=Ball.Left+p_Hori.x; if Verti = cDown then py:=Ball.top+P_Verti.y else py:=Ball.top-P_Verti.y; if Engine.SpriteManger.N_Collision(px,py,ball,false,false) <> NIL then begin Hori:=not Hori; Verti:=not Verti; P_Verti:=Point(0,random(10)+1); p_Hori:=Point(random(10)+1,0); if Hori = cLeft then px:=Ball.Left-p_Hori.x else px:=Ball.Left+p_Hori.x; if Verti = cDown then py:=Ball.top+P_Verti.y else py:=Ball.top-P_Verti.y; end; ball.Left:=px; ball.Top:=py; ball.DrawSprite; end else inc(b_t); end; Das Prinzip klappt eigentlich recht gut. Es sind Integer zahlen. Das reicht. Der ball fliegt jetzt nicht mehr vorhersehbar. Bei allen anderen BreakOut Varianten die ich erstellt habe, flog der ball eigentlich immer vorhersehbar p_Hori. und p_Verti sind im Moment TPoints, aber ich glaube das ändere ich noch in Integer. (Ich nutzte meine eigene Engine, hier und nicht die Andorra) |
Re: ballbewegung in breakout spiel
Zitat:
Du solltest wirklich mal timebased movement versuchen. btw.: vermutlich eignen sich hier Polarkoordinaten bessere als die Kartesischen. Damit wäre die Berechnung Ausfallswinkel=Einfallswinkel leichter. |
Re: ballbewegung in breakout spiel
Damit sich der Ball von alle bewegt nutzte ich ein Timer. Dieser steht bei mir auf 3 MS.
Damit der Ball nicht zu schnell fliegt verwende ich eine "Zeitschleife" so nenne ich das, damit der ball nur noch alle 20 MS(?) aufgerufen wird. In dieser Procedure könnte ich aber noch andere sachen machen z.b. eine Zeit anzeige. Damit kann ich nicht beim Timer nicht pauschal sagen rufe das Event alle 20ms(?) auf. Zitat:
z.b. kann ich eine Standard Geschwindigkeit angeben ? Zitat:
Damit habe ich noch keine Erfahrung. Ich bin froh das es so eigentlich ganz gut läuft. Abgesehen von den ecken, wo der ball lieben gerne eine weile verweilt *G* |
Re: ballbewegung in breakout spiel
danke für eure hilfe.. das sollte allemal reichen =D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz