Einzelnen Beitrag anzeigen

Tanko14

Registriert seit: 14. Mär 2009
3 Beiträge
 
#1

pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles erhöhe

  Alt 14. Mär 2009, 17:39
Hallo liebe Delphi-Praxis Community,
ich habe seit einem Semester Informatik und mir gefällt dieses Fach auch sehr,
doch nun ist es geschehen: Ich kann 2 Probleme nicht lösen !
Die SuFu konnte mir meine Fragen auch leider nicht beantworten.

Zum Programm:
Ein Ball(shape) bewegt sich refklektierend in einem Fenster,
unten befindet sich ein Torwart(panel), der den Ball auch reflektieren soll,
falls der Ball an ihm vorbei geht, ist das Spiel beendet.
Nebenbei wird gezählt, wie of der Ball vom Torwart reflektiert wird.

Zu den Problemen:
1.)Die Geschwindigkeit soll sich zum Anstieg der Anzahl der Reflektion erhöhen.
2.)Der Torwart soll nicht die Seiten des Fensters überschreiten.

Ich habe es schon häufiger versucht, doch nicht hingekriegt.
Darum bitte ich um eure Hilfe .
Vielen Dank im Voraus.

Hier der Delphi-Code (Version 3):
Delphi-Quellcode:
unit ball1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Shape1: TShape;
    Panel1: TPanel;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  vx,vy,anzahl:integer; //Deklarierung der Variablen

implementation

{$R *.DFM}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin //panel1=Torwart
  panel1.left:=x-(panel1.width div 2); //Position des Mauszeiger im Formblatt->Mitte des Torwarts
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  panel1.left:=shape1.left+x-(panel1.width div 2); //Position des Mauszeiger im Ball->Mitte des Torwarts
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  panel1.left:=panel1.left+x-(panel1.width div 2); //Position des Mauszeiger im Torwart->Mitte des Torwarts
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vx:=5; // Geschwindigkeit des Balles
  vy:=5;
  timer1.enabled:=true;
  anzahl:=0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

 shape1.left:=shape1.left+vx; // Bewegung des Balles (shape1=ball)
 shape1.top:=shape1.top+vy;
 if (shape1.left<=0) or (shape1.left>=(form1.clientwidth-shape1.width)) then
   vx:=-vx; //Reflektierung des Balles an der X-Achse
 if (shape1.top<=0) or (shape1.top>=(form1.clientheight-shape1.height)) then
   vy:=-vy; //Reflektierung des Balles an der Y-Achse
 if (shape1.top + shape1.height >= panel1.top) //Ball auf der Höhe des Torwarts
 and(panel1.left <= shape1.left + shape1.width div 2) //linke Torwartseite <= Mitte des Balles
 and(panel1.left + panel1.width >= shape1.left + shape1.width div 2) then //rechte Torwartseite >= Mitte des Balles
   begin //Ball muss den Torwart berühren
     inc(anzahl); //Erhöhung der Anzahl der Reflektionen um 1
     vy:=-vy; //Reflektion des Balles
     label3.caption:=inttostr(anzahl)+'x reflektiert';//Ausgabe der Anzahl an Reflektionen
   end;
 if shape1.top > panel1.top then //Falls der Ball unter dem Torwart ist
   begin
     button1.enabled:=true; //Neustart möglich
     button1.visible:=true;
     label2.visible:=true; //Game Over
     timer1.enabled:=false; //Ballbewegung stoppen
   end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  timer1.enabled:=true; //Neustart
  shape1.top:=0; //Ball startet oben
  shape1.left:=form1.width div 2 - shape1.width div 2; //Ball startet in der Mitte
  panel1.left:=form1.width div 2 - panel1.width div 2; //Torwart in der Mitte
  button1.visible:=false; //Unsichbar machen
  label2.visible:=false;
  label3.caption:='Anzahl der Reflektionen';
  anzahl:=0; //Zurücksetzung der Anzahl auf 0
  vx:=5; // Anfangsgeschwindigkeit
  vy:=5;
end;

end.
Angehängte Dateien
Dateityp: rar ball2_920.rar (86,4 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat