AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles erhöhe
Thema durchsuchen
Ansicht
Themen-Optionen

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

Offene Frage von "Tanko14"
Ein Thema von Tanko14 · begonnen am 14. Mär 2009 · letzter Beitrag vom 15. Mär 2009
Antwort Antwort
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
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#2

Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er

  Alt 14. Mär 2009, 18:24
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
  Mit Zitat antworten Zitat
Tanko14

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

Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er

  Alt 14. Mär 2009, 20:36
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)
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#4

Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er

  Alt 15. Mär 2009, 01:24
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

if vx=abs(vx) then... // bzw vy und wenn nicht halt einfach -5
  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 15:48 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