B
Bgag
Hallo!
Ich habe mich heute etwas mit der Simple DirectMendia Library (libsdl) beschäftigt und habe in diesem Rahmen ein kleines programm geschrieben, mit dem ich testen wollte, ob ich die Funktionsweise verstanden habe. Nach einigen Problemen beim Kompilieren und Einbinden der libsdl gelang es mir auch schließlich das programm fertig zu kompilieren, jedoch bekomme ich beim Ausführen immer einen Segmentation fault. kann mir jemand sagen, woran das liegt? Den Quellcode habe ich euch angehängt
Vielen Dank schonmal für eure Mühen.
MfG, Andy
Ich habe mich heute etwas mit der Simple DirectMendia Library (libsdl) beschäftigt und habe in diesem Rahmen ein kleines programm geschrieben, mit dem ich testen wollte, ob ich die Funktionsweise verstanden habe. Nach einigen Problemen beim Kompilieren und Einbinden der libsdl gelang es mir auch schließlich das programm fertig zu kompilieren, jedoch bekomme ich beim Ausführen immer einen Segmentation fault. kann mir jemand sagen, woran das liegt? Den Quellcode habe ich euch angehängt
Vielen Dank schonmal für eure Mühen.
MfG, Andy
C:
/* include needed packages */
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
#include "SDL_image.h"
/* define boolean type */
enum boolean { FALSE, TRUE };
/* screen dimensions and color depth */
#define WIDTH 630
#define HEIGHT 480
#define DEPTH 32
/* define map type */
typedef struct
{
int xfields;
int yfields;
int *matrix;
} map;
/* define player type */
typedef struct
{
int xPos;
int yPos;
} player;
/* define implemented functions */
map initMap(int x, int y);
player initPlayer(int x, int y);
int main(int argc, char* argv[])
{
/* init helper vars */
int x, y, quit = 0;
/* init pointer at sdl type */
SDL_Surface *screen,
*background,
*wall,
*monster;
/* init temporary rectangles */
SDL_Rect drect, srect;
/* init rectangles fo the monster */
SDL_Rect dmonster, smonster;
/* init SDL_Event event */
SDL_Event event;
/* init step size */
int tilesize = 30;
/* init game map */
map gmap = initMap(21, 16);
/* init player */
player oskar = initPlayer((int) 10, (int) 10);
/* init sdl type and return 1 at failture */
if( SDL_Init(SDL_INIT_VIDEO) < 0 )
{
/* print out error message */
fprintf(stderr, "Failed to init SDL: %s\n", SDL_GetError());
/* exit program */
exit(1);
}
/* quit sdl on exit */
atexit(SDL_Quit);
/* get SDL_Surface pointer */
if( (screen = SDL_SetVideoMode(630, 480, DEPTH, SDL_SWSURFACE)) == NULL )
{
/* output error message */
fprintf(stderr, "Failed to create window (%d*%d): %s\n", WIDTH, HEIGHT, SDL_GetError());
/* exit program */
exit(-1);
}
/* load background image */
if( (background = IMG_Load("background.jpg")) == NULL )
{
/* print out error message */
fprintf(stderr, "Failed to load background: %s\n", SDL_GetError());
exit(-1);
}
/* load wall image */
if( (wall = IMG_Load("wall.jpg")) == NULL )
{
/* print out error message */
fprintf(stderr, "Failed to load wall: %s\n", SDL_GetError());
exit(-1);
}
/* load player image (the monster) */
if( (monster = IMG_Load("monster.gif")) == NULL )
{
/* print out error message */
fprintf(stderr, "Failed to load monster: %s\n", SDL_GetError());
exit(-1);
}
/* set background data */
srect.x = 0;
srect.y = 0;
srect.w = background->w;
srect.h = background->h;
drect.x = 0;
drect.y = 0;
drect.w = background->w;
drect.h = background->h;
/* set player data */
smonster.x = 0;
smonster.y = 0;
smonster.w = monster->w;
smonster.h = monster->h;
dmonster.x = oskar.xPos * tilesize;
dmonster.y = oskar.yPos * tilesize;
dmonster.w = monster->w;
dmonster.h = monster->h;
/* iterate over map rows */
for(x = 0; x < gmap.xfields; x++)
{
/* iterate over map columns */
for(y = 0; y < gmap.yfields; y++)
{
/* set current rectangle */
drect.x = tilesize * x;
drect.y = tilesize * y;
/* check if a border is needed */
if( gmap.matrix[x * gmap.xfields + y] == 1 )
{
SDL_BlitSurface(background, &srect, screen, &drect);
}
else
{
SDL_BlitSurface(wall, &srect, screen, &drect);
}
SDL_UpdateRects(screen, 1, &drect);
}
}
/* update monster rectangle */
SDL_BlitSurface(monster, &smonster, screen, &dmonster);
SDL_UpdateRects(screen, 1, &dmonster);
/* free surfaces */
SDL_FreeSurface(background);
SDL_FreeSurface(monster);
/* loop while in game */
while( quit == 0 )
{
/* get events */
while( SDL_PollEvent( &event ) )
{
switch( event.type )
{
case SDL_KEYDOWN:
/* move left */
if( event.key.keysym.sym == 276 && gmap.matrix[(oskar.xPos - 1) * gmap.xfields + oskar.yPos] != 1 )
{
(oskar.xPos)--;
}
/* move right */
if( event.key.keysym.sym == 275 && gmap.matrix[(oskar.xPos + 1) * gmap.xfields + oskar.yPos] != 1 )
{
(oskar.xPos)++;
}
/* move down */
if( event.key.keysym.sym == 274 && gmap.matrix[oskar.xPos * gmap.xfields + oskar.yPos + 1] != 1 )
{
oskar.yPos++;
}
/* move up */
if( event.key.keysym.sym == 273 && gmap.matrix[oskar.xPos * gmap.xfields + oskar.yPos - 1] != 1 )
{
(oskar.yPos)--;
}
/* quit game */
if( event.key.keysym.sym == 39 )
{
quit = 1;
}
break;
case SDL_QUIT:
quit = 1;
break;
default:
break;
}
}
/* iterate over map rows */
for(x = 0; x < gmap.xfields; x++)
{
/* iterate over map columns */
for(y = 0; y < gmap.yfields; y++)
{
/* set current rectangle */
drect.x = tilesize * x;
drect.y = tilesize * y;
/* check if a border is needed */
if( gmap.matrix[x * gmap.xfields + y] == 1 )
{
SDL_BlitSurface(background, &srect, screen, &drect);
}
else
{
SDL_BlitSurface(wall, &srect, screen, &drect);
}
}
}
SDL_BlitSurface(monster, &smonster, screen, &dmonster);
SDL_Flip(screen);
}
/* quit sdl */
SDL_Quit();
exit(0);
}
map initMap(int x, int y)
{
/* init helper vars */
int i, j;
/* init map structure */
map gmap;
/* set num of x und y fields */
gmap.xfields = x;
gmap.yfields = y;
/* allocate space for the matrix */
gmap.matrix = malloc( sizeof(int) * x * y);
/* create a map end */
for (i = 0; i < gmap.xfields; i++)
{
for (j = 0; j < gmap.yfields; j++)
{
/* check if here must be a border */
if( (j%x == 0) || (i%y == 0) )
{
gmap.matrix[i * x + j] = 1;
}
/* no border */
else
{
gmap.matrix[i * x + j] = 0;
}
}
}
return gmap;
}
player initPlayer(int x, int y)
{
/* init player structure */
player monster;
/* assign start position */
monster.xPos = x;
monster.yPos = y;
return monster;
}
Zuletzt bearbeitet von einem Moderator: