Autor Beitrag
the-kecks
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157
Erhaltene Danke: 1

Windows Vista Home Premium 64Bit
Delphi 7 Ent.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 06.06.09 08:49 
Das sieht mir stark verdächtig nach dem selben Thema aus, wie user profile iconpü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
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 506
Erhaltene Danke: 4

Win7

BeitragVerfasst: Sa 06.06.09 09:57 
Vielleicht hilft dir das hier weiter. Habe ich vor Jahren mal erstellt:

ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
// Grenzen der Bewegungen festlegen
 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;

// Startzustand
 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 bewegen =====

 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;

 //===== Linken Schläger bewegen =====

 if(ball_x < 0)then begin
    differenz := schlaeger_links_top - ball_top;

    if(differenz < 0then begin
       schlaeger_links_top := schlaeger_links_top + geschwindigkeit; end
    else begin
       schlaeger_links_top := schlaeger_links_top - geschwindigkeit;end;
    if (schlaeger_links_top < 75then schlaeger_links_top := 75;
    if (schlaeger_links_top > 430then schlaeger_links_top := 430;
    Image2.Top := schlaeger_links_top - 15;
 end;

 //===== Rechten Schläger bewegen =====

 if(ball_x > 0)then begin
    differenz := schlaeger_rechts_top - ball_top;

    if(differenz < 0then begin
       schlaeger_rechts_top := schlaeger_rechts_top + geschwindigkeit end
    else begin
       schlaeger_rechts_top := schlaeger_rechts_top - geschwindigkeit;end;
    if (schlaeger_rechts_top < 75then schlaeger_rechts_top := 75;
    if (schlaeger_rechts_top > 430then 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157
Erhaltene Danke: 1

Windows Vista Home Premium 64Bit
Delphi 7 Ent.
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157
Erhaltene Danke: 1

Windows Vista Home Premium 64Bit
Delphi 7 Ent.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Sa 06.06.09 19:00 
user profile iconthe-kecks hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157
Erhaltene Danke: 1

Windows Vista Home Premium 64Bit
Delphi 7 Ent.
BeitragVerfasst: Sa 06.06.09 19:35 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157
Erhaltene Danke: 1

Windows Vista Home Premium 64Bit
Delphi 7 Ent.
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
begin
  [...] 
  DoubleBuffered := true;
  Application.OnMessage := appmessage;
  [...]
end;

-AppMessage
ausblenden volle Höhe 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
ausblenden 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 < 55then Spieler_top := 55;
     if (Spieler_top > 967then Spieler_top := 967;
     Spieler.Top := Spieler_top;
   end;
   if key1='up' then
    begin
     Spieler_top := Spieler_top + geschwindigkeit;
     if (Spieler_top < 55then Spieler_top := 55;
     if (Spieler_top > 967then Spieler_top := 967;
     Spieler.Top := Spieler_top;
   end;
end;

der reagiert einfach nicht auf den tastendruck

mfg
wunsiedler
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 506
Erhaltene Danke: 4

Win7

BeitragVerfasst: So 07.06.09 11:25 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
if GetAsyncKeystate(VK_UP) < 0 then
  // Taste [^] wurde gedrückt


@wunsiedler: Jetzt sehe ich es. :? Hatte jetzt krampfhaft nach Canvas gesucht, aber logisch, dass das nicht vorkommt, wenn man die Images bewegt.
the-kecks Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157
Erhaltene Danke: 1

Windows Vista Home Premium 64Bit
Delphi 7 Ent.
BeitragVerfasst: So 07.06.09 14:25