Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.01.2011, 13:48

Nächstes Objekt bzw. Punkt zur Mausposition finden (2D)

Hi Leutz,

im Editor zu meinem aktuellen Projekt soll man Spielobjekte per Mausklick platzieren können. Nachdem es platziert wurde und evtl. noch ein anderes Objekt platziert wurde, soll man natürlich das alte Objekt löschen oder verändern können (z.B. verschieben).
Meine ganzen Spielobjekte sind im Editor in einem vector gespeichert. Mein Problem ist folgendes:
Wenn man ein Objekt anklicken will und es liegen z.B. 2 Objekte nah aneinander oder überschneiden sich sogar, wie soll ich dann herausfinden, welches Objekt angeklickt wurde? Ich muss es irgendwie über die Positionen der Objekte bestimmen, denn wenn sich die Rects überschneiden kann ich diese ja schlecht prüfen, es könnte ja in beide geklickt worden sein.

Also, wie kann ich anhand der Positionen zweier Objekte und der Mausposition bestimmen, welches Objekt am nächsten zur Mausposition ist?

lg chaia

pepe1995

Frischling

Beiträge: 60

Wohnort: Warngau

Beruf: Schüler (10.)

  • Private Nachricht senden

2

25.01.2011, 13:58

ich weiß es nicht aber wenn du dir so etwas wie einen kleinen "Z-Buffer" baust
Wenn du ein objekt plazierst speicherst du z.B. dass es als Erstes platziert wurde usw..

und dann könntest du vielleicht durch mehrmaliges klicken jedes objekt von hinten nach vorne durchgehen

ist nur eine idee^^

pepe
www.4story.de
ROCKT! ;)

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

3

25.01.2011, 15:33

Ich nehme mal an, du hast die Objekte alle in einer Liste und zeichnest sie der Reihe nach. Damit hast du ja quasi schon einen Z-Buffer: Du musst nur die Liste rückwärts durchlaufen(wenn du sie beim Zeichnen vorwärts durchläufst) und wenn du dann eine Überschneidung findest, ist sie garantiert mit dem obersten Objekt (zuletzt gezeichnet).
Alternativ könntest du auch das Objekt wählen, bei dem der Mausklick näher am Mittelpunkt ist.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

25.01.2011, 16:11

Miss einfach die Entferung zur Maus. Das mit der kleineren Entfernung ist naeher.

pepe1995

Frischling

Beiträge: 60

Wohnort: Warngau

Beruf: Schüler (10.)

  • Private Nachricht senden

5

25.01.2011, 16:19

ja und wenn du jetzt ein oberes hab willst und eins darunter ist näher zu dem was dann?
www.4story.de
ROCKT! ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

25.01.2011, 16:56

Dann is Pech. Ein Programm kann schlecht raten welches der User meint. Muss er eben eindeutiger klicken, sehe ich nicht als Problem an. Ansonsten geht auch eine Liste der Objekte aus der der User sich das richtige selber raus suchen kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Darkrel

Treue Seele

Beiträge: 143

Wohnort: Zürich

Beruf: Student ETH Zürich

  • Private Nachricht senden

7

25.01.2011, 19:25

Wie wäre es mit einem PixelPerfect test mit der Mausposition? Funktioniert natürlich nur, wenn du einen entsprechenden Alphakanal oder eine Colormask hast.

Wenn es passieren kann, dass ein Objekt ein anderes vollständig überdeckt, hätte ich die objekte wohl in einer Baumstruktur verwaltet, die die Beziehung "X überdeckt Y" modelliert.
So kannst du herausfinden, welche Objekte sich unter einem anderen befinden und zwischen ihnen durchschalten (z.B. per Mausrad).

Falls du nicht mit Grafiken hantierst, sondern einfach nur mit Rects und einer abstrakten Repräsentation eines Objektes innerhalb des Editors, dann vergiss meinen Vorschlag.
:cursing:

8

25.01.2011, 20:17

Danke für die vielen Vorschläge, habe es jetzt so gemacht, dass man den Vector mit dem Mausrad durchlaufen kann. Außerdem existiert eine DropDownBox mit welcher man ebenfalls auswählen kann. Die DDB ist bei einer größeren Map mit vielen Objekten allerdings etwas unübersichtlich. Deshalb werde ich wahrscheinlich noch die Entfernung berechnen, wie TGGC vorgeschlagen hat.
Das mit dem Pixel Perfect Test wäre auch noch eine Möglichkeit, allerdings brauche ich dafür doch ein Sprite für die Maus oder wie kann ich mit der Systemmaus einen PPT und einen Object (Sprite) durchführen?

lg chaia

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

25.01.2011, 20:39

Der Mauszeiger hat doch nur eine Position. Berechne eben wo in deinem Objekt sich die Maus befindet und schau nach ob dein Objekt an dieser Stelle transparent ist. Wenn nein -> Hit, wenn ja -> nächstes Objekt drunter testen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

25.01.2011, 22:09

eine kombination zwischen "Z-Buffer" und dem "perfektpixeltest" den dot beschrieben hat ist wohl am besten.
du durchläufst den vector rückwärts und nimmst das erste objekt bei dem der mauszeiger trifft, dann hörst du auf. dann verhält sich dein programm so wie die meisten anderen programme die ich kenn.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige