Autor |
Beitrag |
the-kecks
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Fr 05.06.09 23:33
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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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
_________________ Na denn, dann. Bis dann, denn.
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Sa 06.06.09 08:49
Das sieht mir stark verdächtig nach dem selben Thema aus, wie pütger ja hier auch machen möchte.
(Wusste ich doch, dass ich es vor kurzem schon mal gelesen habe!)
Geht ihr in die selbe Klasse?
|
|
wunsiedler
      
Beiträge: 506
Erhaltene Danke: 4
Win7
|
Verfasst: Sa 06.06.09 09:57
Vielleicht hilft dir das hier weiter. Habe ich vor Jahren mal erstellt:
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
Einloggen, um Attachments anzusehen!
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: 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  ). 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
Einloggen, um Attachments anzusehen!
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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.  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. 
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 06.06.09 19:00
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: 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?  |
O.o ich glaub du verstehst das falsch. lad dir mal die exe von wunsiedler
mfg
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Sa 06.06.09 19:59
Da sehe ich ein schönes Ping-Pong-Spiel.  Bei dir aber nicht. Verständlicherweise hat dir wunsiedler also nicht den gesamten Quellcode geschickt.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: 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
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
      
Beiträge: 506
Erhaltene Danke: 4
Win7
|
Verfasst: So 07.06.09 11:25
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: So 07.06.09 14:25
|
|