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

20.01.2012, 22:21

Spiel stürzt ab, Verweis auf SDL_Rect

Ich hab das Kapitel 12 erreicht. Ich wollte sofort ein Spiel mit Bildern programmieren. Ich wollte das Spiel Ping, Pong oder so ähnlich (Das Spiel mit den zwei Rechtecken links und rechts, die versuchen, dass der weiße Kreis nicht an ihnen vorbei geht) versuchen zu programmieren. Dabei habe ich die Grunddateien vom Beispiel-Spiel vom Buch impletiert. Es war zwar schwierig aber ich habe es später ohne Fehler Debuggen können.
Jetzt kommt das Problem: Beim Debuggen wurde der Bildschirm schwarz, jedoch kam kein Bild. Außerdem kam ein Warnschild mit der Aufschrift:

Zitat

Unbehandelte Ausnahme bei 0x00d01a26 in Live.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000008.

Der gelbe Pfeil beim Debugging zeigte auf diese Stelle:

C-/C++-Quelltext

1
        SDL_Rect GetRect () {return m_Rect;}


Hier der ganze Code von der Datei:

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
#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 einer Animationsphase
        int m_FrameHeight;      // Höhe einer Animationsphase
        int m_NumFramesX;       // Wie viele Anim-Phasen in X-Richtung?

};

#endif




Mfg RunRanger.
Programmiersprache: C++
Fortschritt: Grundkenntnissse

2

20.01.2012, 22:29

Wieso machst du die eigentlich nicht als const? Nur so beim überfliegen aufgefallen.
Wieso machst du deine Signatur so groß? ;(

MfG
Check

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

20.01.2012, 22:31

Und wie sieht die Nutzung und die .cpp Datei aus?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

4

21.01.2012, 12:50

Erstmals danke, für die schnellen Antworten.

Hier sind die Dateien bzw. Teile aus Dateien, die mit dem Rect zusammen hängen. Eine Information hab ich vergessen zu erwähnen :P Die Collisions-Funktion habe ich vorerst rausgenommen, um zu sehen, ob erstmal alles andere funktioniert.

Hier die 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
#include "Sprite.hpp"
// 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;

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




hier die Anwendung:
Player.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Player::Init ()
{

m_Rect.x = static_cast<int>(m_fXPos);
m_Rect.y = static_cast<int>(m_fYPos);
m_Rect.w = m_pSpritePlayer->GetRect ().w;
m_Rect.h = m_pSpritePlayer->GetRect ().h;


m_pSpritePlayer = new CSprite;
m_pSpritePlayer->Load ("Data/Schläger.jpg");
m_pSpritePlayer->SetColorKey (255, 0, 255);
}


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
#include "Sprite.hpp"




class Player
{

public:
Player ();
void Init ();
void Quit ();
void Render ();
void Update ();
void Reset ();
SDL_Rect GetRect () {return m_Rect;}

private:
void Move ();
void Position ();
CSprite *m_pSpritePlayer;
float m_fXPos;
float m_fYPos;
SDL_Rect m_Rect;

};



Die Dateien Ball.cpp und Ball.hpp, die den Kreis programmieren verlaufen so ähnlich:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Ball::Init (CSprite *pSpriteBall, float fXPos, float fYPos)
{
    m_pSpriteBall = pSpriteBall;
    m_fXPos = fXPos;
    m_fYPos = fYPos;



    m_Rect.x = static_cast<int>(fXPos);
    m_Rect.y = static_cast<int>(fYPos);
    m_Rect.w = pSpriteBall->GetRect ().w;
    m_Rect.h = pSpriteBall->GetRect ().h;

    m_bIsAlive = true;
}





Edit: Noch eine Zusatz-Information. Wenn ich die Rect-Koordinaten vom Spieler weg mache, funktioniert wieder fast alles.
Programmiersprache: C++
Fortschritt: Grundkenntnissse

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RunRanger« (21.01.2012, 13:43)


MysticDragon

Frischling

Beiträge: 20

Beruf: Student

  • Private Nachricht senden

5

21.01.2012, 17:05

Soweit ich sehen kann verwendest du in den Zeilen 6 und 7 in Player.cpp dein Sprite-Objekt "m_pSpritePlayer", erzeugst es aber erst in Zeile 10 per new.

Versuch' einmal die Zeilen 10 bis 12 an den Anfang von Player::Init() zu setzen. Vielleicht funktioniert es dann.

Beste Grüße

MysticDragon
Never trust an immediately running system.

6

21.01.2012, 18:09

Vielen, vielen, vielen Dank :D

Es funktioniert. :thumbsup:

Nochmals vielen Dank :D

Hintergrund erscheint, jedoch kein Kreis oder Spieler...ich schau mir nochmal alles an :search: , falls ich es nicht hinbekommen, melde ich mich nochmals.
Und nochmals vielen Dank :D
Programmiersprache: C++
Fortschritt: Grundkenntnissse

MysticDragon

Frischling

Beiträge: 20

Beruf: Student

  • Private Nachricht senden

7

21.01.2012, 19:16

Kein Problem. Gern geschehen ^^
Never trust an immediately running system.

Werbeanzeige