Mausklick auf Sprite erkennen
-
Hi, habe folgende Frage:
Ich möchte gerne einen Mausklick auf einem sich bewegenden Sprite abfangen.Ich kenne die Methode, ein Rechteck über das Sprite zu legen und dann mit PtInRect() abzufragen, ob der Mausklick in dem bestimmten Rechteck war und somit auch auf dem Sprite. Habe es früher so bei Sprites gemacht, die sich nicht bewegen.
Wenn ich diese Methode aber nun auf ein Sprite anwende, was sich bewegt, müsste ich ja das Rechteck immer mit verschieben...
Gibt es da eine bessere/schnellere Lösung, oder muss ich das wieder so mit den Rechtecken machen?Außerdem würde es relativ aufwändig werden, zu jedem Sprite ein Rechteck synchron zu bewegen.
Wäre dankbar für einige Alternativvorschläge oder auch Bestätigungen der schon erwähnten Methode.
MfG
Hundefutter
-
Falls du einigermaßen objektorientiert programmierst gibst du einfach jedem Sprite noch ein Rechteck. Das Sprite hat ja auch Verschiebungskoordinaten. Also machst du einfach folgendes: Du testest statt dem Punkt selbst einfach Punkt - Verschiebung (ist ein Minus). Du musst also nicht das Rechteck selbst bewegen, stattdessen bewegst du den Klickpunkt in die entggengesetzte Richtung. Da wesentlich öfter verschoben als geklickt wird ist das auch schneller.
-
ich überlege mir jetzt die ganze Zeit was das mit OOP zu tun hat.

Ob sich das Sprite bewegt oder nicht ist doch egal. In dem Moment wo du auf Kollision prüfst steht doch alles so oder so.
-
Hundefutter schrieb:
Gibt es da eine bessere/schnellere Lösung, oder muss ich das wieder so mit den Rechtecken machen?
mit rechtecken würde ich sowas gar nicht machen, oder benutzt du noch blockgrafik?
guckst du: http://en.wikipedia.org/wiki/Point_in_polygon
-
Netzwerk:
Naja, stell dir doch bitte mal nen Code vor, der darauf basiert, dass jedes Grafikobjekt einfach nur ein Surface/Bild/Bitmap (wie auch immer es die betrffende API nennen mag) ist. Es gibt die grusligsten Sachen...
-
vorne weg ... welche API ... da gibts verschiedene möglichkeiten ...
also zB in VB6 mit den standard Blit(oder wie das heist)-techniken kann man ja "sprites" (Gibts auch bei dx
) in eine Picterbox bzw Image (eines von beiden) rein zeichnen und das ganze gar noch mit durchsichtigen bereichen...falls das sowas sein sollte^^(OK, halt in C++):
Cpos = Cursor koordinate (in relation zur PictureBox/Image)
Spos = Sprite koordinate in der 2D-welt
Bpos = Bildschirmposition[oben links] in der 2D-Weltso aus diesen koordinaten muss man dann die differenz berechnen (jeweils für x und y) zb so differenz = Spos - Bpos - Cpos
da sprites rechteckig sind teste zuerst ob die differenz >= 0 und <= sprite höhe/breite ist...
sollte das der fall sein musst du aus der differenz(was ja dann effektiv die koordinate ist) den wert von der transparenz hollen und testen ob da nicht grad hintergrund ist.
in VB6 ging das so schätze mal das es in c++ nicht viel anders sein wird ... hab ja kein code gepostet

-
Leute,
"Hundefutter" hat geschrieben das er
Hundefutter schrieb:
Hi, habe folgende Frage:
...Ich kenne die Methode, ein Rechteck über das Sprite zu legen und dann mit PtInRect() abzufragen, ob der Mausklick in dem bestimmten Rechteck war und somit auch auf dem Sprite...Dann fragt er:
Hundefutter schrieb:
Wenn ich diese Methode aber nun auf ein Sprite anwende, was sich bewegt, müsste ich ja das Rechteck immer mit verschieben...
Jetzt meine Frage. Was ist daran so schlimm das Rechteck mitzuverschieben?
-
Also habe es jetzt so geregelt, dass ich, wenn die linke maustaste gedrückt wurde, ein Rechteck über das zu überprüfende sprite lege, abhängig von der position des sprites, welche ich per funktion bekomme.
Funktioniert eigentlich gut, bis jetzt gibt es keine probleme.das mit "Point in polygon" gucke ich mir nochmal an, danke für den Tipp.
-
Wenn ich diese Methode aber nun auf ein Sprite anwende, was sich bewegt, müsste ich ja das Rechteck immer mit verschieben...
Wieso verschiebst du das Rechteck nicht einfach mit, oder verwendest einfach die Koordinaten + die Größe des Sprites und vergleichst sie mit der Cursorposition?
-
Wie gesagt, habe das Problem nun schon gelöst.
Mache es jetzt folgendermaßen:
linke Maustaste wurde gedrückt
-> Position des Sprites abfragen, welches ich überprüfen will
-> Passend zur Position des Sprites ein Rechteck als Bounding-Box drüberlegen
-> gucken, ob der Klick in dem bestimmten Rechteck warSo funktionert es eigentlich ganz gut, habe bis jetzt keien Probleme..
MfG
Hundefutter