![]() |
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. |
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 ;) |
Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er
OnTopic [ON]
Meinst du sowas:
Delphi-Quellcode:
bloß bei allen dreien?
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; Zur Geschwindigkeit:
Delphi-Quellcode:
So erhöht sich alle drei Reflektionen die Geschwinidkeit (anzahl:integer).
shape1.left:=shape1.left+vx +anzahl div 3; // Bewegung des Balles (shape1=ball)
shape1.top:=shape1.top+vy +anzahl div 3; 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) |
Re: pong-ähnliches Ball-Spiel: Geschwindigkeit des Balles er
z.b. alle 5 erhöhen
Delphi-Quellcode:
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 anzahl mod 5 = 0 then
begin vy:=vy+5; vx:=vx+5; end;
Delphi-Quellcode:
und wenn nicht halt einfach -5 ;)
if vx=abs(vx) then... // bzw vy
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz