Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles erhöhe (https://www.delphipraxis.net/130866-pong-aehnliches-ball-spiel-geschwindigkeit-des-balles-erhoehe.html)

Tanko14 14. Mär 2009 17:39


pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles erhöhe
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

blink182 14. Mär 2009 18:24

Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er
 
Die Geschwindigkeit solltest du doch mit dem Timer auch einstellen können, dann fragst du halt die Anzahl ab und wenn die Anzahl großer N ist dann setzt du die geschwindigkeit auf die geschwindigkeit +10 o.ä.
und das mit dem torwart sollte doch auch kein problem sein, wenn sich der Torwart (panel left + panel width ) bzw einfach X-panel width div 2 > breite vom feld dann soll das halt nicht weiter nach rechts bzw links gehen - Abfrage im MouseMove ;)

Tanko14 14. Mär 2009 20:36

Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er
 
OnTopic [ON]
Meinst du sowas:
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);                    
begin                              
if (x-panel1.width div 2>form1.left)
and (x+panel1.width div 2<form1.clientwidth then
  panel1.left:=x-(panel1.width div 2); //Position des Mauszeiger im Fenster->Mitte des Torwarts
end;
bloß bei allen dreien?

Zur Geschwindigkeit:
Delphi-Quellcode:
  shape1.left:=shape1.left+vx +anzahl div 3; // Bewegung des Balles (shape1=ball)
  shape1.top:=shape1.top+vy  +anzahl div 3;
So erhöht sich alle drei Reflektionen die Geschwinidkeit (anzahl:integer).
Doch das funktioniert nicht :(
Könntest du das direkter machen, am besten mit Code.

OnTopic [OFF]

Bester NickName ;)
Ich liebe die Band, seit den Grammys im Februar sind sie wieder zusammen,
und wollen im Sommer auf Welt-Tour gehen und ein neues Album rausbringen.
"And it's happened once again
I'll turn to a friend
Someone that understands
Sees through the master plan

But everybody's gone
And I've been here for too long
To face this on my own
Well I guess this is growing up" (Dammit)

blink182 15. Mär 2009 01:24

Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er
 
z.b. alle 5 erhöhen

Delphi-Quellcode:
if anzahl mod 5 = 0 then
begin
vy:=vy+5;
vx:=vx+5;
end;
hoffe das klappt ;) und das im Timer abfragen. Musst halt nur schauen, ob vy bzw vx gerade positiv sind, sonst wird die geschwindigkeit ja niedriger und das willst du ja nicht. Also ggf noch prüfen

Delphi-Quellcode:
if vx=abs(vx) then... // bzw vy
und wenn nicht halt einfach -5 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 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