Hallo!
Ich habe hier ein "kleines" Problem, das mich jetzt schon einige Stunden beschäftigt. Das (C++) Programm um das es geht ist ein Parallax-2D-Shooter, was aber für die eigentliche Problematik belanglos sein sollte.
Meine main.cpp sieht auszugsweise so aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <stdlib.h>
#include "main.h"
#include <SDL/SDL.h>
int main(int argc, char *argv[]){
SDL_Surface *screen;
SDL_Event event;
Uint8 *keys;
int done = 0;
if (SDL_Init(SDL_INIT_VIDEO) == -1) {
printf("Can't init SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
if (screen == NULL) {
printf("Can't set video mode: %s\n", SDL_GetError());
exit(1);
}
|
Nichts besonderes, funktioniert auch soweit.
Ich instanziiere also meine Klasse playership:
|
C-/C++-Quelltext
|
1
|
playership *ship;
|
und erstelle ein initiales Spielershiff:
|
C-/C++-Quelltext
|
1
|
ship->createplayer("player_unscaled.bmp",100,100);
|
Meine dazugehörige Klasse sieht etwa so aus:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
class playership {
public:
[...]
int createplayer (char bitmappath[100], int startx, int starty) {
ship1 = SDL_LoadBMP(bitmappath);
if (ship1 == NULL) {
return 1;
} else {
SDL_SetColorKey(ship1, SDL_SRCCOLORKEY, SDL_MapRGB(ship1->format, 255, 255, 255));
[...]
|
Dieser Code alleine funktioniert, ich erhalte eine Instanz und kann mein Schiff über den Bildschirm fliegen. Versuche ich jetzt aber ein anderes Bitmap zu laden, sei es jetzt in einer anderen Klasseninstanz oder direkt in main, bekomme ich einen Segmentation Fault. Lade ich meine Bitmaps nur über Surfaces die sich unmittelbar in main befinden, funktioniert alles wunderbar.
Als ich angefangen hatte meine Spielelemente in Klassen auszulagern, hat dieser Codeteil in ähnlicher Form auch mit anderen Surfaces zusammen funktioniert. Nach dem Hinzufügen einer weiteren Klasse lief nichts mehr, auch nachdem ich den neuen Code auskommentiert hatte.
Beim Versuch das ganze zu debuggen ist gdb jedesmal am SDL_LoadBMP hängen geblieben. Ich habe mal etwas gegooglet, habe da aber nur Hinweise auf Speicherverletzungen gefunden, die nicht unbedingt mit dieser Load-Zeile zusammen hängen.
Da ich erst seit einigen Tagen C++ programmiere, stehe ich etwas verlassen da. Nach 4 Stunden googlen und fruchtlosem rumprobieren sinkt leider auch die Motivation.
Vor allem, weil das Spiel an sich funktioniert, ich das aber gerne etwas OOP-konformer umsetzen will
Falls das irgendwie hilft: Ich kompiliere das ganze mit GCC 4.1.1 (der auch keine Fehler beim Komplilieren meldet), als IDE steht mir vim 7.1 zur Verfügung
, als Betriebssystem benutze ich Gentoo.
Auf Wunsch kann ich weitere Teile des Quellcodes posten, habe jetzt erstmal nur Teilstücke rausgesucht, die in meinen Augen relevant sind.
Gruß, pyr0