AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
Thema durchsuchen
Ansicht
Themen-Optionen

Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

Ein Thema von MydroF · begonnen am 4. Sep 2009 · letzter Beitrag vom 7. Sep 2009
Antwort Antwort
MydroF

Registriert seit: 22. Aug 2009
9 Beiträge
 
#1

Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 4. Sep 2009, 21:37
Hallo.

Für ein kleines Spiel habe ich die Prozedur des Erstellens diverser Sprites verwendet.
Nun möchte ich, dass ich bei Klick auf ein solches Sprite dieses als "ausgewählt" kennzeichne, und bei erneutem Klick auf das Formular soll sich das Sprite an diese Stelle bewegen und dort halten. Ebenso soll die Kennzeichnung "ausgewählt" des Sprites bei Erreichen des Ziels aufgehoben werden, sodass ich bei einem Klick auf ein neues Sprite, eben das neue ausgewählt habe und es verschieben lassen kann.

Kurz:
1. Klick auf Sprite->auswählen
2. Klick auf Formular->Sprite bewegt sich dorthin
3. Ist Ziel erreicht, Sprite stoppt->auswahl wird aufgehoben
4. Klick auf erneutes Sprite (siehe ab 1.)
usw...

Wie realisiere ich das per Quellcode?
Leider gibt es für das von mir verwendete Programm Andorra 2D zu wenig Tutorials, für solch eine Prozedur zum Beispiel gar keine.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 4. Sep 2009, 21:59
Hallo MydroF,

viele Wege führen nach Rom. Eine Idee für den Programmablauf hast du ja bereits, also ist der wichtigste Schritt doch schon getan - Jetzt musst du das ganze nur noch in Code umsetzen. Wie du das tust ist dir überlassen, denn es gibt nie "den Quelltext". Wie weit bist du denn bisher gekommen? Hast du überhaupt schon irgendwas geschrieben? An welchem der von dir aufgezählten Punkte hängst du?

[edit]
Übrigens, falls es noch niemand anderes gesagt hat:
Herzlich Willkommen in der DP
[/edit]
  Mit Zitat antworten Zitat
Stoney

Registriert seit: 6. Nov 2004
Ort: Königsbrunn
30 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 4. Sep 2009, 23:10
So etwas was du suchst, habe ich in meinem letzten Spiel implementiert, siehe hier. Allerdings ist der bei dir angegebene 4. Schritt bei mir nicht vorhanden, das ausgewählte Sprite bleibt bei mir ausgewählt.

Hier mal in ganz groben Zügen wie das Ganze gelöst werden könnte (Das Sprite muss noch mit TSpielObjekt verknüpft werden):
Delphi-Quellcode:
TSpielObjekt = class
private
  FSelected: Boolean;

  // Statt TPoint kann auch jeder andere Datentyp genommen werden, der min. X und Y Koordinate speichern kann
  FPosition, FDestination: TPoint;

  procedure SetSelection(Value: Boolean);
public
  constructor Create;
  destructor Destroy;

  procedure Move(Destination: TPoint);
  procedure Update;
published
  property Selected: Boolean read FSelected write SetSelection;
end;

...

procedure TSpielObjekt.SetSelection(Value: Boolean);
begin
  FSelected := Value;
  {
    Hier noch zusätzliche Sachen einfügen, wie in der GUI anzeigen oder ähnliches
    Wenn das nicht benötigt wird, dann folgende Zeile
    property Selected: Boolean read FSelected write SetSelection;
    in
    property Selected: Boolean read FSelected write FSelected;
    abändern
  }
  
end;

procedure TSpielObject.Move(Destination: TPoint);
begin
  if Selected then FDestination := Destination;
end;

procedure TSpielObject.Update;
begin
  if (FPosition.X = FDestination.X) and (FPosition.Y = FDestination.Y) then
  begin
    // Wenn Position erreicht wurde, Selektion entfernen
    Selected := false;
  end else
  begin
    // Zum Ziel bewegen
    // Mit Geschwindigkeit von 1 Pixel pro Frame
    if FPosition.X > FDestination.X then FPosition.X := FPosition.X - 1 else FPosition.X := FPosition.X + 1;
    if FPosition.Y > FDestination.Y then FPosition.Y := FPosition.Y - 1 else FPosition.Y := FPosition.Y + 1;
  end;
end;

Wenn dir das nicht reicht, kannst du auch gerne den Quelltext zu meinem oben verlinkten Spiel anschauen, aber ich bin mir nicht sicher, ob dir das weiterhilft, weil mein Spiel nicht auf Andorra 2D aufbaut.
Johannes Stein
  Mit Zitat antworten Zitat
MydroF

Registriert seit: 22. Aug 2009
9 Beiträge
 
#4

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 6. Sep 2009, 14:56
Hab versucht den Code umzusetzen, leider wird an verschiedenen Stellen verschiedenes vom Programm nicht akzeptiert=(
Hab das ganze mal in nem neuen Projekt getestet, leider wird der Code eben nicht ausgeführt, und es bewegt sich auch immer noch nichts, von dem, was funktioniert. Habs mal angehangen.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,AdDraws, AdClasses, AdTypes, PNGImage, AdSprites, StdCtrls;

type
  //Eigener Raumschifftyp I
  TFlieger1 = class(TImageSprite)
    private
    FSelected:Boolean;
    FPosition,FDestination:TPoint;
    procedure SetSelection(Value:Boolean);

    public
      XSpeed:integer;
      procedure Update;
      constructor Create(AParent:TSprite);override;
      procedure Move(Destination: TPoint);
      procedure Update;override;
    published
    property Selected: Boolean read FSelected write FSelected;

  end;


  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
  AdImageList:TAdImageList;
  AdDraw:TAdDraw;
  AFlieger1 : Array[0..100] of TFlieger1;
  AdSpriteEngine:TSpriteEngine;
  procedure Idle(Sender:TObject; var Done:boolean);
    { Public declarations }
  end;

var
  Form1: TForm1;
  i:integer;
  Flieger1:TFLieger1;
  TAnzahl : integer = 0;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
AdDraw := TAdDraw.Create(self);
AdDraw.DllName := 'main/AndorraDX93D.dll';

if AdDraw.Initialize then
    begin
        Application.OnIdle := Idle;
        AdImageList := TAdImageList.Create(AdDraw);
        with AdImageList.Add('flieger1') do
        begin
            Texture.LoadGraphicFromFile('anim/flieger1.png',true,clFuchsia);
            PatternWidth := 128;
            PatternHeight := 128;
            end;
        AdImageList.Restore;
        AdSpriteEngine := TSpriteEngine.Create(nil);
        AdSpriteEngine.Surface := AdDraw;
        Randomize;

        end
        else
        begin
        ShowMessage(AdDraw.GetLastError);
        halt; //<-- Schließt die komplette Anwendung
    end;

end;


procedure TForm1.Idle(Sender: TObject; var Done: boolean);
begin
    if AdDraw.CanDraw then //Wenn überhaupt auf das AdDraw gezeichnet werden kann dann...
        begin
        AdDraw.ClearSurface(clBlack); //Füllt die Oberfläche mit schwarzer Farbe

        AdDraw.BeginScene;
         AdSpriteEngine.Draw;
         AdSpriteEngine.Dead;


        AdDraw.EndScene;

        AdDraw.Flip; //Präsentiert die gezeichneten Dinge auf dem Bildschirm.
        end;

    Done := false; // Diese Zeile nicht vergessen, sonst wird der Code nur sporadisch ausgeführt.
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
AdDraw.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
i:=TAnzahl;
AFlieger1[i]:= TFlieger1.Create(AdSpriteEngine);
AFlieger1[i].Image := AdImageList.Find('flieger1');
inc(TAnzahl);
end;


Constructor TFlieger1.Create(AParent:TSprite);
var
i:integer;
begin
i:=TAnzahl;
if i<5 then begin
  inherited;
  X := 100*i;
  Y := 90;
  Z := 0;
  end;
end;

procedure TFlieger1.SetSelection(Value: Boolean);
begin
FSelected:=Value;
end;

procedure TFlieger1.Move(Destination: TPoint);
begin
if Selected then FDestination := Destination;
end;


procedure TFlieger1.Update;
begin
* if (FPosition.X = FDestination.X) and (FPosition.Y = FDestination.Y) then
* begin
* * // Wenn Position erreicht wurde, Selektion entfernen
* * Selected := false;
* end else
* begin
* * // Zum Ziel bewegen
* * // Mit Geschwindigkeit von 1 Pixel pro Frame
* * if FPosition.X > FDestination.X then FPosition.X := FPosition.X - 1 else FPosition.X := FPosition.X + 1;
* * if FPosition.Y > FDestination.Y then FPosition.Y := FPosition.Y - 1 else FPosition.Y := FPosition.Y + 1;
* end;
end;


end.
Angehängte Dateien
Dateityp: rar bewegen_167.rar (1,20 MB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 6. Sep 2009, 15:12
Bitte formatier deinen Code ordentlich und markiere die Stellen, an denen Fehler auftreten. Außerdem solltest du das Array durch ein Listenobjekt (TObjectList, oder besser eine davon abgeleitete Klasse) ersetzen. Schon allein dadurch wird der Code viel übersichtlicher und du vermeidest Fehlerquellen.

Eine Sache noch: Die Bezeichnung TAnzahl für eine Konstante ist irreführend, weil das Präfix T bei Delphi für Type (z.b. TForm) steht.
  Mit Zitat antworten Zitat
MydroF

Registriert seit: 22. Aug 2009
9 Beiträge
 
#6

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 6. Sep 2009, 15:34
ehrlich gesagt, hab ich von dieser Spritebewegungsprozedur überhaupt keine Ahnung. Woher auch? kann mich nicht daran erinnern, nach stundenlangen Quelltextdurchforsten und Tutorials-suchen irgendwo solch eine Auswahl-Move Prozedur gefunden zu haben. Aber irgendwer muss doch das mal irgendwo bis jetzt verwendet haben, oder nicht?
  Mit Zitat antworten Zitat
Vasco da Gama

Registriert seit: 2. Aug 2009
131 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 6. Sep 2009, 16:25
Hi über den Link in meiner Signatur kommst du zu meinem aktuellen problem. Dort hab ich eine Unit angehängt, die dir helfen sollte.

mfG und Viel Glück
Flo
Programmiere inzwischen hauptsächlich mit C++. Nicht böse werden
  Mit Zitat antworten Zitat
Stoney

Registriert seit: 6. Nov 2004
Ort: Königsbrunn
30 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 7. Sep 2009, 02:20
Zitat von MydroF:
ehrlich gesagt, hab ich von dieser Spritebewegungsprozedur überhaupt keine Ahnung. Woher auch? kann mich nicht daran erinnern, nach stundenlangen Quelltextdurchforsten und Tutorials-suchen irgendwo solch eine Auswahl-Move Prozedur gefunden zu haben. Aber irgendwer muss doch das mal irgendwo bis jetzt verwendet haben, oder nicht?
Mein obiger Ansatz war natürlich nicht einfach zum Copy & Paste gedacht und wenn dir nicht klar wie es überhaupt funktioniert, hättest du ruhig fragen können. Und es gibt nie nur eine Lösung, irgend etwas zu implementieren.

Aber auch wenn ich noch nie zuvor richtig mit Andorra 2D gearbeitet habe, hab ich schnell was funktionierendes zusammengestellt, ist im Anhang. (Mit einem kleinen Bug, dass es die Position manchmal etwas ruckelt, ich glaube ich habe irgendwo noch ein Trunc vergessen.)
Ich habe zum Test deine Grafiken etwas verkleinert, weil bei den originalen Grafiken das Auswählen und Bewegen etwas zu ungenau wird.

Und oben hatte ich auch auf mein (Open-Source-)Spiel verlinkt, was auch so eine ähnliche Sprite-Auswahl-Bewegen eingebaut.
Wenn du natürlich etwas komplexeres willst, ich hätte auch noch eine A* Pathfinding - Example anzubieten.

Edit:
Bei C-Evo ist auch eine Sprite-Auswahl-Move-Prozedur eingebaut, C-Evo basiert auch nicht auf Andorra 2D, sondern verwendet eine eigene Engine auf Canvas-Basis.
Angehängte Dateien
Dateityp: rar bewegen_792.rar (1,21 MB, 11x aufgerufen)
Johannes Stein
  Mit Zitat antworten Zitat
MydroF

Registriert seit: 22. Aug 2009
9 Beiträge
 
#9

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 7. Sep 2009, 17:20
Zitat von Stoney:
Aber auch wenn ich noch nie zuvor richtig mit Andorra 2D gearbeitet habe, hab ich schnell was funktionierendes zusammengestellt, ist im Anhang. (Mit einem kleinen Bug, dass es die Position manchmal etwas ruckelt, ich glaube ich habe irgendwo noch ein Trunc vergessen.)

Edit:
Bei C-Evo ist auch eine Sprite-Auswahl-Move-Prozedur eingebaut, C-Evo basiert auch nicht auf Andorra 2D, sondern verwendet eine eigene Engine auf Canvas-Basis.
Ultrageile Sache, Mann!
Wow, endlich mal einer, der mir mal nen richtigen Code präsentiert.
Natürlich is mir klar, dass ich alles weitestgehend alleine schreiben soll, nur irgendwo muss ich ya auch mal an die Prozeduren rankommen. Auf jeden Fall komme ich nun endlich mal mit meinem Spiel vorran, kann mich wieder den Modellen zuwenden, die Prozedure einsetzen und den vorraussichtlichen Release-Termin Ende Oktober sehr gut einhalten

Vielen Dank, Stoney!

Letzte Frage noch:
Was muss ich ändern, damit nur das oberste Sprite auswähle? Wenn mehrere übereinanderliegen, kann ich sie nicht mehr trennen.

Und der sogenannte "Bug" gibt den Raumschiffen irgendwie auch ne realistische Bewegung. Sieht besser aus, als wenn sie totenstill auf einem Fleck stehen.

Gruß
  Mit Zitat antworten Zitat
Stoney

Registriert seit: 6. Nov 2004
Ort: Königsbrunn
30 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?

  Alt 7. Sep 2009, 18:25
Zitat von MydroF:
Was muss ich ändern, damit nur das oberste Sprite auswähle? Wenn mehrere übereinanderliegen, kann ich sie nicht mehr trennen.
Da würde ich an deiner Stelle mit dem Z-Wert arbeiten, das wäre glaub ich die einfachste Lösung. Einfach beim ButtonClick-Event hinzufügen:
AFlieger1[Anzahl].Z := Anzahl; Ich weiß nicht, ob man noch irgendwo was einfügen muss, damit Andorra 2D auch das Z-Sorting beachtet. Das Sprite mit dem höchsten Z-Wert wird immer oben gezeichnet, d.h. das oberste Sprite wird immer ausgewählt. Allerdings musst du jetzt noch einbauen, dass alle anderen Sprites unter diesem Sprite nicht ausgewählt werden dürfen.

Zitat von MydroF:
Und der sogenannte "Bug" gibt den Raumschiffen irgendwie auch ne realistische Bewegung. Sieht besser aus, als wenn sie totenstill auf einem Fleck stehen.
Du kannst mit den Werten noch etwas rumspielen, indem du die Truncs weglässt und statt die Geschwindigkeit änderst, anstatt dem 1 Pixel pro Frame einen Wert zwischen 0 und 1 einsetzt, z.B. 0.3.
Johannes Stein
  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 13:49 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