Hallo zusammen,
Ping Pong Problem die 10te.
Nachdem ich hier und auf sämtlichen anderen Seiten nicht mehr weitergekommen bin, versuch ich es jetzt mal auf diesen Weg.
ich soll ein ping pong Spiel 'entwickeln' und ich denke, ich bin auch weit gekommen.
Ich habe zuerst die Bewegungsabläufe programmiert. Mit der Zeit dachte ich mir, bevor das eigentliche Spiel losgeht, bastel ich da noch ein Hauptmenü, wo der Spieler entscheiden kann, ob er gegen den Computer oder gegen einen anderen Spieler spielen kann.
Ich habe jetzt eine zweite Form erstellt, in der man dann wählen kann, gegen wenn man spielen möchte. Das Problem momentan ist, dass in der Zwischenzeit, in der ich mich in der zweiten Form aufhalte, im Hintergrund auf Form1 das Spiel begonnen hat.
Gleiches gilt auch, wenn ein Spieler 10 Punkte erreicht hat, schließt zwar Form1 und man kommt auch wieder auf Form2, wenn ich aber dann wieder auf den Button drücke um ein neues Spiel zu beginnen, reseten die Layer nicht.
Mein Lösungsansatz war es, dass wenn ich in Form2 den Button um ein Spiel zu starten drücke, Form1 eins neu resetet. so dass der Ball in der Ausgangsposition ist und die Layer, welche für den Punktestand verantwortlich sind, auf null stehen.
Laut mehreren Seiten ist es nicht möglich, dass Delphi eine Form resetet.
Wahrscheinlich werden jetzt einige Hände an den Kopf klatschen, aber hier meine bisherige Leistung
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Shape1: TShape;
Timer1: TTimer;
Shape2: TShape;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Shape3: TShape;
procedure FormCreate(Sender: TObject);
procedure OnTime(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
procedure Ball();
public
{ Public declarations }
end;
var
Form1: TForm1;
X,Y,a,b: real;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
X:=400;
Y:=1;
a:=3;
b:=4;
end;
procedure TForm1.Ball;
begin
X:=X+a;
Y:=Y+b;
If X > ClientWidth - Shape1.Width then
begin
X:=400+a;
Y:=0+b;
label2.Caption:=FloatToStr (StrToFloat (label2.caption)+1);
if label2.Caption = FloatToStr (10) then form2.show;
if label2.Caption = FloatToStr (10) then close;
end;
If X < 0 then
begin
X:=400+a;
Y:=0+b;
label1.Caption:=FloatToStr (StrToFloat (label1.caption)+1);
if label1.Caption = FloatToStr (10) then form2.show;
if label1.Caption = FloatToStr (10) then close;
end;
If Y > ClientHeight - Shape1.Height then b:=-b;
If Y < 0 then b:=-b;
Shape1.Left:=round(X);
Shape1.Top:=round(Y);
end;
procedure TForm1.OnTime(Sender: TObject);
var
Crash: Trect;
begin
Ball;
If InterSectRect (Crash, Shape2.Boundsrect, Shape1.BoundsRect) then a:=-a;
If InterSectRect (Crash, Shape3.Boundsrect, Shape1.BoundsRect) then a:=-a;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shape2.Top < ClientHeight - Shape2.Height then
if key = vk_down then Shape2.Top:=Shape2.Top+20;
if Shape2.Top > 0 then
if key = vk_up then Shape2.Top:=Shape2.Top-20;
if key = vk_escape then Form1.Close;
if Shape3.Top < ClientHeight - Shape3.Height then
if key = Ord('S') then Shape3.Top:=Shape3.Top+20;
if Shape3.Top > 0 then
if key = Ord('W') then Shape3.Top:=Shape3.Top-20;
end;
end.
Dann noch eine Kleinigkeit. Zu Label1 in der Form2. Ich wollte den Label dazu nutzen, dass der mir sagt, wer das Spiel gewonnen hat. Ich denke, der Ansatz ist soweit richtig, nur die procedure ist falsch definiert. Das click muss raus und durch was anderes ersetzt werden. Kann mir da auch einer einen Lösungsvorschlag liefern?
Code:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit1;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Show;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
Form2.Close;
end;
procedure TForm2.Label1Click(Sender: TObject);
begin
if form1.Label1.Caption = FloatToStr (10) then form2.label1.Caption :='Spieler 1 hat gewonnen';
if form1.Label2.Caption = FloatToStr (10) then form2.label1.Caption :='Spieler 2 hat gewonnen';
end;
end.
Bin für jede Hilfe sehr dankbar.