Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DelphiX "Schussproblem" (https://www.delphipraxis.net/15738-delphix-schussproblem.html)

Spurius 3. Feb 2004 16:25


DelphiX "Schussproblem"
 
Hallo,
ich will, das dass Objekt "car" Schüsse abgibt, wenn ich die Leertaste drücke. Bisher wird erst ein neuer Schuss abgefeuert, wenn der alte zerstört ist.
Ich hab im Moment ne Funktion eingebaut, die verhindert, dass sich eine Schusswarteschlange bildet.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXSprite, DXDraws, StdCtrls, DXInput, DXClass;

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    DXSpriteEngine1: TDXSpriteEngine;
    DXInput1: TDXInput;
    DXTimer1: TDXTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure carcreate;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 type
  tcar = class(timagesprite)
   public
    munitionmg: integer;
    ausrichtung: byte;
    procedure DoMove(MoveCount: Integer); override;
    procedure shootmg;

 end;
 type
  tmg = class(timagesprite)
   public

   end;
var
  Form1: TForm1;
  car: tcar;
  mg: tmg;
  fire,start: integer;
implementation

{$R *.dfm}
procedure tform1.carcreate;
begin
 car := tcar.Create(dxspriteengine1.Engine);
 car.Image := dximagelist1.Items.Find('1');
 car.X := 0;
 car.Y := 0;
 car.ausrichtung := 1;
 car.Width := car.Image.Width;
 car.Height := car.Image.Height;
 car.munitionmg := 10;
end;
procedure tcar.shootmg;
var i:integer;
begin
 fire := 0;
 mg := tmg.Create(form1.dxspriteengine1.Engine);
 mg.X := car.X;
 mg.Y := car.Y;
 mg.Image := form1.dximagelist1.Items.Find('mg');
 mg.Width := mg.Image.Width;
 mg.Height := mg.Image.Height;
for i := 1 to 100 do begin
   if car.ausrichtung = 1 then begin
   mg.y := mg.y + 3;
   form1.dxinput1.Update;
   form1.dxspriteengine1.Move(0);
   form1.dxspriteengine1.Dead;
   form1.dxdraw1.Surface.Fill(222);
   form1.dxspriteengine1.Draw;
   form1.dxdraw1.Flip;
   end;
   if car.ausrichtung = 2 then begin
   mg.X := mg.X + 3;
   form1.dxinput1.Update;
   form1.dxspriteengine1.Move(0);
   form1.dxspriteengine1.Dead;
   form1.dxdraw1.Surface.Fill(222);
   form1.dxspriteengine1.Draw;
   form1.dxdraw1.Flip;
   end;
 end;
   mg.Free;
   mg := nil;
   form1.dxspriteengine1.Move(0);
   form1.dxspriteengine1.Dead;
   form1.dxdraw1.Surface.Fill(222);
   form1.dxspriteengine1.Draw;
   form1.dxdraw1.Flip;
   car.munitionmg := car.munitionmg -1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 form1.DoubleBuffered := true;
 dxdraw1.DoubleBuffered := true;
 dxdraw1.Height := form1.Height;
 dxdraw1.Width := form1.Width;
 fire := 1;
 carcreate;
end;
procedure tcar.DoMove(movecount: integer);
begin
 if isLeft in Form1.DxInput1.States then begin
    car.X := car.X -3;
    car.ausrichtung := 4;
    end;
  if isRight in Form1.DxInput1.States then begin
    car.X := car.X +3;
    car.ausrichtung := 2;
    end;
  if isdown in Form1.DxInput1.States then begin
    car.y := car.y +3;
    car.ausrichtung := 3;
    end;
  if isup in Form1.DxInput1.States then begin
    car.y := car.y -3;
    car.ausrichtung := 1;
    end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
 form1.dxspriteengine1.Draw;
 form1.dxdraw1.Flip;
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
 dxinput1.Update;
 dxspriteengine1.Move(0);
 dxspriteengine1.Dead;
 dxdraw1.Surface.Fill(222);
 dxspriteengine1.Draw;
 dxdraw1.Flip;
 if assigned(mg) then fire := 0 else fire := 1;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if (key = vk_space) and (car.munitionmg > 0) and (fire = 1) then begin

   car.shootmg;
 end;
 if key=vk_escape then application.Terminate;
end;

end.
Hoffe dass mir jemand helfen kann.
Gruß
Spurius

Dagon 3. Feb 2004 16:55

Re: DelphiX "Schussproblem"
 
Hallo

Zuerst möchte ich mal bemerken, dass dein Code ziemlich unübersichtlich ist!

Und nun zu deinem Probelm:

Ich nehem an, es liegt an folgenden Zeilen:
Delphi-Quellcode:
if assigned(mg) then
  fire := 0
else
  fire := 1;
Wenn du aber ein "Maschinengwehr" willst, musst du das anders realisieren!

1. Du solltest mal deinen Klassentyp Tmg überarbeiten (mit Constructor versehen, Methoden wie DoMove und DoCollision überschreiben etc.)!

2. Du kannst dann mit Typ auf folgende Art Schüsse erzeugen (Code sollte z. B. in der DoMove-Methode von TCar sein):
Delphi-Quellcode:
with Tmg.Create(Engine) do
          begin
            X := self.X; // Schuss wird genau beim TCar erzeugt
            Y := self.y;
            Z := 1;
          end;
Du muss nurnoch z. B. in der DoMove-Methode vom Tmg abfragen, ob der Schuss über den Spielfeldrand hinaus ist und wenn ja, dann mit Dead zerstören.

Spurius 3. Feb 2004 20:18

Re: DelphiX "Schussproblem"
 
Kannst du mir vielleicht kurz Beispielcode posten, wie das mit dem Constructor geht?

Dagon 3. Feb 2004 20:29

Re: DelphiX "Schussproblem"
 
Bezogen auf den Code von oben:

Delphi-Quellcode:
type
  tmg = class(timagesprite)
  public
    constructor Create(AParent: TSprite); override;
  end;

[...]

constructor tmg.Create(AParent: TSprite);
begin
  inherited Create (AParent);
  Image := Form1.DXImageList1.Items.Find('Schuss');
  Width := Image.Width;
  Height := Image.Height;
end;

Spurius 4. Feb 2004 13:56

Re: DelphiX "Schussproblem"
 
Sorry wenn der Code unübersichtlich ist :oops:
Ich bekomm jetzt eine Zugriffsverletzung:
Delphi-Quellcode:
type
  tcar = class(timagesprite)
   public
    munitionmg: integer;
    ausrichtung: byte;
    procedure DoMove(MoveCount: Integer); override;
    procedure shootmg;
  end;
 type
  tmg = class(timagesprite)
   public
     constructor create(aparent: tsprite); override;
   end;
var
  Form1: TForm1;
  car: tcar;
  mg: tmg;
  fire,start: integer;
implementation

{$R *.dfm}
constructor tmg.create(aparent: tsprite);
begin
 inherited create(aparent);
 Image := form1.dximagelist1.Items.Find('mg');
 Width := Image.Width;
 Height := Image.Height;
end;
procedure tform1.carcreate;
begin
 car := tcar.Create(dxspriteengine1.Engine);
 car.Image := dximagelist1.Items.Find('1');
 car.X := 0;
 car.Y := 0;
 car.ausrichtung := 1;
 car.Width := car.Image.Width;
 car.Height := car.Image.Height;
 car.munitionmg := 10;
end;
procedure tcar.shootmg;
var i:integer;
begin
 fire := 0;
 with tmg.create(engine) do
  begin
   x := car.X;
   y := car.Y;
  end;
for i := 1 to 100 do begin
   if car.ausrichtung = 1 then begin
   mg.y := mg.y + 3;                      // <<<<<<<<<<< Da
   form1.dxinput1.Update;
   form1.dxspriteengine1.Move(0);
   form1.dxspriteengine1.Dead;
   form1.dxdraw1.Surface.Fill(222);
   form1.dxspriteengine1.Draw;
   form1.dxdraw1.Flip;
   end;
   if car.ausrichtung = 2 then begin
   mg.X := mg.X + 3;
   form1.dxinput1.Update;
   form1.dxspriteengine1.Move(0);
   form1.dxspriteengine1.Dead;
   form1.dxdraw1.Surface.Fill(222);
   form1.dxspriteengine1.Draw;
   form1.dxdraw1.Flip;
   end;
 end;
   mg.Free;
   mg := nil;
   form1.dxspriteengine1.Move(0);
   form1.dxspriteengine1.Dead;
   form1.dxdraw1.Surface.Fill(222);
   form1.dxspriteengine1.Draw;
   form1.dxdraw1.Flip;
   car.munitionmg := car.munitionmg -1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 form1.DoubleBuffered := true;
 dxdraw1.DoubleBuffered := true;
 dxdraw1.Height := form1.Height;
 dxdraw1.Width := form1.Width;
 fire := 1;
 carcreate;
end;
procedure tcar.DoMove(movecount: integer);
begin
 if isLeft in Form1.DxInput1.States then begin
    car.X := car.X -3;
    car.ausrichtung := 4;
    end;
  if isRight in Form1.DxInput1.States then begin
    car.X := car.X +3;
    car.ausrichtung := 2;
    end;
  if isdown in Form1.DxInput1.States then begin
    car.y := car.y +3;
    car.ausrichtung := 3;
    end;
  if isup in Form1.DxInput1.States then begin
    car.y := car.y -3;
    car.ausrichtung := 1;
    end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
 form1.dxspriteengine1.Draw;
 form1.dxdraw1.Flip;
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
 dxinput1.Update;
 dxspriteengine1.Move(0);
 dxspriteengine1.Dead;
 dxdraw1.Surface.Fill(222);
 dxspriteengine1.Draw;
 dxdraw1.Flip;
 if assigned(mg) then fire := 0 else fire := 1;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if (key = vk_space) and (car.munitionmg > 0) and (fire = 1) then begin

   car.shootmg;
 end;
 if key=vk_escape then application.Terminate;
end;

end.

Dagon 4. Feb 2004 14:09

Re: DelphiX "Schussproblem"
 
Wenn du
Delphi-Quellcode:
  mg.y := mg.y + 3;
schreiben willst, so musst du das Objekt so erzeugen:
Delphi-Quellcode:
mg := Tmg.create(engine);
with mg do
begin
   x := car.X;
   y := car.Y;
end;

Spurius 4. Feb 2004 14:20

Re: DelphiX "Schussproblem"
 
So, habs umgeändert, geht jetzt, aber das im ersten Post beschriebene Problem ist immer noch da.
Ich hab das Fire-Zeug rausgenommen.

Dagon 4. Feb 2004 14:40

Re: DelphiX "Schussproblem"
 
Ich werde den Code mal selber ein bisschen überarbeiten, damit es richtig funktioniert. Es sind nämlich mehrere Änderungen nötig.

Z. B. solltest du den Code von tform1.carcreate in den Constructor von TCar tun und die Abfrage der Richtung sollte nicht in der Methode tcar.shootmg stattfinden, sondern direkt in der DoMove-Methode von tmg.

[Edit]
Könntest du mir am besten mal das ganze Projekt hochladen? So kann ich am schnellsten und eifachsten das ganze ein bisschen ordnen. Danke
[/Edit]

Spurius 4. Feb 2004 15:29

Re: DelphiX "Schussproblem"
 
Hier kannst du das Prog downloaden.

Dagon 4. Feb 2004 16:27

Re: DelphiX "Schussproblem"
 
So, ich hab den Code mal ein bisschen überarbeitet. Jetzt ist er übersichtlicher und die gröbsten Fehler sind weg.

Was ich dir nicht korrigiert habe, da du dich selber damit beschäftigen sollst, ist, dass der Schuss die Richtung wechselt sobald der Wagen Richtung wechselt. :wink:

Also hier nun die Lauffähige Unit (kleine Fehler sind nicht ausgeschlossen):

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXSprite, DXDraws, StdCtrls, DXInput, DXClass;

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    DXSpriteEngine1: TDXSpriteEngine;
    DXInput1: TDXInput;
    DXTimer1: TDXTimer;
    procedure FormCreate(Sender: TObject);
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TAusrichtung = (auLeft, auRight, auUp, auDown);

  TCar = class(TImageSprite)
  private
    FMunitionMG: Integer;
    FAusrichtung: TAusrichtung;
  public
    constructor Create (AParent: TSprite); override;
    procedure Schiessen;
    procedure DoMove(MoveCount: Integer); override;
    property Ausrichtung: TAusrichtung read FAusrichtung write FAusrichtung;
    property Munition: Integer read FMunitionMG write FMunitionMG;
  end;

  TMG = class(TImageSprite)
  public
    constructor create(aparent: tsprite); override;
    procedure DoMove(MoveCount: Integer); override;
  end;

var
  Form1: TForm1;
  Car: TCar;

implementation

{$R *.dfm}

{ --- TCar --- }

constructor TCar.Create(AParent: TSprite);
begin
  inherited;
  Image := Form1.DXImageList1.Items.Find('1');
  Width := Image.Width;
  Height := Image.Height;
  FAusrichtung := auLeft;
  X := 0;
  Y := 0;
  Z := 1;
  FMunitionMG := 10;
end;

procedure TCar.DoMove(movecount: integer);
begin
  inherited;
  if IsLeft in Form1.DxInput1.States then
  begin
    X := X - 3;
    FAusrichtung := auLeft;
  end;
  if IsRight in Form1.DxInput1.States then
  begin
    X := X + 3;
    FAusrichtung := auRight;
  end;
  if IsDown in Form1.DxInput1.States then
  begin
    Y := Y + 3;
    FAusrichtung := auDown;
  end;
  if IsUp in Form1.DxInput1.States then
  begin
    Y := Y - 3;
    FAusrichtung := auUp;
  end;
end;

procedure TCar.Schiessen;
begin
  Dec(FMunitionMG);
  with TMG.Create(engine) do
  begin
   x := self.X;
   y := self.Y;
  end;
end;

{ ---------- }

{ --- TMG --- }

constructor TMG.create(aparent: tsprite);
begin
 inherited create(aparent);
 Image := Form1.DXImagelist1.Items.Find('mg');
 Width := Image.Width;
 Height := Image.Height;
end;

procedure TMG.DoMove(MoveCount: Integer);
begin
  inherited;
  case Car.Ausrichtung of
    auLeft: X := X - 3;
    auRight: X := X + 3;
    auUp: Y := Y - 3;
    auDown: Y := Y + 3;
  end;
 
  if (X > Form1.DXDraw1.Width) or (X < 0) then
    Dead;
  if (Y > Form1.DXDraw1.Height) or (Y < 0) then
    Dead;
end;

{ ---------- }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Car := TCar.Create (DXSpriteEngine1.Engine);
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  DXInput1.Update;
  DXDraw1.Surface.Fill(222);
  DXSpriteEngine1.Draw;
  DXSpriteEngine1.Move(20);
  DXSpriteEngine1.Dead;
  DXDraw1.Flip;
  if isButton3 in DXInput1.States then Close;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_SPACE then
  begin
    if Car.Munition > 0 then
      Car.Schiessen;
  end;
end;

end.
[Edit]
Noch was: Stell das Intervall des Timers nicht auf so kleine Werte wie 1. Nimm lieber 50 oder so.
[/Edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz