Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2D] Auf "Objekt" klicken registrieren (https://www.delphipraxis.net/118368-%5Bandorra-2d%5D-auf-objekt-klicken-registrieren.html)

napsterxx 6. Aug 2008 16:27


[Andorra 2D] Auf "Objekt" klicken registrieren
 
Moin Moin,
ich habe ein kleines 2D Spielchen, funktioniert alles prima. Es fliegen Enten :D über den Bildschirm und man muss diese "abschießen". Ich habe ein for schleife die überprüft ob der Mauszeiger über einer Ente ist, wenn ja dann wird die ente nicht mehr angezeigt da man sie ja "abgeschossen" hat.
Dummerweise dauert das Rechnen bei den ganzen Enten zu lang :D Deshalb wollte ich fragen ob es eine andere Möglichkeit gibt als dauernt die Position zu überprüfen.
Also von den enten habe ich immer folgende Daten:
X und Y-Koordinate
und die Weite und Höhe der Ente

igel457 6. Aug 2008 17:26

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Ich kann mir nicht vorstellen, das eine solche Kontrolle sonderlich viel Zeit in Anspruch nimmt.

Eine andere Methode: TSpriteEngine.GetSpriteAt(X, Y) liefert dir das oberste Sprite an der angegebenen Position zurück.

napsterxx 7. Aug 2008 13:58

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
ich verwende keine Sprite engine... sondern AdDraw. so wie im Tutorial 1.

Ich habe noch eine Frage. Meine Hühner fliegen jetzt rum, ich habe einen Baum eingebaut, die Hühner fliegen dahinter. Der baum ist etwas schief und hat clFuchsia als Transparentcolor. das blöde ist ich überprüfe ja ob meine maus über nem Huhn oder einem Objekt, in dem Fall ein Baum, ist. Wenn ich über einem Huhn bin wirds abgeschossen, ansonsten nicht, da man ja nicht durch einen Baum schießen kann. Mein Problem ist nun wenn der Baum schief ist sehe ich dsa Huhn schon dahinter wenn es aber immernoch hinter dem Rechteck des Baums ist, dieser ist ja immernoch ein Rechteck, aber nur eben wurde die farbe trasparent. Wie kann ich dsa nun rausfinden. mit einer maske oder so?

napsterxx 9. Aug 2008 15:14

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Kommt schon -.-
Hat keiner eine Ahnung wie das mit der Transparenz geht?

igel457 9. Aug 2008 15:30

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Wie du schon gesagt hast: Hinterlege eine Maske. Besonders einfach ist ein Bitmap, das du auf eine Farbtiefe von pf1Bit reduziert hast. Die Methode "TBitmap.Mask" hilft dir dabei. Für eine einzelne Überprüfung während eines Klicks reicht die Performance von "TBitmap.Canvas.Pixels" zur Abfrage der Farbe eines Pixels sogar noch aus.

napsterxx 9. Aug 2008 15:46

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Mit Andorra? TBitmap?

igel457 9. Aug 2008 15:54

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
TBitmap aus der VCL. Du kannst dir natürlich aber auch selbst eine eigene Maskenklasse Programmieren.

napsterxx 9. Aug 2008 15:59

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Ja aber ich habe doch das Huhn in einer AdImageList.
Was soll ich nun machen?

igel457 9. Aug 2008 16:12

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Delphi-Quellcode:
AdImageList[0].Texture.SaveToGraphic(DeinTBitmapBitmap);

napsterxx 9. Aug 2008 16:16

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Das muss ich ja immer machen wenn man klickt ... für jedes Huhn. Das ist doch ne Hammer Performanceeinbuse
Und dann muss ich noch eine Maske setzen. Und wie? UNd wenn ich das gemacht habe dann noch überprüfen ob ich über dembild bin? Uff

Also mit de Code kann ich ja eine Maske erstellen:
http://swissdelphicenter.ch/de/showcode.php?id=582

Wie finde ich raus ob meine maus darüber ist?

igel457 9. Aug 2008 16:37

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Du Maske ist doch für jede Grafik gleich - also bereche diese bei Starten des Spiels und lege alle Masken in einer Liste mit gleicher Indexierung wie in der ImageList ab.

Edit: Die Funktion die du da nennst, hat doch nichts mit deinem Problem zu tun :gruebel:

napsterxx 9. Aug 2008 16:42

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Keine Ahnung :D
Also ich habe 2 Hühnerbilder.
Index 1 und 2

Jetzt lade ich einfach beide nacheinander in ein Bitmap, mache dann "Bitmap.Mask;" und dann?

igel457 9. Aug 2008 16:53

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Warum eigentlich du "Hühnerbilder" - du willst doch wissen, ob der "Schuss" an dem Baum/Hinderniss vorbei gegangen ist. Also folgende Vorgehensweise:
Delphi-Quellcode:
var
  lst: TList;

procedure LadeSpiel;
var
  i: integer;
  bmp: TBitmap;
begin
  lst := TList.Create;
  for i := 0 to AdImageList.Count - 1 do
  begin
    bmp := TBitmap.Create;
    AdImageList[i].Texture.SaveToGraphic(bmp);
    bmp.Mask(DeineTransparenzFarbe);
    bmp.BitDepth:= pf1Bit; //Eventuell erstmal weglassen
   
    lst.Add(bmp);
  end;
end;

function TrifftObjekt(RelativesX, RelativesY: integer; ImageIndex: integer): boolean;
begin
  result := TBitmap(lst[ImageIndex]).Canvas.Pixels[RelativesX, RelativesY] = clBlack;
end;

procedure MausKlick(X, Y: integer);
begin
  //Erstelle Liste mit allen Objekten an der MausPosition
  //Überprüfe mithilfe des Bildindexes ob dieses Bild wirklich getroffen wurde, wenn
  //nicht überprüfe das nächste Element in der Liste
end;

napsterxx 9. Aug 2008 17:00

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Kay, danke.
Aber wieso wird auf clBlac übrprüf? Wird bei der Maske alles andere als die Transparentfare zu schwarz?
RelaivesX und Y sind ja dann die mauspositionen oder?

igel457 9. Aug 2008 17:08

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Schau mal nach Delphi-Referenz durchsuchenTBitmap.Mask in der Delphi-Hilfe.
RelativesX und RelativesY soll die Mauszeigerposition relativ zur oberen, linken Ecke deines (Hindernis)-Bildes sein.

Namenloser 9. Aug 2008 17:20

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Zitat:

Zitat von igel457
Warum eigentlich du "Hühnerbilder" - du willst doch wissen, ob der "Schuss" an dem Baum/Hinderniss vorbei gegangen ist. Also folgende Vorgehensweise:
Delphi-Quellcode:
var
  lst: TList;

procedure LadeSpiel;
var
  i: integer;
  bmp: TBitmap;
begin
  lst := TList.Create;
  for i := 0 to AdImageList.Count - 1 do
  begin
    bmp := TBitmap.Create;
    AdImageList[i].Texture.SaveToGraphic(bmp);
    bmp.Mask(DeineTransparenzFarbe);
    bmp.BitDepth:= pf1Bit; //Eventuell erstmal weglassen
   
    lst.Add(bmp);
  end;
end;

function TrifftObjekt(RelativesX, RelativesY: integer; ImageIndex: integer): boolean;
begin
  result := TBitmap(lst[ImageIndex]).Canvas.Pixels[RelativesX, RelativesY] = clBlack;
end;

procedure MausKlick(X, Y: integer);
begin
  //Erstelle Liste mit allen Objekten an der MausPosition
  //Überprüfe mithilfe des Bildindexes ob dieses Bild wirklich getroffen wurde, wenn
  //nicht überprüfe das nächste Element in der Liste
end;

Wozu eine Maske auf die Hintergrundfarbe erstellen und dann auf Schwarz prüfen? Da wäre es doch einfacher und schneller, einach das Sprite auf Hintergrundfarbe zu prüfen.

napsterxx 9. Aug 2008 17:41

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Ich benutze aber nicht die Sprite-Engine

napsterxx 9. Aug 2008 18:31

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Danke euch, habe es endlich geschafft :D
@Igel457 wusste gar nicht das du Admin von Andorra2D bist :thumb: :thumb: :thumb:

Ein Freund von mir meinte, das die Schaffer von Andorra gerne wissen welche Projekte mit Andorra programmiert wurden. Stimmt dsa? Denn ich würde gerne mein neues Projekt dann dir mal zeigen :D

igel457 9. Aug 2008 22:49

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Gerne! Immer her damit :wink:

napsterxx 10. Aug 2008 10:15

Re: [Andorra 2D] Auf "Objekt" klicken registrieren
 
Ich melde mich dann bei dir :D


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