Autor Beitrag
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mo 27.06.05 12:01 
DelphiX einfache Bewegung einer Figur + PixelKollision

So Leute, das ist mein 2. Tutorial, welches sich wiedermal um DelphiX dreht.
Jemand hat sich dieses Tutorial gewünscht und soll es auch bekommen :D

Fangen wir dann mal an.

(1). Komponenten platzieren und einstellen

- Platziert ein DXDraw Objekt auf eurem Formular.

- Stellt dort Align auf alClient.

- Jetzt noch eine DXImageList.

- Dort muss noch per doppelklick das DXDraw ausgewählt werden (Bilder fügen wir später hinzu).

- Jetzt noch eine DXSpriteEngine, dort das gleiche mit dem DXDraw.

- Einen DXTimer, mit interval 0 (man kann auch andere Werte nehmen, um die FPS einzudämmen, aber so kommt man eben auf die höchste Framezahl und das ist für Kollisionen ganz nützlich).

- Als letztes noch ein DXImput

(2). Die richtigen Animationen

- Für dieses Tutorial solltet ihr die beiligenden (Anhang) Animationen verwenden.

- Doppelklick auf das DXImageList Objekt und wählt die Bilder aus dem anhang aus.

- Ordnet die Bilder in dieser Reihenfolge:

    North
    South
    West
    East

-das 2. Bild der Animation ist das Bild indem keine Bewegung stattfindet, also die Figur steht, von dem Bild gehen dann alle Bewegungen aus.

- TransparentColor der Bilder muss auf clFuchsia und Transparent auf true stehen

- Patternwidthund Patternheight stellen wir für unser Beispiel auf 19, das sind Breite un Höhe der einzelnen Bilder.

(2). Die Animation

- So, zu allererst eine neue Klasse:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TPlayer = class(TImageSprite)
  public
    procedure DoMove(MoveCount: Integer); override;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
  end;

- DoMove wird unsere Bewegung.

- DoCollision ist später für die Kollision wichtig.

- Nun zur eigentlichen Bewegung (sieht wilder aus, als es ist):
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:
procedure TPlayer.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
  AnimStart := 1;
  AnimCount := 0;
  If (isup in GameForm.DXInput1.States) and not (isdown in GameForm.DXInput1.States) and not (isleft in GameForm.DXInput1.States) and not (isright in GameForm.DXInput1.States) then
    with Player1 do
      begin
        image := GameForm.DXImageList1.Items[0];
        AnimStart := 0;
        AnimCount := image.patterncount;
        y := y - 1;
      end;
  If (isdown in GameForm.DXInput1.States) and not (isup in GameForm.DXInput1.States) and not (isleft in GameForm.DXInput1.States) and not (isright in GameForm.DXInput1.States) then
    with Player1 do
      begin
        image := GameForm.DXImageList1.Items[1];
        AnimStart := 0;
        AnimCount := image.patterncount;
        y := y + 1;
      end;      
  If (isleft in GameForm.DXInput1.States) and not (isright in GameForm.DXInput1.States) and not (isup in GameForm.DXInput1.States) and not (isdown in GameForm.DXInput1.States) then
    with Player1 do
      begin
        image := GameForm.DXImageList1.Items[2];
        AnimStart := 0;
        AnimCount := image.patterncount;
        x := x - 1;
      end;
  If (isright in GameForm.DXInput1.States) and not (isleft in GameForm.DXInput1.States) and not (isup in GameForm.DXInput1.States) and not (isdown in GameForm.DXInput1.States)  then
    with Player1 do
      begin
        image := GameForm.DXImageList1.Items[3];
        AnimStart := 0;
        AnimCount := image.patterncount;
        x := x + 1;
      end;
end;

- Also nehmen wir das gewurschtel mal auseindander:
ausblenden Delphi-Quelltext
1:
2:
3:
  inherited DoMove(MoveCount);  //altes DoMove aufrufen
  AnimStart := 1;  //Das "Standbild"
  AnimCount := 0;  //Animation steht still

- dann taucht 4 mal sowas hier auf,
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  If (isup in GameForm.DXInput1.States) and not (isdown in GameForm.DXInput1.States) and not (isleft in GameForm.DXInput1.States) and not (isright in GameForm.DXInput1.States) then
    with Player1 do
      begin
        image := GameForm.DXImageList1.Items[0];
        AnimStart := 0;
        AnimCount := image.patterncount;
        y := y - 1;
      end;

- erstmal wird abgefragt, ob nicht schon eine andere Richtungstaste gedrückt wurde, weil dann soll garnischt passieren, es soll nur eine gedrückt sein.

- Die Animation für die Bewegung nach Norden wird geladen (Bild nr 0).

- Dann wird das erste bild der aninmation auf 0 gesetzt.

- und die Animation auf ihre Maximale Länge.

- und das bild wird um die y achse verschoben (es bewegt sich nach oben).

- Aber wir haben noch etwas vergessen ! ja richtig, das Objekt zu erstellen.

- Wir brauchen also eine Globale Variable mit dem Namen Player1, das Erstellen ist nicht so wild:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TGameForm.FormCreate(Sender: TObject);
begin
  Player1 := TPlayer.Create(DXSpriteEngine1.Engine);  //Erstellen und Engine zuweisen
  with Player1 do
    begin
      image := dximagelist1.items[1];  //StartBild auswählen 
      AnimStart := 1;
      AnimCount := 0;
      AnimLooped := true;  //Animation als Schleife
      AnimSpeed := 1/150;  //Geschwindigkeit
      width := image.width;  //Breite
      height := image.height;  //Höhe
      x := GameForm.ClientWidth div 2 - width div 2;  //X Position
      y := GameForm.ClientHeight div 2 - width div 2;  //Y Position
      z := 1;
    end;
end;

- Aber was hat das Z zu bedeuten, wir arbeiten doch nicht in 3d ?

- Nein, das Z zeigt an, in welcher reihenfolge die Bilder gezeichnet werden.

- Das mit dem kleinsten Z als erstes und das mit dem größten als letztes (befindet sich also oben).

- jetzt kommt unser Timer dran:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TGameForm.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  DXInput1.Update;  //Input auflisten
  DXDraw1.Surface.Fill(clBlack);  //Bild mit schwarz füllen
  DXSpriteEngine1.Draw;  //Unsere Sprites zeichnen
  DXSpriteEngine1.Move(20);  //Bewegung
  DXDraw1.Flip;  //Rendern
end;


- Jetzt können wir unsere Figur schon wunderbar bewegen :D
(wenn man DoCollision auskommentiert oder die Prozedur schon hinzufügt)

(3). Kollisionsabfrage

- Jetzt kommt das schwerste von allem die KOLLISIONSABFRAGE

- Keine Angst, es ist einfacher als es klingt, denn es ist schon fast mit nur einem Befehl getan:
ausblenden Delphi-Quelltext
1:
Collision;					

- Diese kommt ans Ende unserer DoMove Procedure.

- Warum so wenig Code ?

- Weil DelphiX die Pixelkollision für uns erledigt.

- Nur Brauchen wir erstmal etwas zum Kollidieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TBall = class(TImageSprite)
  public
    procedure Contact;
  end;

- Es reicht uns, wenn der Ball statisch ist, glaubt mir einfach, dass es auch funktioniert, wenn sich der Ball bewegt :D

- Als Bild könnt ihr euch schnell einen Ball malen, mit der hintergrundfarbe clfuchsia (R: 255, G: 0, B: 255);

- Der kommt dann in die ImageList an letzter Stelle, wird als Globale Variable Ball deklariert und wir erweitern unser Form.Create:
ausblenden 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:
procedure TGameForm.FormCreate(Sender: TObject);
begin
  Player1 := TPlayer.Create(DXSpriteEngine1.Engine);  
  with Player1 do
    begin
      image := dximagelist1.items[1];  
      AnimStart := 1;
      AnimCount := 0;
      AnimLooped := true;  
      AnimSpeed := 1/150;  
      width := image.width;  
      height := image.height;  
      x := GameForm.ClientWidth div 2 - width div 2;  
      y := GameForm.ClientHeight div 2 - width div 2;  
      z := 1;
    end;
  //Unser Ball
  Ball := TBall.Create(DXSpriteEngine1.Engine);  
  with Ball do
    begin
      image := dximagelist1.items[4];   
      x := 50
      y := 50;       
      width := image.width;
      height := image.height;
    end;
end;

- und nun zur Kollision:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TPlayer.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if Sprite is TBall then
    TBall(Sprite).Contact;
end;

- Das wars schon, es wird geprüft, ob das objekt ein Ball ist und dann die Kollision auf Seiten des Balls aufgerufen und zwar hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TBall.Contact;
begin
  beep;
end;

- Das beep ist die Reaktion des Balls auf die Kollision.

- Natürlich können da jetzt alle möglichen sachen rein, zB der Ball stirbt, bzw er verschwindet, das sähe so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TBall.Contact;
begin
  beep;
  dead;
end;

- dazu müssen wir unseren Timer aber etwas erweitern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TGameForm.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  DXInput1.Update; 
  DXDraw1.Surface.Fill(clBlack);  
  DXSpriteEngine1.Dead;
  DXSpriteEngine1.Draw;  
  DXSpriteEngine1.Move(20);  
  DXDraw1.Flip;  
end;

- Dead übernimmt das freigeben der gestorbenen Sprites

- so jetzt sind wir schon am ende angelangt, ich hoffe, es hat bei euch allen funktioniert, freue mich auf feedback, auch wenn manches etwas durcheinander geraten sein mag :lol:
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von F34r0fTh3D4rk am Sa 03.06.06 12:05, insgesamt 5-mal bearbeitet
Larus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 431



BeitragVerfasst: Di 28.06.05 15:12 
Thx erstmal das du ein Tut auf meine Bitte hin geschriebn hast 8)
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Di 28.06.05 15:24 
hübsches progrämmlein, warum ist der source ned dabei ?
übrigens tritt keine kollision auf wenn man den rand des bildes überquert :twisted:

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 28.06.05 15:25 
meinst du, das man nicht ausm bild rauslaufen darf ? das ist ja nun echt zu einfach :lol:
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Di 28.06.05 15:30 
rück mal den source raus

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 28.06.05 15:31 
den hab ich eben mal so dahin geschrieben steht auch hier im topic oben, aber wenn de willst dann schreib ich dir schnell nen neuen 8) (mit wandkollisionen)
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 28.06.05 15:56 
so retnyg, hab jetzt ein SourceCode Beispiel hochgeladen :!:

Nochmal eine kleine Anmerkung:

wenn man auch diagonale Bewegungen haben will, dann muss man den Beweungsquellcode folgendermaßen abändern:

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:
  If (isup in MainForm.DXInput1.States) and not (isdown in MainForm.DXInput1.States) then
    with Player1 do
      begin
        image := MainForm.DXImageList1.Items[0];
        AnimStart := 0;
        AnimCount := image.patterncount;
        y := y - 1;
      end;
  If (isdown in MainForm.DXInput1.States) and not (isup in MainForm.DXInput1.States) then
    with Player1 do
      begin
        image := MainForm.DXImageList1.Items[1];
        AnimStart := 0;
        AnimCount := image.patterncount;
        y := y + 1;
      end;
  If (isleft in MainForm.DXInput1.States) and not (isright in MainForm.DXInput1.States) then
    with Player1 do
      begin
        image := MainForm.DXImageList1.Items[2];
        AnimStart := 0;
        AnimCount := image.patterncount;
        x := x - 1;
      end;
  If (isright in MainForm.DXInput1.States) and not (isleft in MainForm.DXInput1.States) then
    with Player1 do
      begin
        image := MainForm.DXImageList1.Items[3];
        AnimStart := 0;
        AnimCount := image.patterncount;
        x := x + 1;
      end;

zwar fehlt uns dafür die animation, sieht aber trotzdem nicht alzu schlecht aus :D
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 29.06.05 17:59 
thx
wo kriege ich die komponenten, die ich brauche um den source zu verwenden ?user defined image

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 29.06.05 18:16 
welche delphi version hast du ?
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 29.06.05 18:18 
5 und 7, würd mir aber für die 7ner reichen user defined image

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 29.06.05 18:19 
für delphi 5 sollte es kein problem sein, ich werde editieren wenn ich den link hab :D

hier ist der link:

www.torry.net/vcl/pa...middle/hhdelphix.zip

funktioniert mit delphi 3 - 5 :wink:
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 29.06.05 18:22 
user defined image ich meine diese Delphi-X units: DXSprite, DXInput, DXDraws, DXClass

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 29.06.05 18:23 
ja der link ist oben :D
(ist glaube ich sogar aktueller als meine version, sollte aber gehen :wink: )
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 29.06.05 18:28 
wahnsinn das zeuch ist ja uralt user defined image, von anno 2000... gibts da nix neueres ?

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 29.06.05 18:46 
undelphix, musst du mal googlen, der erste link ist dann die unoffizielle delphix hp, da bekommst du undelphix auch für neue delphi versionen, ich weiß aber nicht ob mein tutorial damit 100% kompatibel ist, man kanns ja mal probieren :P
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 03.07.05 10:28 
müste unDelphiX datet delphiX ja "nur" ab und bringt es von dx 7 auf 8

_________________
MFG
Michael Springwald, "kann kein englisch...."
Darkscream
Hält's aus hier
Beiträge: 13

Win Vista/ win 7
Delphi 7
BeitragVerfasst: So 03.07.05 14:17 
Also ich hab da mal ne frage undzwar, wenn ich das so mache wie im Tutorial steht (hmm oder wenn ich das so mache wie ich denke das es im Tutorial steht :D ) dann sieht das bei mir folgendermaßen aus free.pages.at/warnant/Kollision.bmp xD und auch nur wenn ich mich bewege, denn wenn ich stehenbleibe ist das bomberman-mänchen komplett schwarz.
Ich verstehe halt nich wieso oO wäre für hilfe dankbar :)

MfG,
Darkscream
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 03.07.05 14:57 
du musst auf imagelist1 gehen dort die bilder auswählen und patternwidthund patternheight auf 19 stellen.

Hab ich das vergessen zu schreiben ? :lol:

Das ist die Breite und Höhe der einzelnen Bilder, die Anzahl der Bilder wird daraus automatisch berechnet :wink:
Darkscream
Hält's aus hier
Beiträge: 13

Win Vista/ win 7
Delphi 7
BeitragVerfasst: So 03.07.05 14:59 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
du musst auf imagelist1 gehen dort die bilder auswählen und patternwidthund patternheight auf 19 stellen.

Hab ich das vergessen zu schreiben ? :lol:


Sieht so aus ^_^ mal abgesehen davon das du vergessen hast zu sagen wo Collision; hingehört ^^
F34r0fTh3D4rk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 03.07.05 15:15 
danke für die hinweise, habs oben editiert :wink: