![]() |
Pong Ball
Hallo,
Wir müssen für die Schule das Spiel Pong programmieren. Bis jetzt hab ich die Schläger Links und Rechts programmiert die ich mit Maus und Tastatur steuern kann. Mein Ball bewegt sich ebenfalls schon, doch nur von Rechts nach Links, er prallt ebenfalls schon von den Schlägern ab und wenn man den Ball nicht mit dem Schläger abfängt fliegt er aus dem Spielfeld und der Gegner bekommt ein Punkt. So jetzt zu meine Frage: Wie mach ich das, dass der Ball nicht nur Horizontal fliegt sondern wie in dem gewöhnlichem Pong Spiel wenn er den Schläger berührt, sich um z.b 30 Grad dreht und dann in diese Richtung weiter fliegt und dann z.b am Rand abprallt und sich dann wiederrum um z.b 5 Grad verändern. Ich hoffe ihr wisst damit was ich meine da ich nicht genau weiß wie ich dies erklären soll. sorry. Paar Daten zum meinem Programm: Beide Schläger sind Paneln Der Ball ist ebenfalls ein Panel. Ich hoffe ihr könnt mir schon bald helfen. Schonmal vielen Dank im voraus. MFG Chris92 .A |
Re: Pong Ball
gib mal ein bisschen code
kann mir im moment nicht vorstellen wie du das gemacht hast... lg fishly |
Re: Pong Ball
Ok hier ist mein Code hoffe das Hilft weiter
unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TfrmPong = class(TForm) tmBall: TTimer; pnlLeft: TPanel; pnlBall: TPanel; pnlLine: TPanel; lblLeftPoint: TLabel; lblRightPoint: TLabel; pnlRight: TPanel; procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure FormClick(Sender: TObject); procedure tmBallTimer(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmPong: TfrmPong; var VERS_DROITE,UPPART,LOWPART:Boolean; implementation {$R *.DFM} procedure TfrmPong.FormKeyPress(Sender: TObject; var Key: Char); begin if (Key = 'w') and (pnlLeft.Top-15 >= 0) then pnlLeft.Top := pnlLeft.Top - 15; if (Key = 's') and (pnlLeft.Top+15 <= 512 ) then pnlLeft.Top := pnlLeft.Top + 15; end; procedure TfrmPong.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (pnlRight.Top >= 5) and (pnlRight.Top+190 <= frmPong.ClientHeight) then pnlRight.Top:=Y-10; end; procedure TfrmPong.FormCreate(Sender: TObject); begin VERS_DROITE:=true; pnlBall.left := 500; pnlBall.Top := 349; LOWPART := False; UPPART := True; frmPong.AutoSize := True; end; procedure TfrmPong.FormClick(Sender: TObject); begin tmBall.Enabled := True; frmPong.ClientHeight := 650; frmpong.ClientWidth := 1000; pnlLine.Left := 500; pnlLine.Height := 650; pnlLeft.Left := 0; pnlright.Left := 1000; end; procedure TfrmPong.tmBallTimer(Sender: TObject); begin if VERS_DROITE then begin if (pnlBall.Left+pnlBall.Width+5 < pnlRight.Left) then pnlBall.left := pnlBall.left + 5 else if (pnlBall.Top >= pnlRight.Top) and (pnlBall.Top <= pnlRight.Top+185) then VERS_DROITE:=false else begin pnlBall.left := 500; pnlBall.Top := 349; tmBall.Enabled := false; lblLeftPoint.Caption := inttostr(strtoint(lblLeftPoint.Caption)+1); end else if (pnlBall.Left-5 > pnlLeft.Left+25) then pnlBall.Left:=pnlBall.Left-5 else if (pnlBall.Top >= pnlLeft.Top) and (pnlBall.Top <= pnlLeft.Top+185) then VERS_DROITE:=true else begin pnlBall.Left := 500; pnlBall.Top := 349; tmBall.Enabled := False; lblRightPoint.Caption := inttostr(strtoint(lblRightPoint.Caption)+1); end; end; if lblLeftPoint.Caption = '10' then begin showmessage('Player 1 hat gewonnen'); lblLeftPoint.caption := '0'; end else if lblRightPoint.Caption = '10' then begin showmessage('Player 2 hat gewonnen'); lblLeftPoint.caption := '0'; end; end; end. |
Re: Pong Ball
Nett wäre noch, wenn du den Code markierst und mit dem
Button "Delphi-Code" bemachst. Das macht das Ganze lesbarer. |
Re: Pong Ball
Ok danke hab ich erledigt.
Delphi-Quellcode:
unit Unit2;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TfrmPong = class(TForm) tmBall: TTimer; pnlLeft: TPanel; pnlBall: TPanel; pnlLine: TPanel; lblLeftPoint: TLabel; lblRightPoint: TLabel; pnlRight: TPanel; procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure FormClick(Sender: TObject); procedure tmBallTimer(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmPong: TfrmPong; var VERS_DROITE,UPPART,LOWPART:Boolean; implementation {$R *.DFM} procedure TfrmPong.FormKeyPress(Sender: TObject; var Key: Char); begin if (Key = 'w') and (pnlLeft.Top-15 >= 0) then pnlLeft.Top := pnlLeft.Top - 15; if (Key = 's') and (pnlLeft.Top+15 <= 512 ) then pnlLeft.Top := pnlLeft.Top + 15; end; procedure TfrmPong.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (pnlRight.Top >= 5) and (pnlRight.Top+190 <= frmPong.ClientHeight) then pnlRight.Top:=Y-10; end; procedure TfrmPong.FormCreate(Sender: TObject); begin VERS_DROITE:=true; pnlBall.left := 500; pnlBall.Top := 349; LOWPART := False; UPPART := True; frmPong.AutoSize := True; end; procedure TfrmPong.FormClick(Sender: TObject); begin tmBall.Enabled := True; frmPong.ClientHeight := 650; frmpong.ClientWidth := 1000; pnlLine.Left := 500; pnlLine.Height := 650; pnlLeft.Left := 0; pnlright.Left := 1000; end; procedure TfrmPong.tmBallTimer(Sender: TObject); begin if VERS_DROITE then begin if (pnlBall.Left+pnlBall.Width+5 < pnlRight.Left) then pnlBall.left := pnlBall.left + 5 else if (pnlBall.Top >= pnlRight.Top) and (pnlBall.Top <= pnlRight.Top+185) then VERS_DROITE:=false else begin pnlBall.left := 500; pnlBall.Top := 349; tmBall.Enabled := false; lblLeftPoint.Caption := inttostr(strtoint(lblLeftPoint.Caption)+1); end else if (pnlBall.Left-5 > pnlLeft.Left+25) then pnlBall.Left:=pnlBall.Left-5 else if (pnlBall.Top >= pnlLeft.Top) and (pnlBall.Top <= pnlLeft.Top+185) then VERS_DROITE:=true else begin pnlBall.Left := 500; pnlBall.Top := 349; tmBall.Enabled := False; lblRightPoint.Caption := inttostr(strtoint(lblRightPoint.Caption)+1); end; end; if lblLeftPoint.Caption = '10' then begin showmessage('Player 1 hat gewonnen'); lblLeftPoint.caption := '0'; end else if lblRightPoint.Caption = '10' then begin showmessage('Player 2 hat gewonnen'); lblLeftPoint.caption := '0'; end; end; end. |
Re: Pong Ball
Ich sage nur Einfallwinkel=Ausfallwinkel
|
Re: Pong Ball
Ok und wie berrechne ich den Einfallwinkel?
|
Re: Pong Ball
Wie wärs, wenn du dich mal an den
![]() Dann könnten wir deinen Code auch schneller überblicken und könnten dir leichter helfen. Edit: Link ergänzt. |
Re: Pong Ball
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 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