Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mal wieder Pong... (https://www.delphipraxis.net/125410-mal-wieder-pong.html)

n1ghtSurfer 5. Dez 2008 17:34


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:
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.
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.
Weiß einer vllt. wo der Fehler liegt?
MfG
N1GhtSurfer

TonyR 5. Dez 2008 18:27

Re: Mal wieder Pong...
 
Hier:
Delphi-Quellcode:
  if BallLinks then
    x := -x;


  if BallRechts then
    x := -x;
Du musst es für beide Seiten wirklich einzeln betrachten.
Also für für die linke Seite verwende
Delphi-Quellcode:
x := Abs(x);
und für die rechte Seite
Delphi-Quellcode:
x := -Abs(x);
"Abs" ist der Absolutwert.

Das Problem ist nämlich, dass wahrscheinlich die Funktion "Balllinks" bzw. -rechts mehrere Male aufgerufen werden.

n1ghtSurfer 5. Dez 2008 19:06

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?

TonyR 5. Dez 2008 19:10

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.

n1ghtSurfer 5. Dez 2008 20:19

Re: Mal wieder Pong...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Exe + Source

TonyR 5. Dez 2008 23:38

Re: Mal wieder Pong...
 
Soooooooooooooooooooooooo...

1. Wegen dem Abprallen in der Mitte:
Delphi-Quellcode:
  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;
2. Du musst für die horizontalen Begrenzungen auch die Technik mit dem Betrag anwenden:
Delphi-Quellcode:
  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
3. Das hast du sicher einfach noch nicht eingebaut, aber mach das mal als nächstes: Die Abbruchbedingung.

4. Für die Paddlebewegung (die IMHO durch KeyDown schrecklich ist) würde ich dir empfehlen mal nach "Hier im Forum suchenGetAsyncKeyState" zu suchen!

5. Um ein wenig Abwechslung in die Ball-FLugbahn zu bekommen, solltest du dir Hier im Forum suchenrandom ansehen!

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)!

n1ghtSurfer 6. Dez 2008 09:05

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