Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
Ne, geht nicht.
|
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
EDIT: Mist gelöscht, ich sollte zum Augenarzt :wall:
//edit2: doch, das muss doch gehen. Du hast eine TSpielfeld-Procedures deklariert, da musst du auch eine TSpielfeld-Procedure implementieren ;) |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
Naja dann gehts wahrscheinlich nur nicht, dass ich damit was machen möchte...
Delphi-Quellcode:
Das geht ja nicht.
vk_down: // "runtertaste gedrückt"
begin with TSpielfeld.spieler do // paddle bewegen <- DA FEHLER begin y1:=y1-10; y2:=y2-10; end; end; [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..? |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
Das liegt vielleicht daran, dass deine Klasse TSpieler keine Klasse von TSpielfeld ist. Versuch mal das TSpielfeld wegzulassen, also so:
Delphi-Quellcode:
:zwinker:
vk_down: // "runtertaste gedrückt"
begin with Tspieler do // paddle bewegen begin y1:=y1-10; y2:=y2-10; end; end; |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Ich häng nochmal das komplette Programm mit an. Bitte Leute, ich brauch eure Hilfe. =|
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... Achja, damits vielleicht schneller geht.. Meine ICQ : 103057471 |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
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:
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:
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 ;) |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
Zitat:
Fehler : [Hinweis] Unit1.pas(63): Auf 'y2' zugewiesener Wert wird niemals benutzt und das dann eben auch mit x1, x2, y1.
Delphi-Quellcode:
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..
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; Zitat:
Und ich versuch mal ein neues Projekt mit den Shapes. |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
Delphi-Quellcode:
Ä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?
vk_down: // "runtertaste gedrückt"
begin with Spieler do // paddle bewegen begin y1:=y1-10; y2:=y2-10; end; end; |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Und wenn der Ball durchfliegt, sollte ein neuer Ball kommen... Kann ich dann irgendwie einen Befehl 'neustarten' einbauen? Wie ist der Befehl?
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. Ich hoffe ich hab mich jetzt klar genug ausgedrückt ;) |
Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
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:
Da fragt man sich doch 2 Sachen: 1. Wofür braucht man den ganzen Restlichen Quelltext ( :roll: ) und 2. WELCHE BREITE?!?!
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 Bitte das mal genauer Erklären, am besten in Eigenem Thread mit aussagelräftigem Titel ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 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