AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetSpriteAt-Problem bei Andorra 2D

Ein Thema von Acuaplano · begonnen am 8. Mai 2013 · letzter Beitrag vom 21. Mai 2013
Antwort Antwort
Acuaplano

Registriert seit: 8. Mai 2013
29 Beiträge
 
#1

GetSpriteAt-Problem bei Andorra 2D

  Alt 8. Mai 2013, 12:03
Gudden Tag,

ich habe mich heute wieder in meinem Andorra 2D Projekt versucht. Soweit funktionierte alles bis das Problem mit dem Interagieren kam. Das Spiel soll ein 2D Spiel aus der Vogelperspektive werden. Wenn der Held vor einem Objekt steht und man eine Taste drückt soll eine Prozedur vom Objekt ausgeführt werden, wobei es jedoch universell gehalten werden soll. Da sollte der GetSpriteAt Befehl aushelfen, jedoch gibt's da die Probleme. Die Funktion findet nämlich nichts an der entsprechenden Stelle, selbst wenn ich die Koordinaten direkt eingebe. Gibt es vielleicht andere Möglichkeiten zum Interagieren oder hat jemand Erfahrung mit dem Problem?

Hier die wichtigen Quellcodeteile:

Delphi-Quellcode:
TObjekt = class(TImageSprite)
    private
    protected
    public
      procedure UseObject; virtual; abstract;
  end;

  TStein = class(TObjekt)
    private
    protected
    public
      constructor Create(AParent: TSprite); override;
      procedure UseObject; override;
  end;

...

TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    AdDraw: TAdDraw;
    AdPerCounter: TAdPerformanceCounter;
    AdImageList1: TAdImageList;
    AdSpriteEngine: TSpriteEngine;
    Selected: TSprite;
    procedure Idle(Sender: TObject; var Done: boolean);
    { Public-Deklarationen }
  end;

...

procedure TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
begin
  if key = 32 then
  begin
    Selected := AdSpriteEngine.GetSpriteAt(150,500);
    if Selected <> nil then
    begin
      TObjekt(Selected).UseObject;
      TestVar := 1;
    end
    else
    begin
      TestVar := 2;
      Selected := nil;

    end;
  end;
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: GetSpriteAt-Problem bei Andorra 2D

  Alt 8. Mai 2013, 16:42
Sind das Bildschirmkoordinaten oder wurde die Position bereits auf dein Fenster umgerechnet?
Am besten mal mit dem Debugger bei GetSpriteAt anhalten und sich die Koordinaten des Helden ausgeben lassen.

So ist es unabhängig von deinem aktuellen Problem sicherer:
Delphi-Quellcode:
    if Selected is TObjekt then
    begin
      TObjekt(Selected).UseObject;
  Mit Zitat antworten Zitat
Acuaplano

Registriert seit: 8. Mai 2013
29 Beiträge
 
#3

AW: GetSpriteAt-Problem bei Andorra 2D

  Alt 16. Mai 2013, 13:51
So,
erstmal sorry für die verspätete Antwort. Aber das Überprüfen hat mich stutzig gemacht. Ersteinmal haben die Koordinaten des Helden in kein Bild gepasst: es sind keine Bildschirmkoordinaten, aber es können auch keine Koordinaten sein, die von der SpriteEngine benutzt werden (falls du das mit "auf Fenster umgerechnet" gemeint hast), da komplett andere Werte ausgegeben werden, wenn der Held sich über dem Sprite befindet, das ich exakt auf (150|100) gesetzt hab. Aber der GetSprite Befehl scheint sich auf Bildschirmkoordinaten zu beziehen.
Verwirrender wird es jetzt, wenn man sieht wie ich darauf gekommen bin. Wenn ich jetzt z.b. die Koordinaten auf (20|20) gesetzt hab, eine andere Figur gerade dort war (vom Tutorial, Code ist unten) und ich die entsprechende Taste gedrückt hab, schmeißt der Compiler die Fehlermeldung "External: SIGSEGV" aus. Ich dachte erst, dass es an der fehlenden Prozedur der Figur liegt, aber als ich einfach mal eine leere Prozedur für die Klasse erstellt hab kam noch die gleiche Meldung.

Delphi-Quellcode:
TFigur = class(TImageSprite)
  private
  protected
    procedure DoMove(TimeGap: double); override;
  public
    XSpeed: integer;
    constructor Create(AParent: TSprite); override;
    procedure SetLine;
    procedure UseObject;
  end;
  Mit Zitat antworten Zitat
Acuaplano

Registriert seit: 8. Mai 2013
29 Beiträge
 
#4

AW: GetSpriteAt-Problem bei Andorra 2D

  Alt 21. Mai 2013, 14:06
So,

hat sich inzwischen von selbst gelöst. Die Koordinaten des GetSprite-Befehls waren wirklich die Bildschirmkoordinaten und es war nur ein kleiner Denkfehler mit drin, der sich durch einsetzen der "WorldX"- und "WorldY"-Variablen lösen konnte, wobei aber die beschriebene Fehlermeldung auch nur ein Produkt des Denkfehlers war .
Die Koordinaten der Sprite-Engine haben dann letztendlich auch gepasst. In dem Fall hatte ich übersehen, dass die Y-Achse nach unten in positiver und nicht negativer Richtung geht

Geändert von Acuaplano (21. Mai 2013 um 14:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:27 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