Autor Beitrag
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 02.02.04 00:35 
Hi,

Ich habe gerade mal angefangen ein bsichen mit DelphiX rumzuspielen...
Da hab ich das entsprechende Tutorial aus dem Delphi-Treff angefangen, aber habe da folgendes Problem....

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
 if not DXDraw1.CanDraw then Exit;

  inc(y);

  dximagelist1.Items[0].draw(DXDraw1.Surface, 50,y, 0);
  DXDraw1.Flip;

end;


Das ist so ungefähr der Code aus dem Tut . (habs ein bischen vereinfacht, im Orginal bounct das Bild im DxDraw)...

Nun wandert das Bild bei mir acuh nach unten und im Orginal hat es auch gebounct, aber die jeweils "alten frames" werden nicht gelöscht. Das Bild zieht also eine Spur hinter sich her... (So wie die SolitärKarten bei Spielende).....

Leider wird im Tutorial darauf gar nicht eingegangen, also woran liegts das das bild Spuren zieht.......

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Mo 02.02.04 11:06 
Vielleicht solltest Du dann einfach den Buffer einmal am Anfang entleeren. Es ist schon lange her, dass ich das gemacht habe. Auf jeden Fall solltest Du es in allen Samples die bei DelphiX dabei sind finden...
IMAO:
ausblenden Delphi-Quelltext
1:
DXDraw1.Surface.Fill(0);					

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 02.02.04 15:41 
Ja, danke für den Tipp.

In späteren Kapiteln des Tuts taucht die Zeile dann auch auf...

Nun hab ich aber mit einem anderen Problem (gleiches Tut, dass vom Delphi-Treff) zu kämpfen....

es geht um Spritekollision....

Ich mache alles so (wie im Tut erklärt),:

Hier mal der Quelltext (aus dem Tut):

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:
{ Kollision zwischen Sprites
In diesem Kapitel werde ich zeigen, wie einfach es ist, festzustellen, ob zwei Sprites gegeneinander gestoßen sind.

Zuerst werden wir in unser Beispiel vom vorherigen Kapitel noch ein Bild einfügen. Wir laden ein zweites Bild in unsere DXImageList Komponente und geben ihm den Namen "Stein". Dann erzeugen wir unser zweites Bild auf unsere DXDraw Oberfläche: }


TAnimation = class(TImageSprite)
public
  procedure DoMove(MoveCount: Integer); override; {war schon da}
  constructor Create(AParent: TSprite ); override; {war schon da}
  procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
end;

TGegenstand = class(TImageSprite)
public
constructor Create(AParent: TSprite ); override;
end;

var
  Form1: TForm1;
  Animation:tanimation;
  Gegen: TGegenstand;

implementation


constructor TGegenstand.Create(AParent: TSprite );
begin
  inherited Create(AParent);
  Image:=Form1.DXImageList1.Items.Find('Stein');
  Width := Image.Width;
  Height := Image. Height;
  Visible:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TAnimation.Create(DXSpriteEngine1.Engine) do
    begin
      x:=0;
      y:=0;
    end;
  with TGegenstand.Create(DXSpriteEngine1.Engine) do
    begin
      x:=40;
      y:=40;
    end;
end;
{ Wie vielleicht schon gesehen wurde, haben wir eine neue Prozedur: DoCollision
Die sollte wie folgt aussehen: }


procedure TAnimation.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if sprite is TGegenstand then
    begin
      beep;
      dead;   // DAS HIER KLAPPT NICHT !!! :-(((   ??????!!!!!!!!
    end;
end;
{ Mit Sprite kann man überprüfen gegen wen TAnimation gestoßen ist. In diesem Beispiel also gegen unser zweites Bild.
Mit dead wird TAnimation gelöscht.

Damit jedes mal auf Kollision überprüft wird, wenn sich unser Sprite bewegt, müssen wir in die Move Prozedur folgendes einfügen: }


procedure TAnimation.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount); 
  If isUp in Form1.DXInput1.States Then
    Y := Y -10;
  If isDown in Form1.DXInput1.States Then
    Y := Y + 10;
  If isLeft in Form1.DXInput1.States Then
    X := X -10;
  If isRight in Form1.DXInput1.States Then
    X := X +10;
  AnimCount := 5;
  AnimLooped := True;
  AnimSpeed := 20/1000;
  AnimStart := 0;

  Collision;
end;



Zitat:
Das war's dann wieder mal. Per F9 kann sich wieder die vollendete Arbeit angucken.


Naja, oder auch nicht :-(
Bei der Kollision piepst es zwar wiie versprochgen, aber das Sprite verschwindet nicht .. warum?

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Mo 02.02.04 15:46 
wie sieht denn die "Dead"-Prozedur aus?
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 02.02.04 18:13 
Zitat:
wie sieht denn die "Dead"-Prozedur aus?


Keine Ahnung.... ?!
Die wird im Rahmen des Tutorials nicht implementiert und der Autor des Tuts sagt nur das dadurch das Objekt gelöscht wird /was immer das heissen mag)...
Dead ist letztenendes eine Methode von TImageSprite...
(Von der ja die Klasse TNaimation abstammt......)

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Seniman
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 42


D6 Pers
BeitragVerfasst: Mo 02.02.04 19:01 
Hallo Catweasel,

du brauchst in der Timer-Prozedur unbedingt die Zeile
ausblenden Delphi-Quelltext
1:
DxSpriteEngine1.dead;					

Wenn du bei irgendeinem Sprite den Befehl "dead" aufrufst, dann wird es nur als tot makiert. Erst mit der oben angegebenen Zeile wird es dann tatsächlich gelöscht.

Grüße Seniman
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 02.02.04 19:57 
Hey danke.. das hat funktioniert :-)

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.