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

07.08.2005, 17:18

Objete mit der Maus ziehen

sers euch allen,

ich hätte gerne mal gewusst wie ich ein programm schreiben kann bei dem ein paar objekte in einem std-windowsfenster angeordnet werden (sie können sich auch gegenseitig verdecken).

dann soll man die objekte noch per maus ziehen können.

meine frage ist nun. wie finde ich raus wann die maus über einem objekt ist und vor allem wie finde ich raus ob die maus über einem objektteil ist, der nicht von einem anderen objekt verdeckt wird (also dass man nicht 2 objekte zieht wenn noch eins drunter liegt)

ich könnte mir vorstellen dass es dazu tutorials gibt doch die hab ich leider nicht gefunden :[

2

07.08.2005, 18:20

Man kann einfach zu jedem Objekt ein Rechteck berechnen, das das jeweilige Objekt komplett umgibt (quasi wie ne Bounding-Box). Dann kann man eine if-Abfrage machen, z.B. so:

C-/C++-Quelltext

1
2
3
4
5
6
bool bHit;
RECT rect;
if (GetCursorPos().x>rect.left && GetCursorPos().y>rect.top && GetCursorPos().x<rect.right && GetCursorPos.y<rect.bottom)
{
  bHit=true;
}
Mein Projekt: Rise of the Sylvan

Mastermind

unregistriert

3

07.08.2005, 19:00

wenn es 2d ist, können sich strenggenommen keine zwei Obkete überdecken. Du müstest also zumindest eine Z-Reihenfolge speichern und dann immer nur das Objekt unter der Maus mit dem kleinsten z bewegen.

4

07.08.2005, 19:26

das stimmt natürlich. aber würde man zb für ein 2d kartenspiel wo man die karten von oben sieht extra für jede karte einen z-wert nehmen oder gibts da noch ne andere lösung?

trotzdem hört sich die idee mit den bounding-boxen gar nicht schlecht an :]

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

5

07.08.2005, 19:44

Ich würde die Objekte in einer Liste ablegen. Wenn ein neues Objekt dazukommt (es wird angenommen, neue Objekte werden ganz oben draufgelegt) füge ich es vorne ein.
Das hat zur Folge, dass die Objekte in der Liste nach der Tiefe sortiert sind. Soll ein Objekt jetzt ein "Ebene" tiefer gelagert werden, verschiebe ich es in der Liste einfach um eine Stelle nach hinten.
Beim prüfen, welches Objekt angeklickt wurde, braucht man die Listen einfach immmer nur von vorne durchzugehen. Dadurch dass die Objekte in der Liste nach der Tiefe sortiert sind, ist das erste Objekt welches als angeklicktes Objekt erkannt wird, auch das oberste.

mfg Philipp

6

08.08.2005, 17:16

die idee ist prima, danke dafür :]

so brauch ich wenigstens keine 3 Dimension einfügen und kann behaupten alles 2D :P

/edit: hab mich mal rangesetzt und hänge jetzt an nem fehler der wahrscheinlich wegen der datenkapselung nicht geht.

C-/C++-Quelltext

1
2
3
4
5
private:

        ...

        int ListPos;


der ausschnitt aus meiner CCard-Klasse

C-/C++-Quelltext

1
2
3
4
5
6
7
struct SGameData
{
        ......

    const CCard *PlayerCards[MaxCardsPerHand];
    const CCard *CompCards[MaxCardsPerHand];
};


ausschnitt aus der spielstruktur aus der game.h

C-/C++-Quelltext

1
2
3
4
5
private:

        .....

        SGameData Data;


und die deklaration in der CGame-Klasse

nun verursacht folgender aufruf den fehler:

Data.CompCards->ListPos = i;

'L-wert gibt ein konstantes objekt an'

Es stimmt schon dass es konstant ist aber wo ist das problem wenn ich einen wert an einen member geben will? die konstanz des objektes wird dadurch doch nicht angegriffen, oder doch? O_o

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

08.08.2005, 19:37

Was ist hier const?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

8

09.08.2005, 16:07

also ich kenne const nur als englischen begriff für konstant. dementsprechend darf const CCard[MaxCardsPerHand] nicht mehr verändert werden.

Werbeanzeige