Entwickler-Ecke
Multimedia / Grafik - Beratung [Ziel: Pong Programmieren]
the-kecks - Fr 05.06.09 23:33
Titel: Beratung [Ziel: Pong Programmieren]
hi,
ich möchte mal wieder etwas neues in delphi lernen. bisher habe ich mich imer mit datenverarbeitung und Internet(Indy) beschäftigt. ich möchte diesen neuen bereich in delphi so lernen, dass ich am ende so etwas wie pong programmieren kann.
vll könnt ihr mir ja tutorials empfehlen oder mir einfach ein paar tipps geben wo ich anfangen kann :)
PS: falls das der falsche bereich ist, tut es mir leid. ich dachte da pong da was mit grafik zu tun hat, tu ich das einfach mal hier rein...
mfg
alzaimar - Sa 06.06.09 07:31
Hi
Ich würde erstmal die Darstellung von der Datenstruktur trennen.
Ein Pong-Spiel besteht aus:
1. 2x Schlägern und deren Position und Geschwindigkeitsvektor (wegen 'Anschneiden' des Balles)
2. 1x Ball und dessen Position und Geschwindigkeitsvektur. Eventuell noch den Spin.
3. Der aktuelle Spielstand
Du kannst nun das Spiel schon komplett programmieren. Zumindest von der Logik aus.
1. Aus den Balldaten kannst du die nächste Position des Balles für den Zeitpunkt t+dt berechnen.
2. Aus den Schlägerdaten kannst Du deren Position zu Zeitpunkt t+dt berechnen.
3. Wenn der Ball während des Fluges (t --> t+dt) mit einem Schläger kollidiert, dann wird der Geschwindigkeitsvektor sowie eventuell der Spin des Balles neu Berechnet und seine Position korrigiert.
4. Fliegt der Ball aus dem Spielfeld, gibts einen Punkt.
Fertig.
Nun nur noch die Darstellung und schon hast Du dein Spiel. Die Darstellung könntest Du so realisieren:
1. Du malst den aktuellen Spielstand (also Schläger- und Ballposition) auf eine Leinwand (Canvas).
2. Anschließend werden alle Positionen neu berechnet.
3. Goto 1
wunsiedler - Sa 06.06.09 09:57
Vielleicht hilft dir das hier weiter. Habe ich vor Jahren mal erstellt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end;
var Form1: TForm1;
var schlaeger_links_top,schlaeger_rechts_top : integer; var ball_top,ball_left,ball_x,ball_y : integer; var limit_oben,limit_unten,limit_links,limit_rechts : integer; var geschwindigkeit : integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin geschwindigkeit := 1; schlaeger_links_top := 242; schlaeger_rechts_top := 242; ball_top := 237; ball_left := 312; ball_x := geschwindigkeit; ball_y := geschwindigkeit; limit_links := 25; limit_rechts := 600; limit_oben := 64; limit_unten := 460;
Image2.Top := schlaeger_links_top; Image2.Left := 15; Image3.Top := schlaeger_rechts_top; Image3.Left := 610; Image4.Top := ball_top; Image4.Left := ball_left;
end;
procedure TForm1.Timer1Timer(Sender: TObject); var differenz : integer; begin
ball_top := ball_top + ball_y; if((ball_top > limit_unten) or (ball_top < limit_oben))then begin ball_y := - ball_Y; end;
ball_left := ball_left + ball_x; if ((ball_left > limit_rechts) or (ball_left < limit_links)) then begin ball_x := - ball_x; end; image4.Visible := false; Image4.Top := ball_top; Image4.Left := ball_left; image4.Visible := true;
if(ball_x < 0)then begin differenz := schlaeger_links_top - ball_top;
if(differenz < 0) then begin schlaeger_links_top := schlaeger_links_top + geschwindigkeit; end else begin schlaeger_links_top := schlaeger_links_top - geschwindigkeit;end; if (schlaeger_links_top < 75) then schlaeger_links_top := 75; if (schlaeger_links_top > 430) then schlaeger_links_top := 430; Image2.Top := schlaeger_links_top - 15; end;
if(ball_x > 0)then begin differenz := schlaeger_rechts_top - ball_top;
if(differenz < 0) then begin schlaeger_rechts_top := schlaeger_rechts_top + geschwindigkeit end else begin schlaeger_rechts_top := schlaeger_rechts_top - geschwindigkeit;end; if (schlaeger_rechts_top < 75) then schlaeger_rechts_top := 75; if (schlaeger_rechts_top > 430) then schlaeger_rechts_top := 430; Image3.Top := schlaeger_rechts_top - 15; end;
end;
end. |
Damit Du auch siehst was das ganze macht, die EXE im Anhang
the-kecks - Sa 06.06.09 15:46
thx für eure antworten. wunsiedler ich hab mal deinen code genommen und mir ein eigenes pong bebastelt (was ja dann nicht mehr schwer war :D). nur leider bwirkt der (für mich ziemlich logisch aussehende) code nichts. hab meine projekt-dateien mal in den anhang getan
//sry für namensverwechslung xD
mfg
Jakob_Ullmann - Sa 06.06.09 18:32
Hab mir das mal angeschaut.
1. Wo soll das denn alles gezeichnet werden?
2. Bedenke bitte, dass du nur auf den Canvas eines Bitmaps, nicht den eines JPEG-Images, malen kannst.
Weiterhin reicht auch ein Timer. :wink: Wenn du weißt, dass es "umständlich" ist, mach es doch einfach nicht.
//edit: Nach so viel Copy & Paste... sry, aber sonst wäre dir das vielleicht auch aufgefallen, dass nirgends gemalt wird. :roll:
the-kecks - Sa 06.06.09 18:38
ich will ja auch gar nicht malen.
habe jetzt mal ein eigenes pong gemacht. der ball verlauf klappt schon, nur die bewegung des schlägers klappt noch nicht. werde es mal als open source projekt reinstellen wenn es fertig ist.
mfg
Jakob_Ullmann - Sa 06.06.09 19:00
the-kecks hat folgendes geschrieben : |
ich will ja auch gar nicht malen. |
Und was nützt dir ein Pong-Spiel, wenn zwar intern die Koordinaten stimmen, du davon aber gar nichts siehst? :roll:
the-kecks - Sa 06.06.09 19:35
Jakob_Ullmann hat folgendes geschrieben : |
Und was nützt dir ein Pong-Spiel, wenn zwar intern die Koordinaten stimmen, du davon aber gar nichts siehst? :roll: |
O.o ich glaub du verstehst das falsch. lad dir mal die exe von wunsiedler
mfg
Jakob_Ullmann - Sa 06.06.09 19:59
Da sehe ich ein schönes Ping-Pong-Spiel. :wink: Bei dir aber nicht. Verständlicherweise hat dir wunsiedler also nicht den gesamten Quellcode geschickt.
the-kecks - Sa 06.06.09 20:24
UPDATE: ich bin jetzt soweit fertig mit meinem pong, nur mit der tastensteuerung hab ich noch probleme
code:
-FormCreate
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| begin [...] DoubleBuffered := true; Application.OnMessage := appmessage; [...] end; |
-AppMessage
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean); begin if msg.message = wm_keydown then begin
if msg.wParam=VK_DOWN then begin key1:='down'; timer2.Enabled:=true; Handled:=true; end; if msg.wParam=VK_UP then begin key1:='up'; timer2.Enabled:=true; Handled:=true; end; end; if msg.message = wm_keyup then begin if msg.wParam=VK_DOWN then begin timer2.Enabled:=false; Handled:=true; end; if msg.wParam=VK_UP then begin timer2.Enabled:=false; Handled:=true; end; end; end; |
-Timer2
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Timer2Timer(Sender: TObject); begin if key1='down' then begin Spieler_top := Spieler_top + geschwindigkeit; if (Spieler_top < 55) then Spieler_top := 55; if (Spieler_top > 967) then Spieler_top := 967; Spieler.Top := Spieler_top; end; if key1='up' then begin Spieler_top := Spieler_top + geschwindigkeit; if (Spieler_top < 55) then Spieler_top := 55; if (Spieler_top > 967) then Spieler_top := 967; Spieler.Top := Spieler_top; end; end; |
der reagiert einfach nicht auf den tastendruck
mfg
wunsiedler - So 07.06.09 11:25
Jakob_Ullmann hat folgendes geschrieben : |
Da sehe ich ein schönes Ping-Pong-Spiel. :wink: Bei dir aber nicht. Verständlicherweise hat dir wunsiedler also nicht den gesamten Quellcode geschickt. |
Doch, das ist der gesamte Code, nur die 4 Images fehlen halt...
Jakob_Ullmann - So 07.06.09 12:49
Also ich bin mir jetzt nicht sicher, ob VK_UP zu WPARAM passt... Aber du könntest auch eine Abfrage per GetAsyncKeystate oder GetKeystate machen (im OnTimer). Davon weiß ich sicher, dass es geht:
Delphi-Quelltext
1: 2:
| if GetAsyncKeystate(VK_UP) < 0 then |
@wunsiedler: Jetzt sehe ich es. :? Hatte jetzt krampfhaft nach Canvas gesucht, aber logisch, dass das nicht vorkommt, wenn man die Images bewegt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!