Приложение либо зависает, либо makefood() делает координаты, равные одной из частей snakeparts[], чего не должно быть, проверка, вроде бы, не должна глючить. Одно из возможных мест зависаний - строка 170 driver.cpp. А может быть ошибка, если таймер запускает функцию, выполняемую в данный момент(на большей скорости чаще виснет). Вот ссылка на приложение: http://www.green-lord.hotbox.ru/powersnake-0.9pre1try2.tar.bz2
driver.cpp:
| Код | #include<iostream> #include"snake.h" #include<vector> #include<cstdlib> #include<time.h>//for srand
SDL_TimerID move_timer_id; SDL_TimerID clock_timer_id; void* move_callback_param; void* clock_callback_param;
Uint32 move(Uint32 interval, void *param); //is called by SDL timer Uint32 clock(Uint32 clock_interval, void *clock_param);
int one_second = 1000; void check_for_reverce(); void gameover();
const int width = 50; //width of the each segment of the snake
std::vector<Snake>snakeparts(3); /* {first...lost} */ int lost = 2;
Point food;
bool stop_move = false; int speed = 100; int scores = 0;
int screen_width = 800; int screen_high = 600;
int main(int argc, char *argv[]){ snakeparts[0] = Snake(150, 0, 1, 0,0); snakeparts[1] = Snake(100,0,1,0,0); snakeparts[2] = Snake(50,0, 1, 0,0); initsystem(); //inits sdl, draws background,starts sound,opens ttf
SDL_TimerID move_timer_id = SDL_AddTimer(speed, move, move_callback_param); SDL_TimerID clock_timer_id= SDL_AddTimer(one_second,clock,clock_callback_param); for(;;);
SDL_RemoveTimer(move_timer_id); Mix_CloseAudio(); return 0; }
void randomize_food(unsigned int num_of_tries=1){ long int seconds; while( (seconds=clock() ) == 0 || (seconds=clock() ) == 1); //to increase bad randomize srand(seconds*num_of_tries); food.xpos = width*(rand()%(screen_width-150)/width); food.ypos = width*(rand()%screen_high/width); }
void makefood(){ stop_move=false; DrawPart(&snakeparts[lost]); randomize_food(); int num_of_bad_randoms = 1; for(int i=0;i<=lost;i++) if(food.xpos==snakeparts[i].xpos && food.ypos == snakeparts[i].ypos){ i=-1; randomize_food(num_of_bad_randoms++); } Draw_food(food.xpos,food.ypos); stop_move=false; } void make_sound();
int check_for_food(){ if(snakeparts[0].xpos==food.xpos && snakeparts[0].ypos==food.ypos){ snakeparts.resize(snakeparts.size() + 1); snakeparts[lost+1] = snakeparts[lost]; lost++;
make_sound(); scores +=10; print_ttf(); return 1; } else return 0;
}
int game_stop = 0; Uint32 move(Uint32 interval, void *param) { while(stop_move); //whaiting while makefood is working SDL_Event event; if(SDL_PollEvent(&event) != 0) switch(event.type){ case SDL_QUIT:{ gameover(); break;} case SDL_KEYDOWN:{ if ( event.key.keysym.sym == SDLK_ESCAPE ){ gameover(); } else switch(event.key.keysym.sym) { case SDLK_SPACE:{ SDL_Delay(20000); break; }
case SDLK_UP:{ if(snakeparts[0].y_direct != 1){ snakeparts[0].y_direct = -1; snakeparts[0].x_direct = 0; } break;} case SDLK_DOWN:{ if(snakeparts[0].y_direct != -1){ snakeparts[0].y_direct = 1; snakeparts[0].x_direct = 0; } break;} case SDLK_LEFT:{ if(snakeparts[0].x_direct != 1){ snakeparts[0].x_direct = -1; snakeparts[0].y_direct = 0; } break;} case SDLK_RIGHT:{ if(snakeparts[0].x_direct != -1){ snakeparts[0].x_direct = 1; snakeparts[0].y_direct = 0; } break;} }
break;} }
Snake tmp = snakeparts[0]; //back up old first cords to second part snakeparts[0].xpos += snakeparts[0].x_direct*width; snakeparts[0].ypos += snakeparts[0].y_direct*width; if(snakeparts[0].xpos>=(screen_width-100)/*100-width of ttf panel*/ ||snakeparts[0].xpos<0 || snakeparts[0].ypos>screen_high-width || snakeparts[0].ypos<0) gameover(); for(int i=1;i<=lost;i++) if(snakeparts[0].xpos==snakeparts[i].xpos && snakeparts[0].ypos==snakeparts[i].ypos) gameover();
DrawPart(&snakeparts[0]); CleanPart(&snakeparts[lost]);
if(check_for_food() ) makefood(); //Lets give to all parts new cords(not for first & lost) for(int i = lost;i>1;i--) snakeparts[i] = snakeparts[i-1]; snakeparts[1] = tmp;
return speed; }
void gameover() { std::cout<<"GAME OVER\nYour scores = " << scores<<"\n"; SDL_RemoveTimer(move_timer_id); SDL_RemoveTimer(clock_timer_id); CD_close(); Mix_CloseAudio(); TTF_Quit(); exit(0); }
int m1=0; int m2=0; int s1=0; int s2=0;
Uint32 clock(Uint32 clock_interval, void *clock_param){ s2++; if(s2>9){ s2=0; s1++;} if(s1>=6){ s1=0; m2++;} if(m2>9){ m2=0; m1++;} print_time(); return one_second; }
void make_sound() { if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 1024)==-1) { printf("Mix_OpenAudio: %s\n", Mix_GetError()); exit(2); }
Mix_Chunk *food_music = Mix_LoadWAV("sounds/food.wav"); if(!food_music) printf("Mix_LoadWAV: %s\n", Mix_GetError()); if(Mix_VolumeChunk(food_music, MIX_MAX_VOLUME) == -1) printf("Error while configuring volume:Mix_PlayChannel: %s\n",Mix_GetError()); if(Mix_PlayChannel(-1, food_music, 0)==-1) printf("Mix_PlayChannel: %s\n",Mix_GetError()); }
|
|