![]() |
Mal wieder Pong...
Hey,
habe mal eine Frage zu dem Spiel Pong. Habe nichts mit der Sufu gefunden wenn es die Frage doch schon gibt sry. Also hier erstmal der Code(is nochlange nit fertig, soll nur ein grundgerüst sein):
Delphi-Quellcode:
So also, mein Problem ist das sich der Ball auf der x achse immer nur etwa auf 2 pixeln hin und her bewegt. Es funktioniert nur wenn ich eine der beiden Seiten Rechts oder Links wegnehme, aber dann funkt. ja nur eine Seite, dass wäre ja Sinnlos.
unit Tennis;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TField = class(TForm) Decke: TShape; shLinks: TShape; ShSchlaeger: TShape; shRechts: TShape; Ball: TShape; Timer1: TTimer; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Field: TField; x, y : Integer; Lives : Byte; oben, rechts, links, unten : Integer; implementation {$R *.dfm} procedure TField.FormCreate(Sender: TObject); begin Field.DoubleBuffered := True; x := 3; y := -4; Lives := 3; oben := Decke.Top + Decke.Height; links := shLinks.Left + ShLinks.Height; rechts := shRechts.Left; unten := shSchlaeger.Top; end; procedure TField.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_Left: Begin if ShSchlaeger.Left >= 30 then ShSchlaeger.Left := ShSchlaeger.Left - 10; End; VK_Right: Begin if (ShSchlaeger.Left + ShSchlaeger.Width) <= 660 then ShSchlaeger.Left := ShSchlaeger.Left + 10; End; end; end; function BallOben : Boolean; Begin Result := Field.Ball.Top <= oben; End; function BallUnten : Boolean; Begin Result := Field.Ball.Top + Field.Ball.Height >= unten; End; function BallLinks : Boolean; Begin Result := Field.Ball.Left <= Links; End; function BallRechts : Boolean; Begin Result := Field.Ball.Left + Field.Ball.Width >= Rechts; End; procedure TField.Timer1Timer(Sender: TObject); begin Ball.Left := Ball.Left + x; Ball.Top := Ball.Top + y; if BallOben then y := -y; if BallLinks then x := -x; if BallRechts then x := -x; if BallUnten AND (Ball.Left >= shSchlaeger.Left) AND (Ball.Left <= (shSchlaeger.Left + shSchlaeger.Width)) then y:= -y; end; end. Weiß einer vllt. wo der Fehler liegt? MfG N1GhtSurfer |
Re: Mal wieder Pong...
Hier:
Delphi-Quellcode:
Du musst es für beide Seiten wirklich einzeln betrachten.
if BallLinks then
x := -x; if BallRechts then x := -x; Also für für die linke Seite verwende
Delphi-Quellcode:
und für die rechte Seite
x := Abs(x);
Delphi-Quellcode:
"Abs" ist der Absolutwert.
x := -Abs(x);
Das Problem ist nämlich, dass wahrscheinlich die Funktion "Balllinks" bzw. -rechts mehrere Male aufgerufen werden. |
Re: Mal wieder Pong...
Okay, Danke erstmal
habe aber jetzt ein anderes Problem und noch eine Frage 1. Warum muss ich nur den Absoluten Wert von x nehmen und nicht von y??? und Problem: der Ball prallt jetzt einfach in der Mitte ab? |
Re: Mal wieder Pong...
also zu 1.: Es ist am besten, wenn du es auch dort (also oben/unten -> Y) anwendest.
Wegen letzterem, bitte häng mal die EXE an. |
Re: Mal wieder Pong...
Liste der Anhänge anzeigen (Anzahl: 1)
Exe + Source
|
Re: Mal wieder Pong...
Soooooooooooooooooooooooo...
1. Wegen dem Abprallen in der Mitte:
Delphi-Quellcode:
2. Du musst für die horizontalen Begrenzungen auch die Technik mit dem Betrag anwenden:
oben := Decke.Top + Decke.Height;
links := shLinks.Left + ShLinks.Height; //hier ist der Fehler (Zeile 44) ---> Es muss "ShLinks.Width" heißen, es geht ja schließlich um die Horizontale rechts := shRechts.Left; unten := shSchlaeger.Top;
Delphi-Quellcode:
3. Das hast du sicher einfach noch nicht eingebaut, aber mach das mal als nächstes: Die Abbruchbedingung.
if BallOben then
y := Abs(y); //hier die erste Änderung if BallLinks then x := Abs(X); if BallRechts then x := -Abs(X); if BallUnten AND (Ball.Left >= shSchlaeger.Left) AND (Ball.Left <= (shSchlaeger.Left + shSchlaeger.Width)) then y:= -Abs(y); //hier meine 2. Änderung 4. Für die Paddlebewegung (die IMHO durch KeyDown schrecklich ist) würde ich dir empfehlen mal nach " ![]() 5. Um ein wenig Abwechslung in die Ball-FLugbahn zu bekommen, solltest du dir ![]() PS: Ich hab im Übrigen auch mal (wie so ziemlich jeder) ein Pong und ein SquashPong geschrieben, schau einfach mal auf meine Website (siehe Signatur)! |
Re: Mal wieder Pong...
Okay, Danke =)
ja ich werde das mal mit dem KeyDown ändern und die anderen Funktionen auch hinzufügen MfG N1GhtSurfer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 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