![]() |
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:
Hoffe dass mir jemand helfen kann.
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. Gruß Spurius |
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:
Wenn du aber ein "Maschinengwehr" willst, musst du das anders realisieren!
if assigned(mg) then
fire := 0 else fire := 1; 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:
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.
with Tmg.Create(Engine) do
begin X := self.X; // Schuss wird genau beim TCar erzeugt Y := self.y; Z := 1; end; |
Re: DelphiX "Schussproblem"
Kannst du mir vielleicht kurz Beispielcode posten, wie das mit dem Constructor geht?
|
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; |
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. |
Re: DelphiX "Schussproblem"
Wenn du
Delphi-Quellcode:
schreiben willst, so musst du das Objekt so erzeugen:
mg.y := mg.y + 3;
Delphi-Quellcode:
mg := Tmg.create(engine);
with mg do begin x := car.X; y := car.Y; end; |
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. |
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] |
Re: DelphiX "Schussproblem"
![]() |
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:
[Edit]
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. 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. |
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