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

02.08.2014, 17:58

SDL-Kapitel 12 Event läuft nicht richtig

Hallo,

ich hab grad in dem Spiel in der SDL in Kapitel 12 von Heiko Kalista ein Menü geschrieben.

Hier zeige ich jetzt ersteimal den Codauschnitt der mir Probleme bereitet.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
if (SDL_PollEvent(&Event))
{
    //Ja also schauen welches
    switch (Event.type)
    {
    //Beenden
    case (SDL_QUIT) :
    {
                        MenüRun = false;
    } break;

    //Wurde eine Taste gedrückt
    case (SDL_KEYDOWN) :
    {
                           switch (Event.key.keysym.sym)
                           {
                           case (SDLK_ESCAPE) :
                           {
                                                  //Ja also Spiel beenden
                                                  MenüRun = false;
                           } break;
                           }
    } break;
    }
}

//Überschneiden sich RectCursor und RectPlay
if (CursorTipX > RectPlay.x && CursorTipX < RectPlay.x + RectPlay.w && CursorTipY > RectPlay.y && CursorTipY < RectPlay.y + RectPlay.h)
{
    //Aktives Sprite rendern
    SpritePlay->Render(1);


    if (SDL_PollEvent(&Event))
    {
        //Ja also schauen welches
        switch (Event.type)
        {

        //Wurde die Maus betätigt
        case (SDL_MOUSEBUTTONDOWN) :
        {
                                       GameStart = true;
        } break;
        }
    }


Wenn ich das Programm nun Ausführen will, Startet das Menü zwar ich kann aber nur durch Escape das Programm beenden. Wenn ich mit der Maus nun über Play fahrer rendert er zwar den richtigen Play Button es passiert aber nichts wenn ich auf ihn drücke.

Meine Frage ist jetzt ob der Nachrichtenspeicher vielleicht schon nach dem ersten benutzen von SDL_PollEvent gelöscht wird oder ich ganz falsch liege. Außerdem würde ich gerne wissen wie ich dieses Problem lösen kann.

Ich hoffe auf Antworten.
Danke schonmal im voraus.

2

02.08.2014, 18:07

Du solktest Eingabe und logik trennen. Mach dir z.b globale variablen mousex, mousey und eine bool variable mouseleftpressed, die du in der Gameloop, beim verarbeiten von events, entsprechend änderst. Nach dem abarbeiten der events zeichnest du alles, und danach machst du die logik (buttons checken usw):

int mousex, mousey
bool mouseldown;
..
for(;;) //endlosschleife
{
CheckEvents();
Draw();
DoLogic();
}

3

02.08.2014, 18:16

Danke für deine schnelle Antwort, :)

meinst du damit das ich sogar so ein kleines Menü in ein Klasse packen soll und dann alles also:

CheckEvents
Draw
Logik

erst in ner public Funktion ausführen soll?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

02.08.2014, 18:26

Nein, es wird ein Event gepollt und nichts verworfen. Doch bei deiner Variante würde ich auf SDL_WaitEvent setzen. Aber es ist enorm unschön, die Event Verarbeitung an mehreren Stellen vorzunehmen, also würde ich dir raten, wie du ja selbst schon erkennst, das ganze als Klasse zu realisieren (weil globale Variablen sind auch nicht so schön. ;)).
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

02.08.2014, 18:29

Danke bin ich grad schon dabei. :D

Werbeanzeige