AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Ping Pong Programm - Probleme
Thema durchsuchen
Ansicht
Themen-Optionen

Ping Pong Programm - Probleme

Ein Thema von bumbumray · begonnen am 21. Apr 2015
Antwort Antwort
bumbumray

Registriert seit: 21. Apr 2015
1 Beiträge
 
#1

Ping Pong Programm - Probleme

  Alt 21. Apr 2015, 18:40
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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