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

28.08.2011, 08:52

Hintergrund Rendern

Hi,
ich wollte gerade nur einfach ein Hintergrundbild was lediglich nur eine Farbe rendern lassen ... klappt aber leider nich ...
das SDL Game Fenster geht auf aber bleibt schwarz und stürtzt ab (keine Rückmeldung)
Ich habs eigentlich so versucht wie es in dem Buch beschrieben wurde ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Framework.hpp"
#include "Game.h"

int main (int argc, char *argv[])
{
    if(g_pFramework->Init(800,600,16,false) == false)
return (0);

    Game game;
    game.Init();
    game.Run();
    game.Quit();

    return (0);
}


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
#include "Game.h"


Game::Game(void)
{
}

void Game::Init()
{
    backGround = new CSprite;
    backGround->Load("sprites/bg.bmp");

    gameRun = true;
}

void Game::Run()
{
    while(gameRun)
    {
backGround->Render();
    }
}

void Game::Quit()
{
    if(backGround!=NULL)
delete(backGround);
}

Game::~Game(void)
{
}


die Framework.cpp,Sprite.cpp und soweiter hab ich direkt vom Buch so übernommen

das sagt er mir nach der komilation

Zitat

"PacMan.exe": "C:\coding\projekte\PacMan\Debug\PacMan.exe" geladen, Symbole wurden geladen.
"PacMan.exe": "C:\Windows\SysWOW64\ntdll.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\kernel32.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\KernelBase.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Program Files\AVAST Software\Avast\snxhk.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\coding\projekte\PacMan\PacMan\SDL.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"PacMan.exe": "C:\Windows\SysWOW64\advapi32.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\msvcrt.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\sechost.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\rpcrt4.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\sspicli.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\cryptbase.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\gdi32.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\user32.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\lpk.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\usp10.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\winmm.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\msvcp100d.dll" geladen, Symbole wurden geladen.
"PacMan.exe": "C:\Windows\SysWOW64\msvcr100d.dll" geladen, Symbole wurden geladen.
"PacMan.exe": "C:\Windows\SysWOW64\imm32.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\msctf.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\nvinit.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\uxtheme.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\dwmapi.dll" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\KBDUS.DLL" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\KBDUS.DLL" entladen.
"PacMan.exe": "C:\Windows\SysWOW64\KBDGR.DLL" geladen, Cannot find or open the PDB file
"PacMan.exe": "C:\Windows\SysWOW64\KBDGR.DLL" entladen.
"PacMan.exe": "C:\Windows\SysWOW64\ole32.dll" geladen, Cannot find or open the PDB file
Der Thread 'Win32-Thread' (0xfc0) hat mit Code -805306369 (0xcfffffff) geendet.
Das Programm "[1696] PacMan.exe: Systemeigen" wurde mit Code -805306369 (0xcfffffff) beendet.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

28.08.2011, 10:06

Wird in CSprite überprüft, ob das Laden des Bildes erfolgreich war?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

28.08.2011, 10:24

jop, hier mal der code

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
void CSprite::Load (const string sFilename)
{
    // Bitmap laden
    m_pImage = SDL_LoadBMP (sFilename.c_str () );

    // Prüfen, ob alles glatt ging
    if (m_pImage == NULL)
    {
        cout << "Fehler beim Laden von: " << sFilename.c_str ();
        cout << endl;
        cout << "Fehlermeldung: " << SDL_GetError () << endl;

        // Framework herunterfahren
        g_pFramework->Quit ();

        // Gesamtes Spiel beenden
        exit (1);
    }

    // Rect initialisieren
    m_Rect.x = 0;
    m_Rect.y = 0;
    m_Rect.w = m_pImage->w;
    m_Rect.h = m_pImage->h;

} // Load

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

28.08.2011, 10:47

Ich würde erstmal sagen: Framerate begrenzen (schau dir dazu SDL_GetTicks und SDL_Delay mal an), den Bildschirm in jedem Frame übermalen mit SDL_FillRect sowie mal Events angucken, damit deine Schleife per Tastendruck o.a. verlassen werden kann und somit nicht zu einer Endlosschleife mutiert.
Aber zunächst würde ich vorschlagen: Statt der Endlosschleife, lass das Fenster mittels SDL_Delay zunächst noch einige Sekunden auf, um dein Resultat zu sehen ;) bspw. mit SDL_Delay(2500); bleibt dein Fenster noch 2.5 Sekunden offen. Wenn du dann dein Resultat gesehen hast und Happy bist, befolge die obigen Anweisungen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

28.08.2011, 11:16

hmmm hab das jetzt so

C-/C++-Quelltext

1
2
3
4
5
void Game::Run()
{
        backGround->Render();
        SDL_Delay(2500);
}


meintest du das so?
das fenster verschwindet jedenfalls nach der zeit, aber es bleibt schwarz und reagiert nich :(

ridens

Frischling

Beiträge: 47

Beruf: Freiberuflicher Entwickler

  • Private Nachricht senden

6

28.08.2011, 14:16

Ich vermute, das liegt daran, dass du von deinem Rendern nichts siehst. Wenn du alles wie im Buch übernommen hast, arbeitet dein Programm mit double buffering. D.h. du hast tatsächlich zwei Bildschirme: der sichtbare, der im Fenster ist (scharz am Anfang) und dann noch ein unsichtbarer. Und auf diesen unsichtbaren zeichnet backGround->Render(); dein Hintergrundbild. Natürlich sieht man davon aber nichts. Dann wartet das Programm 2500ms lang und schließt sich danach. Es sollte funktionieren, wenn du nach dem Rendern noch ein

C-/C++-Quelltext

1
g_pFramework->Flip();
einbaust. Die Funktion wird im Buch beschrieben: sie schaltet zwischen den beiden Bildschirmen um und derjenige, auf den du grade dein Bild gerendert hast, erscheint im Fenster.

7

28.08.2011, 14:44

stimmt :D ^^ jetzt wo du es sagst fällts mir wie schuppen von der Kopfhaut ^^
ja jetzt seh ich den hintergrund! danke!

ABER:
das fenster (ich starte das im Fenstermodus) lässt sich immer noch nich hin und herschieben, es schein nicht zu reagieren ... was kann das sein?

edit:

ja das fenster hängt sich auf (keine rückmeldung) ... hab mal um zu testen ob er auf tastatur eingaben reagiert den code benutzt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void Game::Run()
{
    while(gameRun)
    {
        backGround->Render();
        g_pFramework->Flip();

        if(g_pFramework->KeyDown(SDLK_ESCAPE))
            gameRun = false;
    }
}


ging leider nich :/

ps: er zeigt immer noch an das er diese ganzen PBD files (was auch immer das sein soll) nich finden oder öffnen kann ... hat das vieleicht damit was zu tun?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Masie« (28.08.2011, 14:55)


8

28.08.2011, 15:13

Ich denke du solltest noch die Events abfangen, auch wenn du sie selbst nicht brauchst.
Das mit den PDB Files ist egal.

lg chaia

9

28.08.2011, 15:27

hmm welche events? steht das im buch wie das geht?
und wenn ich sie abgefangen hab, was soll ich damit tun?

ridens

Frischling

Beiträge: 47

Beruf: Freiberuflicher Entwickler

  • Private Nachricht senden

10

28.08.2011, 15:51

Im Buch hats in meiner Version auf Seite 433, Listing 12.38, die Funktion ProcessEvents. Die wird einfach in jedem Schleifendurchlauf vor dem Rendern und Flippen ausgeführt und fragt alle Events ab, die man dann einfach per switch behandeln kann. Damit lassen sich einfach solche Sachen wie pausieren bei alt+tab etc. umsetzen.

(Das Folgende ist lediglich eine Vermutung, ich habe da keine Ahnung ob das stimmt ;) ) Ich glaube was für das Hängen verantworlich sein könnte, ist dass der Aufruf von SDL_PumpEvents() fehlt. Im Buch hast du die Funktion g_pFramework->Update(), die zum einen den Timer aktualisiert und dann eben die Events "pumpt". Ich könnte mir vorstellen, dass ohne das die Events gewissermaßen stecken bleiben und nicht ihre Standardbehandlung, d.h. Fenster verschieben, bekommen. Das halte ich aber für unwahrscheinlich, es sollte mit und ohne gleichermaßen gehen.

Die oben genannte Funktion ProcessEvents geht allerdings nur, wenn in jedem Schleifendurchlauf vorher auch SDL_PumpEvents aufgerufen wird.

Werbeanzeige