AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DelphiX "Schussproblem"
Thema durchsuchen
Ansicht
Themen-Optionen

DelphiX "Schussproblem"

Ein Thema von Spurius · begonnen am 3. Feb 2004 · letzter Beitrag vom 23. Feb 2004
Antwort Antwort
Seite 1 von 2  1 2      
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#1

DelphiX "Schussproblem"

  Alt 3. Feb 2004, 15:25
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
  Mit Zitat antworten Zitat
Dagon

Registriert seit: 13. Jul 2003
505 Beiträge
 
Delphi 7 Professional
 
#2

Re: DelphiX "Schussproblem"

  Alt 3. Feb 2004, 15:55
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.
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#3

Re: DelphiX "Schussproblem"

  Alt 3. Feb 2004, 19:18
Kannst du mir vielleicht kurz Beispielcode posten, wie das mit dem Constructor geht?
  Mit Zitat antworten Zitat
Dagon

Registriert seit: 13. Jul 2003
505 Beiträge
 
Delphi 7 Professional
 
#4

Re: DelphiX "Schussproblem"

  Alt 3. Feb 2004, 19:29
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;
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#5

Re: DelphiX "Schussproblem"

  Alt 4. Feb 2004, 12:56
Sorry wenn der Code unübersichtlich ist
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.
  Mit Zitat antworten Zitat
Dagon

Registriert seit: 13. Jul 2003
505 Beiträge
 
Delphi 7 Professional
 
#6

Re: DelphiX "Schussproblem"

  Alt 4. Feb 2004, 13:09
Wenn du
  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;
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#7

Re: DelphiX "Schussproblem"

  Alt 4. Feb 2004, 13:20
So, habs umgeändert, geht jetzt, aber das im ersten Post beschriebene Problem ist immer noch da.
Ich hab das Fire-Zeug rausgenommen.
  Mit Zitat antworten Zitat
Dagon

Registriert seit: 13. Jul 2003
505 Beiträge
 
Delphi 7 Professional
 
#8

Re: DelphiX "Schussproblem"

  Alt 4. Feb 2004, 13:40
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]
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#9

Re: DelphiX "Schussproblem"

  Alt 4. Feb 2004, 14:29
Hier kannst du das Prog downloaden.
  Mit Zitat antworten Zitat
Dagon

Registriert seit: 13. Jul 2003
505 Beiträge
 
Delphi 7 Professional
 
#10

Re: DelphiX "Schussproblem"

  Alt 4. Feb 2004, 15:27
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.

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]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz