AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mal wieder Pong...

Ein Thema von n1ghtSurfer · begonnen am 5. Dez 2008 · letzter Beitrag vom 6. Dez 2008
Antwort Antwort
n1ghtSurfer

Registriert seit: 2. Mai 2008
14 Beiträge
 
Delphi 7 Enterprise
 
#1

Mal wieder Pong...

  Alt 5. Dez 2008, 17:34
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
Was soll ich denn mit einer Signatur?
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Mal wieder Pong...

  Alt 5. Dez 2008, 18:27
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 verwendex := Abs(x); und für die rechte Seite x := -Abs(x); "Abs" ist der Absolutwert.

Das Problem ist nämlich, dass wahrscheinlich die Funktion "Balllinks" bzw. -rechts mehrere Male aufgerufen werden.
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
n1ghtSurfer

Registriert seit: 2. Mai 2008
14 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Mal wieder Pong...

  Alt 5. Dez 2008, 19:06
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?
Was soll ich denn mit einer Signatur?
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Mal wieder Pong...

  Alt 5. Dez 2008, 19:10
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.
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
n1ghtSurfer

Registriert seit: 2. Mai 2008
14 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Mal wieder Pong...

  Alt 5. Dez 2008, 20:19
Exe + Source
Angehängte Dateien
Dateityp: rar pong_850.rar (182,8 KB, 16x aufgerufen)
Was soll ich denn mit einer Signatur?
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Mal wieder Pong...

  Alt 5. Dez 2008, 23:38
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)!
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
n1ghtSurfer

Registriert seit: 2. Mai 2008
14 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Mal wieder Pong...

  Alt 6. Dez 2008, 09:05
Okay, Danke =)
ja ich werde das mal mit dem KeyDown ändern und die anderen Funktionen auch hinzufügen
MfG
N1GhtSurfer
Was soll ich denn mit einer Signatur?
  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 11:33 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