Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&Run) (https://www.delphipraxis.net/16725-spieler-mitte-umgebung-bewegt-sich-rollenspiel-jump-run.html)

ISAS 22. Feb 2004 15:49


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:
 for i:= 1 to 2 do begin
  with TBusch.Create(DXSpriteEngine1.Engine) do
  begin
    x:=i*32;
    y:=0;
  end;
 end;
Nun gibt es 2 Büsche, die dieselben Eigenschaften haben, aber unterschiedliche Koordinaten.
Das Bewegen funktioniert, aber die collision nicht ganz, welche folgendermassen aussieht:

Delphi-Quellcode:
procedure TBusch.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if sprite is TPlayer then
    begin
      x:=x-32 {Nur als Beispiel}
    end;
end;
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 www.delphi-treff.de .

Ich hab auch schon folgendes versucht:

Delphi-Quellcode:
var Busch: array of TBusch;
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.

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:

Seniman 23. Feb 2004 15:06

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

ISAS 23. Feb 2004 18:31

Re: Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
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.
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.

ISAS 23. Feb 2004 20:15

Re: Spieler in Mitte, Umgebung bewegt sich(Rollenspiel/Jump&
 
PS: So ganz versteh ich das aber nicht, wie du das meinst. :wiejetzt:

ISAS 1. Mär 2004 18:29

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:
Procedure TPlayer.DoMove(MoveCount: Integer);
Begin
  Inherited domove(movecount);
  If isup in form1.dxinput1.states Then Begin
  y:=y-32;
  status:=1;
  collision
....
Trotzdem Danke!!!


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