![]() |
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: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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