2012-01-30 15 views
0

私はC++/SDLのゲームに取り組んできましたが、なぜwhileループが終了する前に私のプログラムが終了しているのか、非常に困惑しています。私は抜け穴を探しましたが、空手で出てきました。しかし、プログラムを試した後、私は "menu.h"ファイルに犯人がいると思う。ゲーム内のすべてのコードは次のとおりです。 Player.hは今までの定義の単なる束です。C++/SDLでの奇妙な動作?

include_file.h

#ifndef INCLUDE_FILE_H_INCLUDED 
#define INCLUDE_FILE_H_INCLUDED 

#include <map> 
#include <string> 
#include <SDL/SDL.h> 
#include <SDL/SDL_image.h> 
#include <SDL/SDL_mixer.h> 

using namespace std; 

struct image_struct 
{ 
    SDL_Surface *donkey; 
    SDL_Surface *donkey_select; 

    SDL_Surface *kawasaki; 
    SDL_Surface *kawasaki_select; 

    SDL_Surface *desert; 
    SDL_Surface *desert_select; 
}; 

struct sound_struct 
{ 
    Mix_Music *menu_theme; 
}; 

struct clip_struct 
{ 
    SDL_Rect level_select[1]; 
    SDL_Rect player_select[1]; 
    SDL_Rect bike_select[1]; 
}; 

void applysurface(int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *source_clip = NULL) 
{ 
    SDL_Rect offset; 

    offset.x = x; 
    offset.y = y; 

    SDL_BlitSurface(source, source_clip, destination, &offset); 
}; 

int quit; 
string level; 

image_struct image; 
sound_struct sound; 
clip_struct clip; 

SDL_Surface *screen; 
SDL_Event event; 

void variable_setvalue(void) 
{ 
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); 
    Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096); 

    clip.level_select[0].x = 0; 
    clip.level_select[0].y = 0; 
    clip.level_select[0].w = 128; 
    clip.level_select[0].h = 128; 

    clip.level_select[1].x = 128; 
    clip.level_select[1].y = 0; 
    clip.level_select[1].w = 256; 
    clip.level_select[1].h = 128; 

    clip.player_select[0].x = 0; 
    clip.player_select[0].y = 0; 
    clip.player_select[0].w = 50; 
    clip.player_select[0].h = 100; 

    clip.player_select[1].x = 50; 
    clip.player_select[1].y = 0; 
    clip.player_select[1].w = 100; 
    clip.player_select[1].h = 100; 

    clip.bike_select[0].x = 0; 
    clip.bike_select[0].y = 0; 
    clip.bike_select[0].w = 100; 
    clip.bike_select[0].h = 50; 

    clip.bike_select[1].x = 0; 
    clip.bike_select[1].y = 50; 
    clip.bike_select[1].w = 100; 
    clip.bike_select[1].h = 100; 

    SDL_Surface *screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE); 

    image.donkey = IMG_Load("images/donkey.png"); 
    image.donkey_select = IMG_Load("images/donkey_select.png"); 

    image.kawasaki = IMG_Load("images/kawasaki.png"); 
    image.kawasaki_select = IMG_Load("images/kawasaki_select.png"); 

    image.desert = IMG_Load("images/desert.png"); 
    image.desert_select = IMG_Load("images/desert_select.png"); 

    sound.menu_theme = Mix_LoadMUS("sounds/death_desert_racing.wav"); 

    level = "desert"; 
    quit = 0; 

}; 


#endif // INCLUDE_FILE_H_INCLUDED 

main.cppに

#include "include_file.h" 
#include "player.h" 
#include "menu.h" 

int main(int argc, char *argv[]) 
{ 
    variable_setvalue(); 

    while (quit == 0) 
    { 
     menu_action(); 
     if (level == "desert") 
     { 
      SDL_WM_SetCaption("Death Desert Racing", NULL); 
     }; 
    }; 

    SDL_FreeSurface(screen); 
    Mix_CloseAudio(); 
    SDL_Quit(); 
    return 0; 
}; 

menu.h

#ifndef MENU_H_INCLUDED 
#define MENU_H_INCLUDED 

#include "include_file.h" 
#include "player.h" 

struct menu_struct 
{ 
    int desert_x; 
    int desert_y; 
    int donkey_x; 
    int donkey_y; 
    int kawasaki_x; 
    int kawasaki_y; 

    SDL_Rect *desert; 
    SDL_Rect *donkey; 
    SDL_Rect *kawasaki; 
}; 

menu_struct menu; 

void menu_action(void) 
{ 
    SDL_Event menu_event; 

    string level_select = "desert"; 
    string character_select = "donkey"; 
    string vehical_select = "kawasaki"; 

    menu.desert = &clip.level_select[0]; 
    menu.donkey = &clip.player_select[0]; 
    menu.kawasaki = &clip.bike_select[0]; 

    menu.desert_x = 0; 
    menu.desert_y = 0; 

    menu.donkey_x = 0; 
    menu.donkey_y = 0; 

    menu.kawasaki_x = 0; 
    menu.kawasaki_y = 0; 

    int menu_number = 0; 
    int done = 0; 

    int x = 0; 
    int y = 0; 

    while (done == 0) 
    { 
     while (menu_number == 0) 
     { 
      if(SDL_PollEvent(&menu_event)) 
      { 
       x = menu_event.motion.x; 
       y = menu_event.motion.y; 

       switch(menu_event.type) 
       { 
        case SDL_MOUSEMOTION: 
         if ((x > menu.desert_x) and (x < menu.desert_x + 128) and (y > menu.desert_y) and (y < menu.desert_y + 128)) 
         {menu.desert = &clip.level_select[1];} 
         else {menu.desert = &clip.level_select[0];}; 
         break; 
       }; 
      }; 

    applysurface(menu.desert_x,menu.desert_y,image.desert_select,screen,menu.desert); 
    SDL_Flip(screen); 
    }; 
     while (menu_number == 1) 
     { 
      if(SDL_PollEvent(&menu_event)) 
      { 
       x = menu_event.motion.x; 
       y = menu_event.motion.y; 

       switch(menu_event.type) 
       { 
        case SDL_MOUSEMOTION: 
         if ((x > menu.donkey_x) and (x < menu.donkey_x + 128) and (y > menu.donkey_y) and (y < menu.donkey_y + 128)) 
         {menu.donkey = &clip.player_select[1];} 
         else {menu.donkey = &clip.player_select[0];}; 
         break; 
       }; 


      applysurface(menu.donkey_x,menu.donkey_y,image.donkey,screen,menu.donkey); 
      SDL_Flip(screen); 
      }; 
     }; 
    }; 
}; 

#endif // MENU_H_INCLUDED 

編集:私は、デバッグを通じてステップの後に、これらのメッセージを受け取りました。

#0 6812A21B SDL_Flip() (e:\projects\death_desert_racing\bin\debug\SDL.dll:??) 
#1 00401748 menu_action() (E:/Projects/Death_Desert_Racing/menu.h:69) 
#2 004019BD SDL_main(argc=1, argv=0x9e0750) (E:\Projects\Death_Desert_Racing\main.cpp:11) 
#3 00402887 console_main(argc=1, argv=0x9e0750) (./src/main/win32/SDL_win32_main.c:315) 
#4 00402944 WinMain(hInst=0x400000, hPrev=0x0, szCmdLine=0x241f22 "", sw=10) (./src/main/win32/SDL_win32_main.c:398) 
#5 0040205A main(argc=1746172080, argv=0x68134e90, __p__environ=0x68134540 <SDL_RegisterApp+15408>) (../mingw/main.c:73) 
+0

なぜあなたは 'menu.h'に犯人がいると思いますか?あなたの調査で明らかになったことは何ですか?あなたは、デバッガを使用し、ステップを踏んで、デバッグを試みましたか? –

+0

main.cppに "menu_action"の直前に "SDL_WM_SetCaption"を置き、ウィンドウが閉じられる直前にキャプションを表示しました。キャプションが「SDL_APP」から「death_desert_racing」に変更されたことを確認するのに十分速かった。私はポストでコード行を削除しました。 – Ripspace

+3

デバッガでコードをステップ実行しようとしましたか?問題がどこにあるのかを突き止め、問題の内容を正確に示すことさえできます。 –

答えて

0

私は自分自身の質問に答えていることを知っていますが、私は結局それを理解しました!だから私はJoachimのヒントを使ってデバッガの手順を説明しましたが、それはエラーがあったと言いました: "プログラムがSIGSEGVシグナルを受け取った、セグメンテーションフォールト"だから、私はそれが意味することを、www.unix.com/programming/27967-program-received-signal-sigsegv-segmentation-fault.htmlで調べました。だから私はSDL_Surface画面が宣言された場所を慎重に見て、値を割り当てました。私は間違って "SDL_Surface *"を画面の前に置いていました。これは、SDL_Flip(screen)(これは "menu.h"の " menu_action() ")、プログラムはフリーズすることなく直ちに終了してクラッシュしました。

+0

リンクの作成方法がわからないので、リンクは現在利用できません。 – Ripspace

0

@Johnはそれを釘付けにして答えに値すると思う。 clip.level_select[1].xに値を割り当て始めると、他の変数に属するメモリを誤って押し始めたばかりです。実際の結果はおそらくコンパイラに依存しますが、プロセス内の変数quitを何らかの形で変更する可能性は低いです。変数宣言を変更してみてください:

struct clip_struct 
{ 
    SDL_Rect level_select[2]; 
    SDL_Rect player_select[2]; 
    SDL_Rect bike_select[2]; 
}; 

何が起こるかをご覧ください。

+0

同じことが起こった。まったく変更はありませんでした。私は真剣に問題がmenu.hファイル内にあると思われる。 – Ripspace

+0

しかしこれは別の問題であり、それはまだ起こっていません。 – John