![]() |
Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&
Ein einziges Problem hindert an dem weiterkommen meines Rollenspieles :wall: !!!
Jeder kennt Diablo, Baal oder Sacred. Ein typisches Rollenspiel eben wo der Spieler im Mittelpunkt fixiert ist und sich nur alles rundherum bewegt. Mein Spiel ist natürlich mit DelphiX gemacht und meine Delphiversion ist 4. Da es natürlich mehrere Büsche im Spiel gibt, welche dieselben Eigenschaften haben, deklariere ich jeden Busch als zB. TBusch, Ein Beispiel zum erstellen dieser Büsche wäre so:
Delphi-Quellcode:
Nun gibt es 2 Büsche, die dieselben Eigenschaften haben, aber unterschiedliche Koordinaten.
for i:= 1 to 2 do begin
with TBusch.Create(DXSpriteEngine1.Engine) do begin x:=i*32; y:=0; end; end; Das Bewegen funktioniert, aber die collision nicht ganz, welche folgendermassen aussieht:
Delphi-Quellcode:
Nun verändern sich die Kordinaten nur von dem Busch, mit dem der Player zusammengestossen ist. Der 2 Busch "ignoriert" die collision bzw erfährt keine. Es wird ziemlich alles gleich gemacht, wie bei den DelphiX Tutorials auf
procedure TBusch.DoCollision(Sprite: TSprite; var Done: Boolean);
begin if sprite is TPlayer then begin x:=x-32 {Nur als Beispiel} end; end; ![]() Ich hab auch schon folgendes versucht:
Delphi-Quellcode:
Nun bekommt jeder Busch eine zusäztliche Zahl und bei einer collision mit einem Busch, kann ich eine FOR-Schleife aufrufen, damit er das mit allen Büschen macht. Mit Delphi 6 personal funktioniert das einigermassen, aber auch nicht besonders und ich habe ja nur Delphi4. Da funktioniert das gar nicht.
var Busch: array of TBusch;
Es wird doch jemand mal ein Rollensiel, Jump&Run oder anderes mit DelphiX, wo der Spieler im Mittelpunkt fixiert ist, programmiert haben. Ich bekomm das einfach nicht hin :cry: Danke im Vorraus, ISAS :thuimb: |
Re: Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&
Hallo Isas,
Die DxSpriteEngine von DelphiX hat selbst Koordinaten (DxSpriteEngine1.X und DxSpriteEngine1.Y). Wenn du diese veränderst, dann werden alle Sprites dieser SpriteEngine verschoben. Du könntest einfach den Spieler bewegen und die Koordinaten der einzelnen Büsche (Sprites) gleich lassen und nur die Koordinaten der SpriteEngine so angleichen, dass der Spieler immer in der Mitte ist. Grüße Seniman |
Re: Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Hier mal der Quellcode des einfachsten Beispiel für dieses Thema. In diesem Beispiel kollidiert ein Sprite (von TBusch) mit TPlayer. Ich hab dir meine EXE dazugehängt und wie du sehen wirst, "kollidiert" er wirklich nur mit dem sprite. Obwohl es sich doch um TBusch handelt.
unit Unit1;
interface uses Windows, Messages, SysUtils, Inifiles, Classes, Graphics, Controls, Forms, Dialogs, DXDraws, Grids, StdCtrls, ExtCtrls, DXClass, DXSprite, DXInput; type TForm1 = class(TForm) DXImageList1: TDXImageList; DXSpriteEngine1: TDXSpriteEngine; DXTimer1: TDXTimer; DXInput1: TDXInput; DXDraw1: TDXDraw; procedure DXTimer1Timer(Sender: TObject; LagCount: Integer); procedure FormCreate(Sender: TObject); private { Private-Deklarationen} public { Public-Deklarationen} end; TPlayer = class(TImageSprite) public constructor Create(AParent: TSprite ); override; end; TAnimation = class(TImageSprite) public status:integer; procedure DoMove(MoveCount: Integer); override; procedure DoCollision(Sprite: TSprite; var Done: Boolean); override; constructor Create(AParent: TSprite ); override; end; var Form1: TForm1; Animation:TAnimation; Player: TPlayer; implementation {$R *.DFM} constructor TAnimation.Create(AParent: TSprite ); begin inherited Create(AParent); Image:=Form1.DXImageList1.Items[0]; Width :=Image.Width; Height :=Image. Height; end; constructor TPlayer.Create(AParent: TSprite ); begin inherited Create(AParent); Image:=Form1.DXImageList1.Items[1]; Width :=Image.Width; Height :=Image. Height; end; procedure TAnimation.DoMove(MoveCount: Integer); begin inherited DoMove(MoveCount); If isUp in Form1.DXInput1.States Then begin Y := Y -2; status:=1; end; If isDown in Form1.DXInput1.States Then begin Y := Y + 2; status:=2; end; If isLeft in Form1.DXInput1.States Then begin X := X -2; status:=3; end; If isRight in Form1.DXInput1.States Then begin X := X +2; status:=4; end; collision; end; procedure Tanimation.DoCollision(Sprite: TSprite; var Done: Boolean); begin if sprite is TPlayer then begin if status=1 then Y:=Y+2; if status=2 then Y:=Y-2; if status=3 then x:=x+2; if status=4 then x:=x-2; end; end; procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer); begin DXInput1.Update; DXSpriteEngine1.Move(1); DXDraw1.Surface.Fill(0); DXSpriteEngine1.Draw; DXDraw1.Flip; end; procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin with TPlayer.Create(DXSpriteEngine1.Engine) do begin x:=100; y:=100; end; for i:= 1 to 3 do begin with TAnimation.Create(DXSpriteEngine1.Engine) do begin x:=64*i; y:=0; end; end; end; end. |
Re: Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&
PS: So ganz versteh ich das aber nicht, wie du das meinst. :wiejetzt:
|
Re: Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&
Naja, egal. Hab das nun so gemacht, das vor TGegenstand.DoMove ein TPlayer.DoMove hinkommt. Nun bewegt sich zuerst der Player, schaut ob eine collision vorhanden ist, reagiert dann auch entsprechend und geht dann wieder in den Mittelpunkt. Dann bewegt sich erst TGegenstand oder nicht.
Delphi-Quellcode:
Trotzdem Danke!!!
Procedure TPlayer.DoMove(MoveCount: Integer);
Begin Inherited domove(movecount); If isup in form1.dxinput1.states Then Begin y:=y-32; status:=1; collision .... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz