Okay, vergesst alles was auf den 2 Seiten bis jetzt gestanden hat :>
Ich hab nochmal neu angefangen. Hab vorhin mit malo per ICQ gesprochen und er meinte, dass er sein PongSpiel mit Shapes gemacht hat und eben nicht im Canvas.
Ich habs dann auch mal probiert und siehe da : Der Schläger und der Ball bewegen sich. Juchu!
Ich musste eben schon kurz feiern.
So ich hab mich aber ein _wenig_ am
http://www.delphipraxis.net/internal...highlight=pong orientiert.
Nun ist dieses Spiel ja für 2 Spieler konstruiert, aber ich will ja nur einen Spieler.
Der Ball soll also an 3 Wänden abprallen, am Schläger abprallen und eben nur dann durchgehen, wenn da kein Schläger im Weg ist.
Delphi-Quellcode:
type
TSpielfeld = class(TForm)
Label1: TLabel;
Label2: TLabel;
Ball: TShape;
Spieler: TShape;
Timer1: TTimer;
Timer2: TTimer;
procedure bewegen;
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Invert(invertx, inverty: Boolean); //Invertieren der Werte fuer das Verschieben
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Spielfeld: TSpielfeld;
punkte: Integer = 0; //Punkte Sp1
x: Integer = 10;//Verschieben des Balls um [x, y] Pixel
y: Integer = 10;
toleranz: Integer = 5; //Toleranz in Pixel beim Beruehren des Balls
randy: Integer = 10; //Rand bis zu dem sich der Schlaeger bewegen kann
randx: Integer = 8; // Rand vom Schlaeger bis zum Ende des Fensters links und rechts
mvspieler: Integer = 10; //Bewegung des Schlaegers in Pixel pro Zeitinterval
implementation
{$R *.dfm}
procedure TSpielfeld.Invert(invertx, inverty: Boolean);
begin
if invertx then x := -x;
if inverty then y := -y;
end;
procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Label1.Visible := False;
Label2.Visible := False;
case key of
vk_space:
begin
Label1.Visible := False;
Label2.Visible := False;
bewegen;
end;
vk_up:
begin
Spieler.Tag:= -mvspieler;
end;
vk_down:
begin
Spieler.Tag:= mvspieler;
end;
end;
end;
procedure TSpielfeld.bewegen;
begin
if Ball.Left >= Spielfeld.ClientWidth - Spieler.Width - Ball.Width - randx then
if (Ball.Top + Ball.Height div 2 >= Spieler.Top - toleranz) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 15) then begin
Invert(True, False);
y := -7;
x := x - 1;
end else
if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 16) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 45) then begin
Invert(True, False);
y := -3;
x := x - 1;
end else
if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 46) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 55) then begin
Invert(True, False);
y := 0;
x := x - 1;
end else
if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 56) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 85) then begin
Invert(True, False);
y := 3;
x := x - 1;
end else
if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 86) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + Spieler.Height + toleranz) then begin
Invert(True, False);
y := 7;
x := x - 1;
end;
//oberer und unterer Rand
if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientHeight - Ball.Height) then
Invert(False, True);
if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientWidth - Ball.Width) then
Invert(False, True);
//hab hier schon versucht das mit der Breite irgendwie hinzubekommen, aber der Ball fliegt trotzdem durch
if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.Tag - Ball.Tag) then
Invert(False, True);
//Eigentliches Verschieben des Balls
Ball.Left := Ball.Left + x;
Ball.Top := Ball.Top + y;
end;
procedure TSpielfeld.Timer1Timer(Sender: TObject);
begin
Spielfeld.bewegen;
end;
procedure TSpielfeld.Timer2Timer(Sender: TObject);
begin
if (Spieler.Top > randy) and (Spieler.Tag < 0) then Spieler.Top := Spieler.Top + Spieler.Tag;
if (Spieler.Top < Spielfeld.ClientHeight - Spieler.Height - randy) and (Spieler.Tag > 0) then Spieler.Top := Spieler.Top + Spieler.Tag;
end;
end.
Und wenn der Ball durchfliegt, sollte ein neuer Ball kommen... Kann ich dann irgendwie einen Befehl 'neustarten' einbauen? Wie ist der Befehl?
Ich hoffe ich hab mich jetzt klar genug ausgedrückt