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

KeksX

Community-Fossil

  • »KeksX« ist der Autor dieses Themas

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

1

09.03.2009, 21:30

Problem mit SDL_GetMouseState und Rect-Abfrage

Hallo liebe Community, ja, ich schon wieder ;).

Nachdem ich nun einiges erreicht habe, was das Spiel angeht, wollte ich ein Menü erstellen, damit mein nicht direkt in das Spiel hineingeworfen wird.
Zu testzwecken habe ich einfach eine kleine Überprüfung geschrieben, ob sich die Maus im Rect des Spielersprites befindet.

Da dies wirklich nur ein reiner Test ist, habe ich einen knallharten Stilbruch begangen, und die komplette Abfrage in CGame::ProcessEvents geschrieben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int mouseX, mouseY;
    SDL_GetMouseState(&mouseX, &mouseY);
    if( mouseX < m_pPlayer->GetRect().x + m_pPlayer->GetRect().w &&
        mouseX > m_pPlayer->GetRect().x && 
        mouseY < m_pPlayer->GetRect().y + m_pPlayer->GetRect().h &&
        mouseY > m_pPlayer->GetRect().y
        /*&& SDL_BUTTON(SDL_BUTTON_LEFT)*/)
    {
        m_bGameRun = false;
    }


Soweit so gut. Keine Fehlermeldung, und anscheinend arbeitet hier auch (fast) alles korrekt.
Allerdings....

2. Wird nur überprüft, ob sich die Maus innerhalb eines 64*64-Rects bei X und Y 0 befindet... Ich erkenne den Fehler, den ich gemacht habe, allerdings nicht ...



Hoffe auf konstruktive Antworten!

MfG

EDIT: 1. Hat sich erledigt, aber 2. bleibt bestehen.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

2

09.03.2009, 21:36

Probier's mal so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int mouseX, mouseY;
    SDL_GetMouseState(&mouseX, &mouseY);
    if( (mouseX < (m_pPlayer->GetRect().x + m_pPlayer->GetRect().w)) &&
        (mouseX > m_pPlayer->GetRect().x) &&
        (mouseY < (m_pPlayer->GetRect().y + m_pPlayer->GetRect().h)) &&
        (mouseY > m_pPlayer->GetRect().y)
        /*&& SDL_BUTTON(SDL_BUTTON_LEFT)*/)
    {
        m_bGameRun = false;
    }

KeksX

Community-Fossil

  • »KeksX« ist der Autor dieses Themas

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

3

09.03.2009, 21:39

Durch Jonny kam ich wenige Minuten zuvor auf genau das Gleiche..
Allerdings bleibt weiterhin das Problem, dass sich das Rect, das überprüft wird, bei X = 0 und Y = 0 befindet...

MfG

4

09.03.2009, 21:53

Wenn du das ein wenig auseinanderfieselst?

C-/C++-Quelltext

1
2
3
4
5
6
int rhStart = m_pPlayer->GetRect().x;    // Rechteck horizontal

int rhEnd   = rhStart + m_pPlayer->GetRect().w;

// Dann sieht das übersichtlicher aus

if ( mouseX >= rhStart && mouseX <= rhEnd )  // Treffer auf X-Achse

 


Und dett janze analog für die Y-Achse...
fka tm

KeksX

Community-Fossil

  • »KeksX« ist der Autor dieses Themas

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

5

09.03.2009, 22:04

Weeßte wat? Ditte hab ick gemacht, und es funzelt, wa? ;).

Sehr schön, danke für die Hilfe!
Allerdings wundert es mich stark, dass die erste Schreibweise nicht funktioniert...Theoretisch ist es doch äquivalent... Oder irre ich mich da?

Jedenfalls funktioniert die Schreibweise jetzt, und ich werde mich ransetzen, den Code weiter zu schreiben ;).

(Diesmal ohne Stilbruch und sauber ;) )


EDIT: Oh man!
Der Fehler lag nicht an der Schreibweise, sondern daran, dass MSVC++ vorher die Player.cpp nicht gespeichert hatte, in der ich das Rect des Spielers update. Nachdem ich die neue Schreibweise getippt habe, wurde auch Player.cpp gespeichert. (Erkennbar an dem "*")
Ich habe nun beide Schreibweisen nochmal ausprobiert und beide funktionieren...

Also Sachen gibt es...

6

09.03.2009, 22:16

Na dann... ;)

Vonwegen Äquivalenz: Ich hab halt >= und <= benutzt.
fka tm

Werbeanzeige