Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Andorra 2D Bewegung von Figuren (https://www.delphipraxis.net/165597-andorra-2d-bewegung-von-figuren.html)

garfield.92 7. Jan 2012 20:29

Andorra 2D Bewegung von Figuren
 
Guten Abend liebe Delphi-Gemeinde,
ich beschäftige mich seit einer Woche mit Andorra 2D und wollte jetzt eine Figur über die Pfeiltasten steuern. Jetzt habe ich das Problem, jedes mal wenn ich die entsprechende Pfeiltaste drücke, bekomme ich eine neue Figur erstellt, ich hätte aber gerne, dass die Figur die Richtung ändert.
Hier der entsprechende Quelltext:
Delphi-Quellcode:
type
  Tcroco = class(TImageSprite)
    private
    protected
      procedure DoMove(TimeGap:double);override;
    public
      XSpeed:integer; //Die Geschwindigkeit in X-Richtung
      constructor Create(AParent:TSprite);override;
      procedure GoRight(Adspriteengine:TSpriteEngine; bild:TAdImageList);
      procedure GoLeft(Adspriteengine:TSpriteEngine; bild:TAdImageList);
      procedure SetLine;
  end;
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    VK_LEFT:croco.goLeft(Adspriteengine, bild);
    VK_RIGHT:croco.goRight(Adspriteengine, bild);
  end;
end;

procedure Tcroco.GoRight(Adspriteengine:TSpriteEngine; bild:TAdImageList);
begin
  inherited;
  with Tcroco.create(AdSpriteEngine) do
    begin
      Image:=bild.Find('croco');
      X:=X + 0.4;
      AnimStart:=1;
      AnimStop :=2;
      AnimLoop:=true;
      AnimActive:=true;
      AnimSpeed:=30;
      XSpeed := -(random(100)+50);
      SetLine;
    end;
end;

procedure Tcroco.GoLeft(Adspriteengine:TSpriteEngine; bild:TAdImageList);
begin
  inherited;
  with Tcroco.Create(AdSpriteEngine) do
    begin
      Image:=bild.Find('croco');
      X:=X + 0.4;
      AnimStart:=1;
      AnimStop :=2;
      AnimLoop:=true;
      AnimActive:=true;
      AnimSpeed:=30;
      XSpeed := (random(100)+50);
      SetLine;
    end;
end;
wenn ich in der Zeile mit
Delphi-Quellcode:
with Tcroco.Create(AdSpriteEngine) do
das create weglasse bekomme ich eine Fehlermeldung "Es ist eine Exception der Fehlerklasse EAccess Violation aufgetreten".
Kann mir vielleicht irgendjemand bei meinem Problem helfen?
Vielen Dank.

Lg garfield.92

IceBube 7. Jan 2012 20:58

AW: Andorra 2D Bewegung von Figuren
 
Hallo!

Soweit ich weiß, gibt es sogar ein Tutorial für die Bewegung eines Sprites mit Andorra, Google hilft :)

Hmm, du erstellst bei Links- und bei Rechtsbewegungen ein neues Sprite!

So würd ich das ungefähr machen

Delphi-Quellcode:
var
 Sprite : TSprite;


procedure Form.Create();
begin

 //Sprite erstellen (Form.destroy -> Freigeben)
 Sprite := TSprite.Create();
 ^.Speed := 1;
 ^.irgendwas := 'abc';
 ...
end;


//Einfache Bewegung (L, R)
procedure FormKeyPress();
begin
 case Key of
 'a': Sprite.X := Sprite.X - 1; //Links, Rechts
 'd': Sprite.X := Sprite.X + 1; //Links, Rechts
 'w': Sprite.Y := Sprite.Y - 1; //Hinauf, Hinuter
 's': Sprite.Y := Sprite.Y + 1; //^^
 end;
end;
In dem Tutorial wird das sicher genauer erklärt!

garfield.92 8. Jan 2012 12:49

AW: Andorra 2D Bewegung von Figuren
 
Hallo,
also die Tutorials die ich auf google gefunden hab, hab ich alle schon durch gearbeitet und da steht absolut gar nix drin, wie mal die sprites selbst steuern kann.
Ich probiers dann mal so, Vielen Dank :-)

garfield.92 8. Jan 2012 12:58

AW: Andorra 2D Bewegung von Figuren
 
Also, wenn ichs so umbaue bekomme ich die Fehlermeldung "Es ist eine Exception der Klasse EAccess Violation aufgetreten".

Blup 9. Jan 2012 08:38

AW: Andorra 2D Bewegung von Figuren
 
Das in GoRight und GoLeft kein neues Sprit erzeugt werden soll ist schon richtig.
Die Ursache für die Zugriffsverletzung ist an anderer Stelle zu suchen.
Vermutlich wird das Objekt nirgends erstellt oder ist bereits freigegeben.
Wenn du mit dem Debugger noch nicht klar kommst, häng am besten das ganzes Projekt an deinen Beitrag.

garfield.92 9. Jan 2012 17:52

AW: Andorra 2D Bewegung von Figuren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, hab hier mal den Projektordner angehängt.

DeddyH 9. Jan 2012 18:10

AW: Andorra 2D Bewegung von Figuren
 
Was mir auf den ersten Blick auffällt:
Zitat:

Delphi-Quellcode:
constructor Tcroco.Create(AParent: TSprite);
begin
  inherited;
  croco:=Tcroco.Create(nil); // <-- Hää??
  //Am Punkt (0;0) starten.
  X := 0;
  Y := 0;
  //XSpeed auf -150 setzten
  XSpeed := -150;
end;

Du erzeugst im Konstruktor der Klasse eine weitere Instanz? Was soll denn das werden?

garfield.92 9. Jan 2012 18:19

AW: Andorra 2D Bewegung von Figuren
 
ja, ich habs gemerkt, hatte da was ausprobiert, habs wieder dort raus gemacht und auch in der angehängten datei geändert, dort ist jetzt mein eigentliches problem drin.

DeddyH 9. Jan 2012 18:30

AW: Andorra 2D Bewegung von Figuren
 
Also, es knallt, wenn Du eine der Pfeiltasten drückst, richtig? Ich habe kein Andorra installiert, aber mir fällt erst einmal nichts Besonderes auf (von dem eben Genannten einmal abgesehen). Hast Du einmal einen Haltepunkt gesetzt und bist schrittweise bis zum Fehler durchgegangen?

garfield.92 9. Jan 2012 18:46

AW: Andorra 2D Bewegung von Figuren
 
also
Delphi-Quellcode:
procedure Tcroco.SetLine;
begin
  //Bewegt die Figur in eine neue Ebene
  XSpeed := -XSpeed;
  if XSpeed > 0 then
    begin
      AnimStart := 0;
      AnimStop := 7;
      X := -96;
    end
  else
    begin
      AnimStart := 8;
      AnimStop := 15;
      X := Engine.SurfaceRect.Right+96;
    end;
//hier
[B] Y := Random(Engine.SurfaceRect.Right-790);[/B]
end;
immer wenn er in die letzte Zeile kommt, stürzt das programm ab. Wenn ich diese Zeile ausklammere ist es die oben drüber und wenn ich diese auch ausklammere tut sich gar nix.

DeddyH 9. Jan 2012 18:49

AW: Andorra 2D Bewegung von Figuren
 
Ich nehme an, X und Y sind Eigenschaften der Elternklasse TImageSprite?

garfield.92 10. Jan 2012 18:04

AW: Andorra 2D Bewegung von Figuren
 
jop, müsste so sein.

Coffeecoder 11. Jan 2012 07:03

AW: Andorra 2D Bewegung von Figuren
 
Zitat:

Zitat von DeddyH (Beitrag 1145114)
Ich nehme an, X und Y sind Eigenschaften der Elternklasse TImageSprite?

Zitat:

Zitat von garfield.92 (Beitrag 1145265)
jop, müsste so sein.

Wenn das so wäre, muss man nicht noch in deinem Konstruktor auch den Konstruktor deiner Elternklasse TImageSprite aufrufen?

DeddyH 11. Jan 2012 07:07

AW: Andorra 2D Bewegung von Figuren
 
Das stimmt zwar, dürfte aber mit den X- und Y-Eigenschaften nichts zu tun haben (es sei denn, das wären Objekte, was ich aber nicht glauben mag).

Coffeecoder 11. Jan 2012 07:12

AW: Andorra 2D Bewegung von Figuren
 
Vielleicht hast du dieses Tutorial gesehen, aber das hier kannst du dir auch mal angucken.

garfield.92 11. Jan 2012 16:53

AW: Andorra 2D Bewegung von Figuren
 
Nach diesem Tutorial bin ich ja vorgegangen und habe den Konstruktor auch daraus.
Durch das inherited rufe ich doch die Elternklasse auf oder?

DeddyH 11. Jan 2012 17:27

AW: Andorra 2D Bewegung von Figuren
 
inherited ruft die Implementation der Vorfahrklasse auf.

garfield.92 11. Jan 2012 18:29

AW: Andorra 2D Bewegung von Figuren
 
Okay

Blup 12. Jan 2012 16:48

AW: Andorra 2D Bewegung von Figuren
 
Ein Unterschied zum Tutorial ist mir sofort ins Auge gefallen:
Delphi-Quellcode:
Figur := TFigur.Create(AdSpriteEngine);
...
Delphi-Quellcode:
croco:=Tcroco.Create(nil);
...
Das Croco darf vermutlich erst nach der SpriteEngine erzeugt werden und muss mit dieser bekannt gemacht werden.

IceBube 12. Jan 2012 21:07

AW: Andorra 2D Bewegung von Figuren
 
Die Sprite in der Engine erzeugen ist schon oke, wird auch in den Tutorial's so gemacht!

Muss schon sagen dass dein Source sehr komisch ausschaut, entweder du erstellst ein Sprite (TImageSprite/EX) oder du zeichnest die Figur!

Ein Sprite erzeugst du am Anfang (Form.Create) bzw. einmal:
Delphi-Quellcode:
procedure TForm.onCreate...
begin
 //Erstellen deines Sprites
 Croco := TimageSprite.Create(DeineSpriteEngine);
 with Croco do
 begin
  X     := 0;
  Y     := 0;
  xSpeed := 1;
  Image := AdImageList1.Find('croco');
  AnimActive := FALSE;
 end;
end;
Wenn du deine Figur in jede beliebige Richtung bewegen möchtest mittel's WASD:
Du musst die Procedure mit der Form verbinden, sonst passiert nichts!
Delphi-Quellcode:
procedure TForm.onKeyPress(var Key...);
begin
 case Key do
 begin
  'a':
  begin
   Croco.X := Croco.X + xSpeed;
   iF (Croco.AnimPos = Croco.AnimCount) Then
    Croco.AnimPos := Croco.AnimStart
   ELSE
    Croco.AnimPos := Croco.AnimPos + 1;
  end;
  'd':
  begin
   ...
  end;
 end;
end;
Hoffe das ist verständlich, aber ist schon lange her..dass ich Andorra verwendet habe :/

lg

Blup 13. Jan 2012 07:22

AW: Andorra 2D Bewegung von Figuren
 
Zitat:

Zitat von IceBube (Beitrag 1145689)
Die Sprite in der Engine erzeugen ist schon oke, wird auch in den Tutorial's so gemacht!

Das wurde hier eben bisher nicht gemacht.

garfield.92 22. Jan 2012 09:38

AW: Andorra 2D Bewegung von Figuren
 
Hallo,
so ich habe jetzt das Croco erst nach der SpriteEngine erzeugt und die Fehlermeldung ist auch weg, danke.
Allerdings bewegt sich die Figur nicht so wie ich es will, ich drücke eine Pfeiltaste und die Figur läuft ganz von selbst.
Habe es dann wie von IceBube beschrieben versucht und dann funktioniert gar nix.

lg


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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