AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilfe!
Thema durchsuchen
Ansicht
Themen-Optionen

Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilfe!

Ein Thema von leela · begonnen am 9. Jan 2005 · letzter Beitrag vom 12. Jan 2005
Antwort Antwort
Seite 3 von 4     123 4      
leela
(Gast)

n/a Beiträge
 
#21

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 10. Jan 2005, 20:52
Ne, geht nicht.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#22

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 10. Jan 2005, 21:01
EDIT: Mist gelöscht, ich sollte zum Augenarzt

//edit2: doch, das muss doch gehen. Du hast eine TSpielfeld-Procedures deklariert, da musst du auch eine TSpielfeld-Procedure implementieren
  Mit Zitat antworten Zitat
leela
(Gast)

n/a Beiträge
 
#23

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 10. Jan 2005, 21:18
Naja dann gehts wahrscheinlich nur nicht, dass ich damit was machen möchte...

Delphi-Quellcode:
    vk_down: // "runtertaste gedrückt"
    begin
     with TSpielfeld.spieler do // paddle bewegen <- DA FEHLER
         begin
         y1:=y1-10;
         y2:=y2-10;
         end;
    end;
Das geht ja nicht.
[Fehler] Unit1.pas(152): Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt

Also muss ich doch eine Klasse festlegen..
Kann ich das denn irgendwo noch anders implementieren, dass er eben die y-Werte von der Prozedur verändert, wenn ich die Pfeiltasten hoch oder runter gehe..?
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#24

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 11. Jan 2005, 13:39
Das liegt vielleicht daran, dass deine Klasse TSpieler keine Klasse von TSpielfeld ist. Versuch mal das TSpielfeld wegzulassen, also so:

Delphi-Quellcode:
vk_down: // "runtertaste gedrückt"
    begin
     with Tspieler do // paddle bewegen
         begin
         y1:=y1-10;
         y2:=y2-10;
         end;
    end;
  Mit Zitat antworten Zitat
leela
(Gast)

n/a Beiträge
 
#25

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 11. Jan 2005, 16:24
Also nun geht gar nichts mehr. Ich habs erstmal wieder so gemacht, dass er wenigstens startet und dann nicht der Debugger nervt. ._. Ich lad nochmal das Programm hoch... Die Sachen, die noch in den geschweiften Klammern sind, muss ich irgendwo mit reinbringen...

Delphi-Quellcode:
type
//anfang.. mit uses etc.

  TSpielfeld = class(TForm)
    .... unwichtig
//HIER tSpielerKlasse!!
    type
    tSpieler = class
    x1,x2,y1,y2:integer;
    procedure SpielerErstellen;
    end;
    type
    tBall = class
    x,y,vx,vy,r:Single;
    farbe:tColor;
    procedure init(fNeu:tColor;xNeu,yNeu,vxNeu,vyNeu,rNeu:Single);
    procedure ZeigeDich;
    procedure BewegeDich;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Spielfeld: TSpielfeld;
  ball:tBall;
  spieler:tSpieler;
  punkt:integer = 0;
  BallimSpiel:boolean = false;
  x1,y1,x2,y2:integer;

implementation

{$R *.dfm}

// Muss ich hier noch was verändern? Hier deklarier ich eben die Prozedur.. Nur.. wie ruf ich sie am besten auf und wann?
procedure tSpieler.SpielerErstellen;
begin
with Spielfeld.Bild.Canvas do
    begin
    brush.Color:= clBlue;
    rectangle(x1,y1,x2,y2);
    pen.width:=1;
    brush.style:=bsSolid;
    pen.Mode:= pmNOTXOR;
    end;
x1:=670;
y1:=100;
x2:=680;
y2:=210;
end;

procedure tBall.init(fNeu:tColor;xNeu,yNeu,vxNeu,vyNeu,rNeu:Single);
begin
farbe:= fNeu;
r:= rNeu;
x:= xNeu;
y:= yNeu;
vx:= vxNeu;
vy:=vyNeu;
end;

procedure tBall.ZeigeDich;
begin
with Spielfeld.Bild.Canvas do
    begin
    brush.color:= clRed;
    ellipse(Round (x-r),Round(y-r),Round(x+r),Round(y+r))
    end;
end;

procedure tBall.BewegeDich;
begin
  x:=x+vx;
  y:=y+vy;
  with Spielfeld.Bild do
  begin
    if (x>width+r-1) then
    begin
      inc(punkt);
      Spielfeld.Label3.Caption:=IntToStr(punkt);
      BallimSpiel:=false; // es kann ein neuer ball gestartet werden
         if punkt=10 then
         Showmessage ('Game Over');
    end;
    if x<r+1 then
    begin
      x:=r+1;
      vx:=-vx
    end;
    if (y>height-r-1) then
    begin
      y:= height-r-1;
      vy:=-vy
    end;
    if y< r+1 then
    begin
      y := r+1;
      vy:= -vy
    end
  end
end;

procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    vk_space:
    begin
      if BallimSpiel then
        exit;
      with Bild.Canvas do
      begin
        brush.Color:= clWhite;
        rectangle(0,0,Bild.width,Bild.height);
        pen.width:=1;
        brush.style:=bsSolid;
        pen.Mode:= pmNOTXOR;
      end;
      BallimSpiel:=true;
      Ball.init(clWhite,100,200,5,5,15);
      Ball.ZeigeDich;
    end;

//hier soll der Spieler sich eben bewegen.. Nur meckert er da immer mit den Variablen rum, dass ich die nicht richtig deklariert hab.. Und wie sprech ich die Prozedur an? 'with procedure tSpieler do' ? das kann nicht richtig sein, weil das hab ich ja alles schon probiert.. Es nervt, wenn man immer alles ausprobieren muss =(

    vk_down: // "runtertaste gedrückt"
    begin
     {with tSpieler do // paddle bewegen
        begin
        y1:=y1-10;
        y2:=y2-10;
         end; }

    end;
    vk_up: // "hochtaste gedrückt"
    begin
      // paddle bewegen
    end;
  end;
end;

procedure TSpielfeld.Timer1Timer(Sender:TObject);
begin
  if BallimSpiel then
  begin
    {spieler.SpielerErstellen;}
    Ball.ZeigeDich;
    Ball.BewegeDich;
    Ball.ZeigeDich;
  end;
end;

//so hier eben der Schluss...
Ich häng nochmal das komplette Programm mit an. Bitte Leute, ich brauch eure Hilfe. =|

