Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Pong Ball (https://www.delphipraxis.net/151480-pong-ball.html)

Chris92 .A 19. Mai 2010 17:22


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

fishly 19. Mai 2010 17:28

Re: Pong Ball
 
gib mal ein bisschen code
kann mir im moment nicht vorstellen wie du das gemacht hast...

lg fishly

Chris92 .A 19. Mai 2010 17:51

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.

Wolfgang Mix 19. Mai 2010 18:00

Re: Pong Ball
 
Nett wäre noch, wenn du den Code markierst und mit dem
Button "Delphi-Code" bemachst. Das macht das Ganze lesbarer.

Chris92 .A 19. Mai 2010 18:02

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.

Teekeks 19. Mai 2010 18:58

Re: Pong Ball
 
Ich sage nur Einfallwinkel=Ausfallwinkel

Chris92 .A 19. Mai 2010 18:59

Re: Pong Ball
 
Ok und wie berrechne ich den Einfallwinkel?

implementation 19. Mai 2010 19:03

Re: Pong Ball
 
Wie wärs, wenn du dich mal an den Object Pascal Style Guide halten würdest?
Dann könnten wir deinen Code auch schneller überblicken und könnten dir leichter helfen.

Edit: Link ergänzt.

Wolfgang Mix 19. Mai 2010 19:12

Re: Pong Ball
 
Den Style-Guide gibt es auch auf deutsch
hier


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz