![]() |
Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
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. :?: |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
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 :dp: [/edit] |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
So etwas was du suchst, habe ich in meinem letzten Spiel implementiert, siehe
![]() 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. |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
Liste der Anhänge anzeigen (Anzahl: 1)
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. |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
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. |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
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?
|
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
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 :thumb: |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 ![]() |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
Zitat:
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 :dp: 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ß |
Re: Ausgewähltes Sprites zu Mausklick-Koordinaten bewegen?
Zitat:
Delphi-Quellcode:
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.
AFlieger1[Anzahl].Z := Anzahl;
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 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