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

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

11

09.09.2009, 20:29

Wie wäre es, wenn du einfach mal den Code zeigst anstatt hier rumraten zu lassen ;)

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

12

09.09.2009, 21:56

Also gut.

Hier mal die Hauptschleife des Spiels:

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
47
    //Hauptschleife des Spiels durchlaufen

    //

    while (m_bGameRun == true)
    {
        //Events bearbeiten

        ProcessEvents();

        //Framework updaten und Buffer löschen

        g_pFramework->Update();
        g_pFramework->Clear();

        //Frames pro Sekunde messen

        //FPS();


        //Hintergrundbild rendern

        m_pSpriteBackground->Render();

        //Schachbrett rendern

        m_pSpriteSchachbrett->SetPos(150.0f, 50.0f);
        m_pSpriteSchachbrett->Render();

        //Beenden Button rendern

        m_pSpriteBeenden->SetPos(250.0f, 10.0f);
        m_pSpriteBeenden->Render();


        //Figuren rendern

        g_pFiguren->Render();

        //Modus (1vs1) der KI mitteilen

        g_pKI->SetMode(m_b1vs1);

        //Cursor updaten und rendern

        int x;
        int y;
        int Button;
        Button = SDL_GetMouseState(&x, &y);
        m_pCursor->UpdateMouse(x, y, Button);

        
        m_bGameRun = m_pCursor->Render(&m_b1vs1);

        SDL_ShowCursor(true);

        //Buffer flippen

        g_pFramework->Flip();
    }




C-/C++-Quelltext

1
m_pCursor->UpdateMouse(x, y, Button);

Das teilt der Cursor-Klasse nur die Mausposition und nachher wird ja die Funktion

C-/C++-Quelltext

1
m_bGameRun = m_pCursor->Render(&m_b1vs1);

aufgerufen.
Und diese prüft jetzt eben, ob, und wo ein klick stattgefunden hat, und zum Schluss wird der Cursor mittels SDL_WarpMouse(m_XPos, m_YPos); auf diese Position gesetzt.


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
void CGame::ProcessEvents()
{
    SDL_Event Event;

    //Gab es ein Event?

    if(SDL_PollEvent(&Event))
    {
        //Ja, also schauen, welches

        switch(Event.type)
        {
            //Beenden?

        case (SDL_QUIT):
            {
                m_bGameRun = false;
            } break;

            //Wurde eine Taste gedrückt?

        case (SDL_KEYDOWN):
            {
                switch (Event.key.keysym.sym)
                {
                case (SDLK_ESCAPE):
                    {
                        //Ja, also Spiel beenden

                        m_bGameRun = false;
                    } break;
                }
            } break;

        }
    }
} //ProcessEvents



Die Nachrichtenschleife. Das Spiel sollte also auch per Tastendruck zu beenden sein, ist es aber nicht!

Ich hoffe, dieser Code hilft euch weiter, mir weiterzuhelfen! :D



Edit:
Wenn ich

C-/C++-Quelltext

1
m_bGameRun = m_pCursor->Render(&m_b1vs1);
nicht aufrufe, funktioniert die Nachrichtenschleife einwandfrei.
Und wenn ich sie aufrufe, gehts schon nicht mehr. Und an dem Code der Funktion kanns auch nicht wirklich liegen, denn wenn ich alles auskommentier, außer

C-/C++-Quelltext

1
return true;
, gehts auch noch nicht.

13

09.09.2009, 22:14

Also ich sehe da ein paar prinzipielle Probleme in der Nachrichtenschleife:

Erstens holst du in jedem Durchgang nur eine Nachricht mit SDL_PollEvent. Jetzt stell dir einmal vor was passiert wenn du mehr als eine Nachricht in einem Frame bekommst. Da würde ich einmal auf jeden Fall auf eine while-Schleife umstellen.

Zweitens verstehe ich denn Sinn hinter dem Aufruf von SDL_WarpMouse in jedem Frame nicht. Diese Funktion ist dazu gedacht den Cursor einmal auf eine andere Position zu setzten (zb. um die Maus zu zentrieren) und nicht um in jedem Frame die Position zu ändern. Wenn du außerdem in die Dokumentation schaust wirst du auch bemerken, dass du damit auch jedes Mal ein MouseMotion-Event generierst, was deine Nachrichtenschleife dazu bringt völlig verstopft zu werden und dadurch nicht mehr in der Lage ist die anstehenden Nachrichten zu verarbeiten.

Aber eigentlich wird der Cursor eh automatisch bewegt und ist auch standardmäßig sichtbar, dh. eigentlich kannst du dir das aktivieren und bewegen des Cursors völlig sparen.[list][/list]
Tutorials zu OpenGL, Ubuntu und Programmieren allgemein: www.tomprogs.at

Forum und Wiki zum Programmieren lernen: proggen.org/forum.proggen.org

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

14

09.09.2009, 22:20

SDL_WarpMouse rufe ich auf, um den Mauscursor auf die aktuelle Position der Maus stelle.
Und wenn ich keine Funktionen für die Maus aufrufe, bekomm ich keine Maus. So wars bei mir zumindest.

Ok, das mit der Nachrichtenschleife werd ich mal umstellen!

Dann bräucht ich jetzt einen Tip, wie ich den Mauscursor auf die richtige Position setzt, ohne SDL_WarpMouse aufrufen zu müssen!


Edit: Der Link sollte wieder gehen!

15

09.09.2009, 22:55

Zitat von »"Käsekönig"«

SDL_WarpMouse rufe ich auf, um den Mauscursor auf die aktuelle Position der Maus stelle.
Und wenn ich keine Funktionen für die Maus aufrufe, bekomm ich keine Maus. So wars bei mir zumindest.


Eigentlich sollte der Cursor automatisch an die richtige Postion gesetzt werden. Was ist denn wenn du nur ShowCursor aufrufst und kein WarpMouse. Ansonsten kannst du ja versuchen einen anderen Cursor zu setzen. Ansonsten rendere doch deinen eigenen Cursor. Das geht sehr schnell und ist plattformunabhängig: http://ubuntuforums.org/showthread.php?t=500717


Zitat von »"Käsekönig"«

Edit: Der Link sollte wieder gehen!

Stimmt, auch wenn er mir unter Linux recht wenig bringt ;) Ich habs auch unter Vista versucht, aber da kommt irgendwas von einer fehlenden Side-by-Side-Konfiguration.
Tutorials zu OpenGL, Ubuntu und Programmieren allgemein: www.tomprogs.at

Forum und Wiki zum Programmieren lernen: proggen.org/forum.proggen.org

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

16

10.09.2009, 16:06

Danke für den Tip! ;)

Ich render jetzt ein eigenes Maussprite.
Warum die Maus jetzt eigentlich nicht ohne SDL_WarpMouse geht, weiß ich nicht, ist aber nicht relevant. Da ich in Zukunft eh nicht mehr mit der SDL arbeiten werde, und einfach nur noch dieses Projekt halbwegs funktionierend fertig stellen will!^^

Vielen Dank.

Wenn das Schachspiel dann etwas weiter oder vielleicht fertig ist, meld ich mich wieder. :)

Werbeanzeige