![]() |
PingPong
Liste der Anhänge anzeigen (Anzahl: 2)
Ich weiss das es dieses Thema schon oft genug hier gab habe aber auf meine Frage keine Antwort mit Hilfe der Suchfunktion gefunden! Ich in jetzt soweit das der Ball hin und her fliegt und an den Wänden abprallt, aber ich bekomm es nicht hin das er an dem Paddel abprallt :( Kann mir da einer helfen? Habe als Paddel nen Button verwendet!
Würd auch noch gerne wissen wie man es anstellt das man an zb für den Ball nen eigenes Bild verwenden kann!
Delphi-Quellcode:
private Ball: TBitmap; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; posx,posy,geschwx,geschwy,breite,hoehe:integer; implementation {$R *.DFM} procedure TForm1.Timer1Timer(Sender: TObject); begin repaint; breite:=clientwidth; hoehe:=clientheight; //Ball Canvas.Draw(posx+40,posy+40, Ball); //Bewegung posx:= posx + geschwx; posy:= posy + geschwy; //Gegner if posy > button2.Top then button2.Top := button2.Top+4; if posy < button2.Top then button2.Top := button2.Top-4; //Abprallen Y-Achse if posy >= hoehe-60 then geschwy:= - geschwy ; if posy <= -40 then geschwy:= - geschwy ; //Abprallen X-Achse if posx <= -50 then begin timer1.enabled:= false; showmessage('Game Over'); end; if posx >= breite-40 then begin timer1.enabled:= false; showmessage('Gewonnen'); end; //Abprallen player1 und 2 if (posx > (button2.left-30 ) + Button2.Width -40 ) or (posx < Button1.Left + Button1.Width - 40) then begin if (posy < Button1.Top + Button1.Height ) and (posy > Button1.Top ) or (posy < Button2.Top + Button2.Height -50 ) and (posy > Button2.Top - 70 ) then geschwx := - geschwx ; end; end; procedure TForm1.FormCreate(Sender: TObject); begin //festgelegte Geschwindigkeit geschwx:=0; geschwy:=0; //Ball Grafik Ball := TBitmap.Create; Ball.LoadFromFile('Ball.bmp'); end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin //Paddel Bewegung button1.top:= y ; end; // SPielbeginn per SPace procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if getasynckeystate (vk_space) <> 0 then begin label1.visible:=false; geschwx:=4; geschwy:=4; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(Ball); end; procedure TForm1.Beenden1Click(Sender: TObject); begin close end; |
Re: PingPong
ich hab mir den anhang jetzt nicht angeschaut, aber such mal nach nem opengl tutorial von MrT im Forum und schreib das ganze in opengl wäre mein tip...
|
Re: PingPong
Mein (gegen)Tip: Bleib beim Canvas, ist definitiv einfacher und verständlicher für den Anfang. (Danach kann mans immer noch auf OGL oder DX ausweiten)
Zu deinem Problem: betrachten wir folgende Zeile genauer:
Delphi-Quellcode:
du fragst einfach ab, ob er auf der linken seite abprallt.
if posx <= -50 then geschwx:= - geschwx ;
dabei darf er nicht ganz an der seite abprallen, sondern auf höhe des buttons, und auf dessen x-koordinate also:
Delphi-Quellcode:
if posx <= Button1.Left + Button1.Width - 50 then
begin //Also wenn er rechts da irgendwo anstößt if (posy > Button1.Top) and (posy < Button1.Top + Button1.Height) then //Wenn der ball auch noch auf der richtigen höhe is geschwx := - geschwx else //Game over, der ball is im aus end; Um ein eigenes Bild für den Ball verwenden zu können, kannst du dir evt. mal ![]() |
Re: PingPong
Nach etwas Einarbeiten mit TBitmap am besten nur noch auf Bitmaps zeichnen und diese im OnPaint in die Paintbox kopieren, dann ist der Sprung zur
![]() |
ok! das klappt jetzt alles soweit...danke schonmal!
aber mit dem Tbitmap versteht ich irgendwie nicht :/ Kann mir einer evtl. nen Beispiel Code oder ein schon fertiges Programm zeigen wo das benutzt wird? Also nochma :) Ich möchte gern meine eigenen Grafiken mit in das Spiel einbringen! |
Re: PingPong
Also als die Nachfrage nach Code kam, war ich kurz davor dieses Post nicht zu tätigen. Es ist nicht gut Lösungen an Hand fertiger Programme zu suchen. Nur wenn man es sich selbst erarbeitet hat, kann man vernünftig darauf aufbauen. Allerdings hat bei uns zufällig das Mitglied "red" ein Pong-Clone mit Source Code eingereicht. Basierend auf OpenGL und in einem witzigen Stil.
![]() |
Re: PingPong
@Phobeus: ich denke auch, dass OpenGL für den Anfang etwas "overpowered" ist.
@NoRiX: Die TBitmap-Variable muss zuerst einmal global (am besten im private-Teil der Form) deklariert sein, da wir sie ja nicht nur in einer Funktion brauchen:
Delphi-Quellcode:
Da TBitmap keine Komponente ist, müssen wir die Instanz selbst erstellen und wieder freigeben. Im OnCreate laden wir gleichzeitig noch das Bild.
type
TForm1 = ... private Bit: TBitmap;
Delphi-Quellcode:
Wenn du ein JPEG laden willst, musst du nur die JPEG-Unit in die uses-Klausel einfügen, für PNG gibt es das
// OnCreate
Bit := TBitmap.Create; Bit.LoadFromFile('Ball.bmp'); // OnDestroy FreeAndNil(Bit); ![]() Nun musst du im OnTimer statt dem Code für die Ellipse folgenden einfügen:
Delphi-Quellcode:
Canvas.Draw(0, 0, Bit);
|
Re: PingPong
Hi,
OpenGl ist dfür viel zu aufwendig, wenn du hiermit etwas anfangen kannst:
Delphi-Quellcode:
Such dir was du brauchst einfach raus.
var
Form1: TForm1; xspeed: Integer=1; yspeed: Integer=1; bdirection: byte; { ... } procedure TForm1.ki; var schritt: integer; begin schritt := 2; if ball.Top > enemy.Top then enemy.Top := enemy.Top+schritt; if ball.Top < enemy.Top then enemy.Top := enemy.Top-schritt; end; procedure TForm1.go_p1; begin showmessage(Edit1.text+' '+'gewinnt'); end; procedure TForm1.go_p2; begin showmessage(Edit2.text+' '+'gewinnt'); end; procedure TForm1.tTimer(Sender: TObject); var toleranz : integer; // umgebung um den balken herum in pixeln 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; //Ballkollisions Ton if (Abs(ball.Left - enemy.left) <= 5) and (Abs(ball.Top - enemy.Top) <= 5) then mp1; if (ball.top > player1.top -1-toleranz) and (ball.top < player1.top + player1.height +1+toleranz) and (ball.left = player1.left+player1.width) then mp1; //Kollisionserkennung if ball.Left<0 then begin t.Enabled:= false; ball.Visible:= false; go_p2; end; if ball.Left>345 then begin t.Enabled:= false; ball.Visible:= false; go_p1; end; if ball.Left<0 then xspeed := -xspeed; if ball.Top<0 then yspeed := -yspeed; if ball.Left>346 then xspeed := -xspeed; if ball.Top>346 then yspeed := -yspeed; end; Du musst aufpassen, dass width und height angepasst [schritt := 2] ist. |
Re: PingPong
Zitat:
:roll: |
Re: PingPong
Es läuft aber :wink:
Der Rest vom Code besteht nur aus der Hauptmenüprogrammierung :wink: |
Re: PingPong
Nagut, aber bei so etwas verliert man doch den Überblick :wink: :
Delphi-Quellcode:
Wie wäre es mit
//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; //Ballkollisions Ton if (Abs(ball.Left - enemy.left) <= 5) and (Abs(ball.Top - enemy.Top) <= 5) then mp1; if (ball.top > player1.top -1-toleranz) and (ball.top < player1.top + player1.height +1+toleranz) and (ball.left = player1.left+player1.width) then mp1;
Delphi-Quellcode:
:wink: ?
if (Abs(ball.Left - enemy.left) <= 5) and (Abs(ball.Top - enemy.Top) <= 5)
or (ball.top > player1.top - 1 - toleranz) and (ball.top < player1.top + player1.height + 1 + toleranz) and (ball.left = player1.left + player1.width) then begin xspeed := -xspeed; mp1; end; Und was ist überhaupt "enemy" und "ball" ? Doch hoffentlich keine TImages :shock: ? |
Re: PingPong
Panels.
|
Re: PingPong
Naja :wink: .
|
Danke für eure schnellen Antworten! Werd mir jetzt ma alles reinziehen und mal nen bisschen was ausprobieren!
Wenn ich es geschafft habe lad ich ma ne neue version hoch :) Danke nochma an alle! |
Es klappt jetzt alles bis auf das Abprallen von Player 1 und 2!
Ich komm mit der if abfrage immer durcheinander! Im Moment sieht es so aus das es bei Player 2 alles klappt aber bei Player 1 prallt der an der ganzen Seite ab! Auch da wo das Paddel nich ist! Bei player 2 scheint es aber zu klappen! :( SChaff es nicht das Problem zu lösen! Ich hab nochma die .exe datei und den Quellcode neu hochgeladen! |
Re: PingPong
Schau dir doch noch einmal die Codestelle an:
Delphi-Quellcode:
Du vergleichst hier beide Seiten zugleich, was nicht gut gehen kann, es reicht zum Abprallen schon, wenn nur einer der Schläger auf der richtigen Höhe ist. Und das ist der gegnerische ja immer.
//Abprallen player1 und 2
if (posx > (button2.left-30 ) + Button2.Width -40 ) or (posx < Button1.Left + Button1.Width - 40) then begin if (posy < Button1.Top + Button1.Height ) and (posy > Button1.Top ) or (posy < Button2.Top + Button2.Height -50 ) and (posy > Button2.Top - 70 ) then geschwx := - geschwx ; end; end; |
Re: PingPong
Ähm... wieso soll das mit OpenGL "overpowered" sein. Bei einem Pong-Spiel besteht dies zu 90% aus "Spiellogik" und max 10% aus Darstellung. Wenn man dies nicht gleich zu beginn klar voneinander unterscheiden kann, sollte man sich lieber niemals an etwas größeres heranwagen. Von der Funktionalität sollte man daher eigentlich alles anfinden, was man braucht. but.. it's just my six cent.
|
Re: PingPong
Zitat:
|
Hi!
Ich bekomm das einfach nicht hin mit dem Abprallen von Player 1 und 2 Wenns bei dem einen klappt, dann klappts bei dem anderen nicht! es ist zum heulen! Gebt mir ma Hilfe aber nicht den fertigen Code! Hätte noch ne Frage :) Wie bringt man Hintergrund Musik ins Spiel oder Sound beim Aufprall des Balles! |
Re: PingPong
Hab da ma ne zusatzfrage...^^
habe das prog jetz so ziemlich fertig und als ball benutze ich ein ganz ordinäres image... das dumme is nur, dass ich immer den schwarzen rand um den weißen ball habe!!! hab schon mit photoshop und sonst welchen convertern rumgespielt komm aber zu nix richtigem... nun die frage: wie bekomme ich den schwarzen rand umd den weißen ball bei meiner bmp datei wech?!?!?! ich weiß bezieht sich nich direkt auf delphi... aber das sieht einfach doof aus...^^ also schreibt mir doch bitte nen vorschlag!! :pale: :coder2: ach und naja sounds...viell mit dem delphi eigenen mediaplayer...zu finden unter der registerkarte system ;o) :dancer2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 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 by Thomas Breitkreuz