Achja, damits vielleicht schneller geht.. Meine ICQ : 103057471
Angehängte Dateien
Dateityp: rar spiel-v4_903.rar (170,9 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#26

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 11. Jan 2005, 16:42
Erstmal: Sag bitte nicht immer nur "geht nicht" und "nun geht gar nichts mehr". Unsere Glaskugeln sagen uns nicht, welcher Fehler da steht Bitte Fehlermeldungen immer genau benennen und sagen, wo der Fehler auftritt. Danke.

Zweitens: Bitte poste nicht immer den ganzen Quelltext, sondern kopier dir genau die Stellen heraus, die nicht funktionieren

Zu den Problemen:

Zitat von leela:
Muss ich hier noch was verändern? Hier deklarier ich eben die Prozedur.. Nur.. wie ruf ich sie am besten auf und wann?
Du deklarierst sie nicht, du impelentierst sie da Aber das nur am Rande.
Die Procedure rufst du auf, wenn du sie brauchst. Wenn sie direkt zu Beginn aufgerufen werden soll, dann nutze das OnCreate bzw. OnShow-Event.

Zitat von leela:
hier soll der Spieler sich eben bewegen.. Nur meckert er da immer mit den Variablen rum, dass ich die nicht richtig deklariert hab.. Und wie sprech ich die Prozedur an? 'with procedure tSpieler do' ? das kann nicht richtig sein, weil das hab ich ja alles schon probiert.. Es nervt, wenn man immer alles ausprobieren muss =(
bei WELCHEN variablen meckert er?!?! Meine Teeblätter hab ich verliehen, sorry

Und die Procedure selbst kannst du nicht ansprechen. Was willst du denn genau mit der Procedure dann machen? Wenn du uns das sagst, kann vllt geholfen werden!



Also: die Probleme nochmal ganz genau erklären und die Fehlermeldungen auflisten und hinschreiben, wann welcher Fehler kommt
  Mit Zitat antworten Zitat
leela
(Gast)

n/a Beiträge
 
#27

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 11. Jan 2005, 17:10
Zitat von malo:
bei WELCHEN variablen meckert er?!?! Meine Teeblätter hab ich verliehen, sorry
Bei x1,x2,y1,y2. Das sind ja die Eckpunkte vom Rechteck (Spieler), die ich eigentlich in der Prozedur SpielerErstellen hab.

Fehler : [Hinweis] Unit1.pas(63): Auf 'y2' zugewiesener Wert wird niemals benutzt
und das dann eben auch mit x1, x2, y1.

Delphi-Quellcode:
procedure tSpieler.SpielerErstellen(x1,y1,x2,y2: integer);
begin
with Spielfeld.Bild.Canvas do
    begin
    brush.Color:= clBlue;
    rectangle(x1,y1,x2,y2);
    pen.width:=1;
    brush.style:=bsSolid;
    pen.Mode:= pmNOTXOR;
    end;
x1:=670; // da ist der Fehler
y1:=100;
x2:=680;
y2:=210;
end;
Habs eben gestestet.. Wenn ich das wegmache, dann gehts. Aber dann hat er ja immer noch nicht den Spieler erstellt. Moment ich probier das eben noch mit dem OnShow-Event aus..

Zitat von malo:
Und die Procedure selbst kannst du nicht ansprechen. Was willst du denn genau mit der Procedure dann machen? Wenn du uns das sagst, kann vllt geholfen werden!
Also eigentlich will ich ja mit der Prozedur SpielerErstellen dann später sagen, dass die sich halt bewegen soll. Also, dass sich der Spieler bewegen soll. Oder soll ich dann lieber ne Prozedur schreiben SpielerBewegen ?

Und ich versuch mal ein neues Projekt mit den Shapes.
  Mit Zitat antworten Zitat
Maximus

Registriert seit: 26. Okt 2003
169 Beiträge
 
#28

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 11. Jan 2005, 17:18
Delphi-Quellcode:
 vk_down: // "runtertaste gedrückt"
    begin
     with Spieler do // paddle bewegen
        begin
         y1:=y1-10;
         y2:=y2-10;
        end;
    end;
Ähm müsste das nicht nur Spieler heißen? - Spieler ist doch die Variable vom Typ TSpieler ... also muss man die Werte ja in der Variable ändern, oder?
  Mit Zitat antworten Zitat
leela
(Gast)

n/a Beiträge
 
#29

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 11. Jan 2005, 20:02
Okay, vergesst alles was auf den 2 Seiten bis jetzt gestanden hat :>
Ich hab nochmal neu angefangen. Hab vorhin mit malo per ICQ gesprochen und er meinte, dass er sein PongSpiel mit Shapes gemacht hat und eben nicht im Canvas.
Ich habs dann auch mal probiert und siehe da : Der Schläger und der Ball bewegen sich. Juchu! Ich musste eben schon kurz feiern.

So ich hab mich aber ein _wenig_ am http://www.delphipraxis.net/internal...highlight=pong orientiert. Nun ist dieses Spiel ja für 2 Spieler konstruiert, aber ich will ja nur einen Spieler.
Der Ball soll also an 3 Wänden abprallen, am Schläger abprallen und eben nur dann durchgehen, wenn da kein Schläger im Weg ist.

Delphi-Quellcode:
type
  TSpielfeld = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Ball: TShape;
    Spieler: TShape;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure bewegen;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Invert(invertx, inverty: Boolean); //Invertieren der Werte fuer das Verschieben
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
        Spielfeld: TSpielfeld;
     punkte: Integer = 0; //Punkte Sp1
   x: Integer = 10;//Verschieben des Balls um [x, y] Pixel
        y: Integer = 10;
   toleranz: Integer = 5; //Toleranz in Pixel beim Beruehren des Balls
   randy: Integer = 10; //Rand bis zu dem sich der Schlaeger bewegen kann
   randx: Integer = 8; // Rand vom Schlaeger bis zum Ende des Fensters links und rechts
   mvspieler: Integer = 10; //Bewegung des Schlaegers in Pixel pro Zeitinterval

implementation

{$R *.dfm}


procedure TSpielfeld.Invert(invertx, inverty: Boolean);
begin
   if invertx then x := -x;
   if inverty then y := -y;
end;

procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    Label1.Visible := False;
    Label2.Visible := False;
  case key of
    vk_space:
      begin
      Label1.Visible := False;
      Label2.Visible := False;
      bewegen;
      end;
    vk_up:
      begin
      Spieler.Tag:= -mvspieler;
      end;
    vk_down:
      begin
      Spieler.Tag:= mvspieler;
      end;
end;
end;

procedure TSpielfeld.bewegen;
begin
   if Ball.Left >= Spielfeld.ClientWidth - Spieler.Width - Ball.Width - randx then
      if (Ball.Top + Ball.Height div 2 >= Spieler.Top - toleranz) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 15) then begin
             Invert(True, False);
               y := -7;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 16) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 45) then begin
              Invert(True, False);
               y := -3;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 46) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 55) then begin
         Invert(True, False);
               y := 0;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 56) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 85) then begin
              Invert(True, False);
               y := 3;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 86) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + Spieler.Height + toleranz) then begin
              Invert(True, False);
               y := 7;
               x := x - 1;
      end;

   //oberer und unterer Rand
   if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientHeight - Ball.Height) then
      Invert(False, True);
        if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientWidth - Ball.Width) then
      Invert(False, True);
//hab hier schon versucht das mit der Breite irgendwie hinzubekommen, aber der Ball fliegt trotzdem durch
        if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.Tag - Ball.Tag) then
      Invert(False, True);

   //Eigentliches Verschieben des Balls
   Ball.Left := Ball.Left + x;
   Ball.Top := Ball.Top + y;
end;

procedure TSpielfeld.Timer1Timer(Sender: TObject);
begin
Spielfeld.bewegen;
end;

procedure TSpielfeld.Timer2Timer(Sender: TObject);
begin
      if (Spieler.Top > randy) and (Spieler.Tag < 0) then Spieler.Top := Spieler.Top + Spieler.Tag;
      if (Spieler.Top < Spielfeld.ClientHeight - Spieler.Height - randy) and (Spieler.Tag > 0) then Spieler.Top := Spieler.Top + Spieler.Tag;
     end;

end.
Und wenn der Ball durchfliegt, sollte ein neuer Ball kommen... Kann ich dann irgendwie einen Befehl 'neustarten' einbauen? Wie ist der Befehl?

Ich hoffe ich hab mich jetzt klar genug ausgedrückt
Angehängte Dateien
Dateityp: rar spiel-shape_190.rar (164,6 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#30

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 12. Jan 2005, 15:47
Bitte nochmal: POSTE NICHT IMMER DEN GANZEN QUELLCODE!!!

Kopiere bitte nur die Stellen raus, die wirklich Probleme machen. Und mach am besten für jede Frage einen eigenen Thread auf.

Dein einziges Problem scheint ja hier zu liegen:
Delphi-Quellcode:
if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientHeight - Ball.Height) then
      Invert(False, True);
        if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientWidth - Ball.Width) then
      Invert(False, True);
//hab hier schon versucht das mit der Breite irgendwie hinzubekommen, aber der Ball fliegt trotzdem durch
Da fragt man sich doch 2 Sachen: 1. Wofür braucht man den ganzen Restlichen Quelltext ( ) und 2. WELCHE BREITE?!?!

Bitte das mal genauer Erklären, am besten in Eigenem Thread mit aussagelräftigem Titel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 14:52 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