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

Gelöschter Benutzer

unregistriert

1

20.11.2013, 14:01

SDL - "Couldn't open Name.bmp"

Sehr geehrtes Forum,
leider muss ich eure Freundlichkeit nochmal missbrauchen :) . Ich habe mir im Buch "C++ für Spieleprogrammierer" die SDL angeschaut und probiert. Nun habe ich mir das Listing von der CD geladen und einzelne Code-Teile in ein neues Projekt von Visual Studio Express 2013 kopiert. Natürlich habe ich die Sachen, die für mein "Spiel" unrelevant sind, außen vor gelassen. Ich verwende die SDL-devel-1.2.15-VC. Nun zu meinem Problem: Wenn ich ein .bmp Bild laden will, ich habe mir die "Laser.bmp" von Kalista genommen, um sicher zu sein, dass am Bild nichts fehlt, kommt nun die Initialisierung des Spielers (m_pSpritePlayer = new CSprite; m_pSpritePlayer->Load("Laser.bmp", 0, 64, 64); m_pSpritePlayer->SetColorKey(255, 0, 255); ), es ruft die Funktion der "Sprite.cpp"-Datei noch auf:
void CSprite::Load(const string sFilename)
{
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;
//zum testen ob immer noch ein Fehler beim Laden des Bildes kommt
Sleep(100000);
// Framework herunterfahren
g_pFramework->Quit();
// Gesamtes Spiel beenden
exit(1);
}
// Rect initialisieren
... (soweit kommt es erst garnicht, deshalb ersetze ich diesen Bereich durch "...")
} // Load
Immer wenn ich den Debugger starte, geht es bis zu den Fehlermeldungen und dann wartet es noch 100 sec. Ich habe die Datei "Laser" schon in sämtliche Projektordner kopiert, dasselbe gilt auch für den Ordner "Data" mit der "Laser"-.bmp darin. Ich weiß wirklich nicht weiter, im Netz habe ich auch nichts brauchbares gefunden. Zusätzlich wollte ich noch Fragen, wie ich die Codeabschnitte einfügen kann/soll? Ich wurde schon darauf hingewiesen dass ich es machen soll, leider weis ich nur nicht wie es geht.
Mit freundlichen Grüßen,
alex41018

Gelöschter Benutzer

unregistriert

2

21.11.2013, 21:44

Niemand da der typische Anfängerfehler mit der SDL kennt :-( ?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

21.11.2013, 21:54

Ich würde gern nochmal den Code in Code Tags sehen und nochmal die Error Meldung genau zitiert haben. Dann guck ich mal. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Squareys

Frischling

Beiträge: 35

Wohnort: Konstanz

Beruf: VR Development Lead bei Vhite Rabbit.

  • Private Nachricht senden

4

21.11.2013, 23:51

Stimme da Architekt durchaus zu, kann man nicht besonders gut lesen.

Überprüf mal die Workingdir von deinem Spiel und schau, dass das Bild da drinne liegt. Workingdir ist nicht immer der Ordner in der die .exe steckt, und schon gar nicht, wo der code drin ist. Du kannst auch versuchen, das Spiel nicht von VS aus zu starten, dann ist der Workingdir meistens auch in dem Verzeichnis, in dem die .exe drinne liegt.

Gelöschter Benutzer

unregistriert

5

22.11.2013, 16:58

Vielen Dank für eure Antworten! Hier die Code-Ausschnitte: Player.cpp

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "Player.hpp"
#include <Windows.h>

// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CPlayer::CPlayer()
{
    m_pSpritePlayer = NULL;

} // Konstruktor



// Init
//
// Aufgabe: Sprites erzeugen und laden
//
void CPlayer::Init()
{
    // Spielersprite erstellen
    m_pSpritePlayer = new CSprite;


    m_pSpritePlayer->Load("Laser.bmp", 0, 64, 64);
    m_pSpritePlayer->SetColorKey(255, 0, 255);

} // Init



// Quit
//
// Aufgabe: Sprites freigeben
//
void CPlayer::Quit()
{
    // Spieler-Sprite freigeben
    if (m_pSpritePlayer != NULL)
    {
        delete (m_pSpritePlayer);
        m_pSpritePlayer = NULL;
    }

} // Quit



// Reset
//
// Aufgabe: Spielerwerte auf Standard setzen
//
void CPlayer::Reset()
{
    // Startposition des Spielers
    m_fXPos = 376.0f;
    m_fYPos = 520.0f;

} // Reset



// Render
//
// Aufgabe: Spieler und Schüsse rendern
//
void CPlayer::Render()
{
    // Position des Spielers setzen und Sprite rendern
    m_pSpritePlayer->SetPos(m_fXPos, m_fYPos);
    m_pSpritePlayer->Render();

} // Render



// Update
//
// Aufgabe: Spieler updaten
//
void CPlayer::Update()
{
    // Bewegung des Spielers
    ProcessMoving();

    // Position und Animationsphase überprüfen
    CheckPosition();

} // Update



// ProcessMoving
//
// Aufgabe: Bewegung des Spielers
//
void CPlayer::ProcessMoving()
{
    // Nach links?
    if (g_pFramework->KeyDown(SDLK_UP))
    {
        // Spieler nach oben bewegen
        m_fYPos -= 300.0f * g_pTimer->GetElapsed();

    }
    // Nach rechts?
    else if (g_pFramework->KeyDown(SDLK_DOWN))
    {
        // Spieler nach unten bewegen
        m_fYPos += 300.0f * g_pTimer->GetElapsed();

    }
    // Spieler wurde nicht bewegt
    else
    {
    }

} // ProcessMoving



// CheckPosition
//
// Aufgabe: Position und Animationsphase prüfen
//
void CPlayer::CheckPosition()
{
    // Linker und rechter Rand
    if (m_fYPos < 0.0f)
        m_fYPos = 0.0f;
    else if (m_fYPos > 400.0f)
        m_fYPos = 400.0f;

} // CheckPosition

Player.hpp

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
#ifndef PLAYER_HPP
#define PLAYER_HPP

#include <list>
#include "Sprite.hpp"

class CPlayer
{
public:
    CPlayer();
    void Init();
    void Quit();
    void Render();
    void Update();
    void Reset();

private:
    void ProcessMoving();
    void CheckPosition();

    CSprite *m_pSpritePlayer; // Sprite für Spieler
    float m_fXPos;            // X-Position des Spielers
    float m_fYPos;            // Y-Position des Spielers


};

#endif

Sprite.cpp

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "Sprite.hpp"
#include <Windows.h>

// Konstruktor
//
// Aufgabe: Zeiger auf Screen holen
//
CSprite::CSprite()
{
    // Zeiger auf Screen holen
    m_pScreen = g_pFramework->GetScreen();

} // Konstruktor

// Destruktor
//
// Aufgabe: Surface des Sprites freigeben
//
CSprite::~CSprite()
{
    // Surface freigeben
    SDL_FreeSurface(m_pImage);

} // Destruktor


// Load
//
// Aufgabe: Einfaches, nicht animiertes Sprite laden
//
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;

        //zum testen ob immer noch ein Fehler beim Laden des Bildes kommt
        Sleep(100000);

        // 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


// Load
//
// Aufgabe: Animiertes Sprite laden
//
void CSprite::Load(const string sFilename, int NumFrames,
    int FrameWidth, int FrameHeight)
{
    // Bitmap laden
    Load(sFilename);

    // Rect für Animationsphase initialisieren
    m_NumFrames = NumFrames;
    m_FrameWidth = FrameWidth;
    m_FrameHeight = FrameHeight;
    m_FrameRect.w = FrameWidth;
    m_FrameRect.h = FrameHeight;
    m_NumFramesX = m_pImage->w / m_FrameWidth;

} // Load


// SetColorKey
//
// Aufgabe: Transparente Farbe festlegen
//
void CSprite::SetColorKey(int R, int G, int B)
{
    // Colorkey einstellen
    SDL_SetColorKey(m_pImage, SDL_SRCCOLORKEY,
        SDL_MapRGB(m_pImage->format, R, G, B));

} // SetColorKey


// SetPos
//
// Aufgabe: Position des Sprites festlegen
//
void CSprite::SetPos(float fXPos, float fYPos)
{
    // Rect updaten
    m_Rect.x = static_cast<int>(fXPos);
    m_Rect.y = static_cast<int>(fYPos);

} // SetPos


// Render
//
// Aufgabe: Sprite rendern (ohne Animation)
//
void CSprite::Render()
{
    // Sprite rendern
    SDL_BlitSurface(m_pImage, NULL, m_pScreen, &m_Rect);

} // Render


// Render
//
// Aufgabe: Ausschnitt des Sprites rendern (Animationsphase)
//
void CSprite::Render(float fFrameNumber)
{
    // Ausschnitt der aktuellen Animationsphase berechnen
    //

    // Spalte berechnen
    int Column = static_cast<int>(fFrameNumber) % m_NumFramesX;

    // Zeile berechnen
    int Row = static_cast<int>(fFrameNumber) / m_NumFramesX;

    // Rect berechnen
    m_FrameRect.x = Column * m_FrameWidth;
    m_FrameRect.y = Row * m_FrameHeight;

    // Ausschnitt rendern
    SDL_BlitSurface(m_pImage, &m_FrameRect, m_pScreen, &m_Rect);

} // Render

Sprite.hpp

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
#ifndef SPRITE_HPP
#define SPRITE_HPP

#include "Framework.hpp"

class CSprite
{
public:
    CSprite();
    ~CSprite();

    void Load(const string sFilename);
    void Load(const string sFilename, int NumFrames, int FrameWidth, int FrameHeight);
    void SetColorKey(int R, int G, int B);
    void SetPos(float fXPos, float fYPos);
    void Render();
    void Render(float fFrameNumber);
    SDL_Rect GetRect(){ return m_Rect; }

private:
    SDL_Surface *m_pScreen; //Zeiger auf den Screen des Frameworks
    SDL_Surface *m_pImage;  //Das eigentliche Bild des Sprites
    SDL_Rect m_Rect;        //Rect des Sprites
    SDL_Rect m_FrameRect;   //Ausschnitt für Animationsphase
    int m_NumFrames;        //Anzahl der Animationsphasen
    int m_FrameWidth;       //Breite der Animationsphase
    int m_FrameHeight;      //Höhe einer Animationsphase
    int m_NumFramesX;       //Wie viele Anim-Phasen in X-Richtung?
};

#endif

Die damalige Fehlermeldung war, in der .exe, "Couldn't open Name.bmp". Ich habe danach einfach mal die "SDL1" mint der "SDL2" getauscht, d. h. include und lib Verzeichnisse geändert. Dies wollte nicht funktionieren, also habe ich einfach wieder die Pfade zu "SDL1" (der genaue Name steht im Beitrag zuvor) angegeben. Beim Linker habe ich nichts geändert, bzw. dort steht "sdl.lib" und "sdlmain.lib". Wenn ich nun kompiliere, kommen von VisualStudio die Fehlermeldungen:" C2065: 'SDL_SRCCOLORKEY': nichtdeklarierter Bezeichner" und "IntelliSense: Der Bezeichner ""SDL_SRCCOLORKEY"" ist nicht definiert." Die Funktion liegt in der Sprite.cpp bei der Funktion SetColorKey. PS: es können noch sehr viele Fehler enthalten sein, die nichts mit dem Bild zu tun haben, weil ich mich mit diesem Projekt ein bisschen an die SDL heranwaagen will.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »alex41018« (22.11.2013, 17:03)


TigerClaw25

unregistriert

6

22.11.2013, 17:44

Der Code passt, vllt nutzt du eine falsch SDL Version.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

22.11.2013, 18:45

Das liegt wohl eher tatsächlich daran, dass das Bild nicht dort ist, wo das Programm es erwartet. Es wurde ja schon mal geraten die Angabe des Working Directory für den Debugger in den Projekt-Einstellungen zu überprüfen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Gelöschter Benutzer

unregistriert

8

23.11.2013, 09:00

Ich hab mal alles durchschaut in Visual Studio 2012 und 2013 (probiere das gleiche auch an 2012). Leider konnte ich dieses Verzeichnis nicht finden. Wo liegt es?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

23.11.2013, 09:19

Project -> Project Properties -> Configuration Properties -> Debugging -> Working Directory
»BlueCobold« hat folgendes Bild angehängt:
  • WD.png
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Gelöschter Benutzer

unregistriert

10

23.11.2013, 10:48

da steht "$(ProjektDir)". Passt das?

Werbeanzeige