这是我的代码。
任何人都可以帮助我吗?
#include <SDL/SDL.h>
#include <stdlib.h>
#include <stdio.h>
int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy) {
SDL_Surface *temp;
SDL_Surface *image;
SDL_Rect position;
temp = SDL_LoadBMP(chemin);
image= SDL_DisplayFormat(temp);
position.x = posx;
position.y = posy;
position.w = image->w;
position.h = image->h;
SDL_BlitSurface(image,NULL,fenetre,&position); SDL_Flip(fenetre);
SDL_FreeSurface(temp);
SDL_FreeSurface(image);
}
int main(int argc, char *argv[]) {
SDL_Surface *fenetre;
SDL_Event event; int done=1; SDL_Init(SDL_INIT_VIDEO);
fenetre = SDL_SetVideoMode(910,600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
blit_image("resources/images/fondblanc.bmp",fenetre,0,0);
blit_image("resources/images/chat.bmp",fenetre,0,0);//cat
blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);//dog
blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); //horse
blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255); //tiger
blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);//hen
blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
while (done) {
SDL_WaitEvent(&event);
switch(event.type) {
case SDL_QUIT:
{
done=0;
break;
}
case SDL_MOUSEBUTTONDOWN:
{
if ((event.button.x>820)&&(event.button.x<890)&&(event.button.y<115)&& (event.button.y>25))
{
blit_image("resources/images/chat.bmp",fenetre,0,0);
}
if ((event.button.x>820)&&(event.button.x<890)&&(event.button.y<230)&& (event.button.y>140))
{
blit_image("resources/images/chien.bmp",fenetre,0,0);
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<345)&&(event.motion.y>255))
{
blit_image("resources/images/cheval.bmp",fenetre,0,0);
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<460)&& (event.motion.y>370))
{
blit_image("resources/images/tigre.bmp",fenetre,0,0);
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<575)&&(event.motion.y>485))
{
blit_image("resources/images/poule.bmp",fenetre,0,0);
}
}
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<115)&& (event.motion.y>25))
{
blit_image("resources/bouttons/chatbtClic.bmp",fenetre,820,25);
blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140);
blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<230)&&(event.motion.y>140))
{
blit_image("resources/bouttons/chienbtClic.bmp",fenetre,820,140);
blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<345)&& (event.motion.y>255))
{
blit_image("resources/bouttons/chevalbtClic.bmp",fenetre,820,255);
blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140);
blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<460)&&(event.motion.y>370)) {
blit_image("resources/bouttons/tigrebtClic.bmp",fenetre,820,370);
blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140);
blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
}
if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<575)&&(event.motion.y>485))
{
blit_image("resources/bouttons/poulebtClic.bmp",fenetre,820,485);
blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140);
blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
}
}
SDL_Quit();
return 0;
}
我使用gcc game.c -o prog -lSDL -lSDL_mixer -lSDL_ttf
代码编译成功但在输入./prog
执行代码时会显示"Segmentation fault (core dumped)"
然而,使用的文件存在于目录
中答案 0 :(得分:3)
你宣布了这个职能:
int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy) {
因此参数#1有15个字符。
但是当你打电话给它时,你可以用:
来调用它 blit_image("resources/images/fondblanc.bmp",fenetre,0,0);
我的计数文件名是31个字符,不适合15个字符。
我还在代码中添加了一些printf语句,这些语句可以帮助您找出崩溃的位置。 您应该继续添加更多printf语句,直到缩小崩溃范围。
答案 1 :(得分:0)
代码中的 许多 问题之一是:
int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy)
{
[...]
}
声明该函数返回int
。
您是否在该功能中看到return
声明?
如果没有return语句,它如何返回int
?
您的main
函数被声明为返回一个int,令人惊讶的是,以return 0;
结束。
你是如何在main
中完成的,而不是在你的其他功能中?