这个小游戏是上学期和另外3个同学一起做的,今天把代码稍微完善了一下,去掉了废代码,虽然游戏画面很烂,可玩性也很低,但毕竟是第一次摸索着做了个游戏哈,发到博客上留个纪念
游戏的英文名叫Bubbleman,直译是泡泡人而不是炸弹人……这是由于历史原因造成的,就不改了……
此游戏只能在Linux下面运行,windows下面跑不了,并且需要安装SDL库的支持(比较新的Linux版本都会在装系统时附带安装),可执行程序已编译好,名为bm,若要自行编译,则需要在shell下输入命令:
gcc bubbleman.c -lSDL -lSDL_image -o xxx
今天博客新增了C/C++分类,也就顺便把这篇文章发到这个分类下
程序功能:
炸弹部分:
1 在屏幕没有炸弹时要定时随机播撒不同数量的炸弹。
2 炸弹未爆炸前,要阻止人通行。
3 出现炸弹后,在一定时间间隔后爆炸。
4 炸弹爆炸后要显示火焰,并判断是否炸到玩家
5为玩家提供相关的参数变化的信号。
时间部分和道具部分:
1 设置时间响应,近似产生1s的时钟滴答。
2 显示游戏时间
3 道具(鞋和药箱,有使人物速度和生命值增强的效果)的出现,消失,和人物接触检测和销毁。
4 生命值和速度值的同步显示
人物部分:
1 人可以朝上下左右四个方向行走,并在行走时动态显示相应方向的人物图片
2 炸弹炸到人物变灰数秒,表示人物受伤
3 人物不能走出指定区域,炸弹爆炸前人物不能越过炸弹
4 人物有生命值,生命值为0时游戏结束
游戏特效部分:
1 添加图片,以实现在游戏中的动画效果及游戏主题
2 游戏中的炸弹变脸
3 玩家在被炸弹炸到时的动画效果
4 炸弹的威力,设定两个炸弹等级。
游戏截图:

程序只有一个.c文件 ,一群人图快,变量名起得很烂……
- #include<SDL/SDL.h>
- #include<SDL/SDL_image.h>
- #include<math.h>
- #include<time.h>
- //图片路径定义
- #define IMG_PLAYER1 "image/boy2.bmp"
- #define IMG_INJURED "image/boy2_injured.bmp"
- #define IMG_BUBBLE "image/bomb.png"
- #define IMG_BG "image/bg4.bmp"
- #define IMG_FLAME2 "image/flame2.png"
- #define IMG_FLAME4 "image/flame4.png"
- #define IMG_GAMEOVER "image/gameover.gif"
- #define IMG_MEDICINE "pics/medicine.bmp"
- #define IMG_SHOES "pics/shoe.bmp"
- #define IMG_LIFE "./pics/time.gif"
- #define IMG_SPEED "./pics/time.gif"
- #define IMG_WORD "./pics/word.bmp"
- #define IMG_TIME "./pics/time.gif"
- //方向定义
- #define DIR_UP 3
- #define DIR_LEFT 1
- #define DIR_DOWN 0
- #define DIR_RIGHT 2
- #define MAIN_ZONE_W 520
- #define MAIN_ZONE_H 480
- #define ATTACK 2
- #define INTERVAL 30
- #define BUBBLE_NUM 62
- #define RAND_MAX 65536
- #define WaitTime 10
- #define ExistTime 5
- //游戏中的人物
- typedef struct _Player {
- int w;
- int h;
- int x;
- int y;
- int ox;
- int oy;
- int dir;
- int subframe;
- int speed;
- int life;
- int timer;
- SDL_Surface *image;
- }Player;
- typedef struct _Bubble {
- int w;
- int h;
- int x;
- int y;
- int subframe;
- int timer;
- int level;
- SDL_Surface *image;
- }Bubble;
- //各种附加工具的添加 此处用1代表是药炉 可添加一条命
- //此处用0代表是鞋 可使速度加1
- typedef struct _Tool{
- int w;
- int h;
- int x;
- int y;
- int type;//0是鞋 1是药炉
- int already_exist_time;//代表已经出现的时间
- int WaitForNext;//代表下一个物品出现的时间还有多久
- int flag;//代表是否有效
- SDL_Surface *image[2];
- }Tool;
- //游戏状态
- typedef enum _GameState {
- GAME_RUNNING,
- GAME_OVER,
- }GameState;
- //全局变量
- int second[2],minute[2];
- SDL_Surface *screen; //整个屏幕
- SDL_Surface *back_image;
- SDL_Surface *player_image;
- SDL_Surface *injured_image;
- SDL_Surface *medicine_image;
- SDL_Surface *shoes_image;
- SDL_Surface *life_image;
- SDL_Surface *speed_image;
- SDL_Surface *word_image;
- GameState game_state;
- Player player1;
- Bubble bubble[BUBBLE_NUM];
- Tool MedOrShoes;
- int current_num;
- int boom; //当前屏幕上是否有泡泡
- int erase;
- int injured;
- int g_timer=-1;
- int away;
- int interval=5;
- int oldlife=3;
- int oldspeed;
- //加锁
- void Slock(SDL_Surface *lock){
- if(SDL_MUSTLOCK(lock)){
- if(SDL_LockSurface(lock)<0){
- return;
- }
- }
- }
- /*解锁*/
- void Sulock(SDL_Surface *lock){
- if(SDL_MUSTLOCK(lock)){
- SDL_UnlockSurface(lock);
- }
- }
- //初始化SDL
- void Init_SDL() {
- if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) {
- exit(1);
- }
- screen = SDL_SetVideoMode(640,480,16,SDL_SWSURFACE);
- if(screen == NULL) {
- exit(1);
- }
- }
- //Tool函数初始化
- void Init_Tools(){
- MedOrShoes.x=0;
- MedOrShoes.y=0;
- MedOrShoes.w=30;
- MedOrShoes.h=30;
- MedOrShoes.type=0;//最先初始化为鞋
- MedOrShoes.flag=0;//最初无效
- MedOrShoes.already_exist_time=0;//出险多于..s还没被吃掉则擦掉
- MedOrShoes.WaitForNext = WaitTime;//每..s出现一个物品
- medicine_image = IMG_Load(IMG_MEDICINE);
- medicine_image = SDL_DisplayFormat(medicine_image);
- shoes_image = IMG_Load(IMG_SHOES);
- shoes_image = SDL_DisplayFormat(shoes_image);
- MedOrShoes.image[0]=shoes_image;
- MedOrShoes.image[1]=medicine_image;
- SDL_SetColorKey(MedOrShoes.image[0],SDL_SRCCOLORKEY,SDL_MapRGB(MedOrShoes.image[0]->format,255,255,255));
- SDL_SetColorKey(MedOrShoes.image[1],SDL_SRCCOLORKEY,SDL_MapRGB(MedOrShoes.image[1]->format,255,255,255));
- }
- //随机产生工具位置
- void RandToolPos() {
- srand((int)time(NULL));
- int i;
- MedOrShoes.x = ((int)rand() % (MAIN_ZONE_W - 90))/30*30;
- MedOrShoes.y = ((int)rand() % (MAIN_ZONE_H - 30))/30*30;
- }
- //画工具
- void DrawTool(SDL_Surface *surface, Tool *tool) {
- SDL_Rect s_rect,d_rect;
- s_rect.w = d_rect.w = tool->w;
- s_rect.h = d_rect.h = tool->h;
- s_rect.x = 0;
- s_rect.y = 0;
- d_rect.x = tool->x;
- d_rect.y = tool->y;
- SDL_BlitSurface(tool->image[tool->type],&s_rect,surface,&d_rect);
- }
- //清除工具
- void ClearTool(SDL_Surface *surface, Tool *tool) {
- SDL_Rect mask;
- mask.w = tool->w;
- mask.h = tool->h;
- mask.x = tool->x;
- mask.y = tool->y;
- Slock(screen);
- SDL_BlitSurface(back_image,&mask,surface,&mask);
- Sulock(screen);
- }
- //检测是否吃到了工具
- int Eat_detect()
- {
- if(abs(MedOrShoes.x-player1.x)<30&&abs(MedOrShoes.y-player1.y)<30){
- //吃到了
- //printf("eat\n");
- return 1;
- }
- return 0;
- }
- void Init_Player() {
- player1.dir = DIR_RIGHT;
- player1.w = 30;
- player1.h = 30;
- player1.x = 120;
- player1.y = 120;
- player1.ox = player1.x;
- player1.oy = player1.y;
- player1.speed = 3;
- player1.life = 3;
- player1.timer = 0;
- injured = 0;
- player_image = IMG_Load(IMG_PLAYER1);
- injured_image = IMG_Load(IMG_INJURED);
- player_image = SDL_DisplayFormat(player_image);
- injured_image = SDL_DisplayFormat(injured_image);
- //载入人物图片并设置白色为背景色
- player1.image = player_image;
- SDL_SetColorKey(player1.image,SDL_SRCCOLORKEY,SDL_MapRGB(player1.image->format,255,255,255));
- }
- void Init_speed()
- {
- life_image = IMG_Load(IMG_LIFE);
- life_image = SDL_DisplayFormat(life_image);
- //SDL_SetColorKey(life_image,SDL_SRCCOLORKEY,SDL_MapRGB(life_image->format,255,255,255));
- }
- void Drawlife(SDL_Surface *surface) {
- SDL_Rect source,show_dest;
- source.y=240;
- source.x=550;
- source.w=show_dest.w=15;
- source.h=show_dest.h=30;
- show_dest.x=550;
- show_dest.y=240;
- SDL_BlitSurface(back_image,&source,screen,&show_dest);
- source.y=0;
- source.x=10+15*player1.life;
- //SDL_SetColorKey(life_image,SDL_SRCCOLORKEY,SDL_MapRGB(life_image->format,255,255,255));
- SDL_BlitSurface(life_image,&source,screen,&show_dest);
- }
- void Init_life()
- {
- speed_image = IMG_Load(IMG_SPEED);
- speed_image = SDL_DisplayFormat(speed_image);
- //SDL_SetColorKey(life_image,SDL_SRCCOLORKEY,SDL_MapRGB(life_image->format,255,255,255));
- word_image=IMG_Load(IMG_WORD);
- word_image = SDL_DisplayFormat(word_image);
- SDL_SetColorKey(word_image,SDL_SRCCOLORKEY,SDL_MapRGB(word_image->format,255,255,255));
- }
- void Drawspeed(SDL_Surface *surface) {
- SDL_Rect source,show_dest;
- source.y=340;
- source.x=550;
- source.w=show_dest.w=15;
- source.h=show_dest.h=30;
- show_dest.x=550;
- show_dest.y=340;
- SDL_BlitSurface(back_image,&source,screen,&show_dest);
- source.y=0;
- source.x=10+15*player1.speed;
- //SDL_SetColorKey(speed_image,SDL_SRCCOLORKEY,SDL_MapRGB(speed_image->format,255,255,255));
- SDL_BlitSurface(speed_image,&source,screen,&show_dest);
- }
- void Draw_words(SDL_Surface *surface){
- SDL_Rect source,show_dest;
- source.y=200;
- source.x=530;
- source.w=show_dest.w=90;
- source.h=show_dest.h=30;
- show_dest.x=530;
- show_dest.y=200;
- SDL_BlitSurface(back_image,&source,screen,&show_dest);
- source.y=0;
- source.x=0;
- show_dest.x=530;
- show_dest.y=200;
- SDL_BlitSurface(word_image,&source,screen,&show_dest);
- source.y=300;
- source.x=530;
- source.w=show_dest.w=90;
- source.h=show_dest.h=30;
- show_dest.x=530;
- show_dest.y=300;
- SDL_BlitSurface(back_image,&source,screen,&show_dest);
- source.y=30;
- source.x=0;
- show_dest.x=530;
- show_dest.y=300;
- SDL_BlitSurface(word_image,&source,screen,&show_dest);
- source.y=100;
- source.x=530;
- source.w=show_dest.w=90;
- source.h=show_dest.h=30;
- show_dest.x=530;
- show_dest.y=100;
- SDL_BlitSurface(back_image,&source,screen,&show_dest);
- source.y=60;
- source.x=0;
- show_dest.x=530;
- show_dest.y=100;
- SDL_BlitSurface(word_image,&source,screen,&show_dest);
- }
- void Init_Bubble() {
- int i;
- for(i = 0;i < BUBBLE_NUM;i++) {
- bubble[i].w = 30;
- bubble[i].h = 30;
- bubble[i].level = ATTACK;
- if(i%5==0) bubble[i].level = 2*ATTACK;
- bubble[i].timer = 0;
- bubble[i].image = IMG_Load(IMG_BUBBLE);
- SDL_SetColorKey(bubble[i].image,SDL_SRCCOLORKEY,SDL_MapRGB(bubble[i].image->format,255,255,255));
- bubble[i].image = SDL_DisplayFormat(bubble[i].image);
- }
- current_num = 0;
- }
- void DrawFlame(SDL_Surface *surface, Bubble *bubble) {
- //这个函数想画出炸弹爆炸后四周的火焰,目前还不对
- int i;
- int level = bubble->level;
- SDL_Rect s_rect,d_rect;
- SDL_Surface *flame_image;
- if(bubble->level == ATTACK)
- flame_image = IMG_Load(IMG_FLAME2);
- else if(bubble->level == 2*ATTACK)
- flame_image = IMG_Load(IMG_FLAME4);
- SDL_SetColorKey(flame_image,SDL_SRCCOLORKEY,SDL_MapRGB(flame_image->format,255,255,255));
- flame_image = SDL_DisplayFormat(flame_image);
- s_rect.w = d_rect.w = bubble->w+bubble->w*2*level;
- s_rect.h = d_rect.h = bubble->h+bubble->h*2*level;
- s_rect.x = 0;
- s_rect.y = 0;
- d_rect.x = bubble->x-bubble->w*level;
- d_rect.y = bubble->y-bubble->h*level;
- SDL_BlitSurface(flame_image,&s_rect,surface,&d_rect);
- }
- void DrawFlames(SDL_Surface *surface) {
- int i;
- for(i = 0;i < current_num;i++) {
- DrawFlame(surface,&bubble[i]);
- }
- }
- //画出人物
- void DrawPlayer(SDL_Surface *surface, Player *player) {
- SDL_Rect s_rect,d_rect;
- player->subframe = player->timer/4;
- s_rect.w = d_rect.w = player->w;
- s_rect.h = d_rect.h = player->h;
- s_rect.x = player->subframe * player->w;
- s_rect.y = player->dir * player->h;
- d_rect.x = player->x;
- d_rect.y = player->y;
- player->image = injured ? injured_image : player_image;
- SDL_SetColorKey(player->image,SDL_SRCCOLORKEY,SDL_MapRGB(player->image->format,255,255,255));
- SDL_BlitSurface(player->image,&s_rect,surface,&d_rect);
- }
- void DrawBubble(SDL_Surface *surface, Bubble *bubble) {
- SDL_Rect s_rect,d_rect;
- bubble->subframe = bubble->timer;
- s_rect.w = d_rect.w = bubble->w;
- s_rect.h = d_rect.h = bubble->h;
- s_rect.x = bubble->subframe * bubble->w;
- s_rect.y = 0;
- d_rect.x = bubble->x;
- d_rect.y = bubble->y;
- SDL_BlitSurface(bubble->image,&s_rect,surface,&d_rect);
- }
- void DrawBubbles(SDL_Surface *surface) {
- int i;
- for(i = 0;i < current_num;i++) {
- DrawBubble(surface,&bubble[i]);
- }
- }
- //清除人物
- void ClearPlayer(SDL_Surface *surface, Player *player) {
- SDL_Rect mask;
- mask.w = player->w;
- mask.h = player->h;
- mask.x = player->ox;
- mask.y = player->oy;
- //SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,255,255,255));
- Slock(screen);SDL_BlitSurface(back_image,&mask,surface,&mask);Sulock(screen);
- }
- void ClearBubble(SDL_Surface *surface, Bubble *bubble) {
- SDL_Rect mask;
- mask.w = bubble->w;
- mask.h = bubble->h;
- mask.x = bubble->x;
- mask.y = bubble->y;
- SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,255,255,255));
- }
- void ClearBubbles(SDL_Surface *surface) {
- int i;
- for(i = 0;i < current_num;i++) {
- ClearBubble(surface,&bubble[i]);
- }
- }
- void ClearFlame(SDL_Surface *surface, Bubble *bubble) {
- int level=bubble->level;
- int i;
- SDL_Rect mask;
- /*
- mask.w = bubble->w + bubble->w * level * 2;
- mask.h = bubble->h;
- mask.x = bubble->x - bubble->w * level;
- mask.y = bubble->y;
- SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,255,255,255));
- mask.w = bubble->w;
- mask.h = bubble->h + bubble->h * level*2;
- mask.x = bubble->x;
- mask.y = bubble->y - bubble->h * level;
- */
- SDL_Rect s_rect,d_rect;
- mask.w = bubble->w+bubble->w*2*level;
- mask.h = bubble->h+bubble->h*2*level;
- mask.x = bubble->x-bubble->w*level;
- mask.y = bubble->y-bubble->h*level;
- //SDL_FillRect(surface,&d_rect,SDL_MapRGB(surface->format,255,255,255));
- Slock(screen);SDL_BlitSurface(back_image,&mask,surface,&mask);Sulock(screen);
- }
- void ClearFlames(SDL_Surface *surface) {
- int i;
- for(i = 0;i < current_num;i++) {
- ClearFlame(surface,&bubble[i]);
- }
- }
- void RandBubblePos() {
- srand((int)time(NULL));
- int i;
- for(i = 0;i < current_num;i++) {
- bubble[i].x = ((int)rand() % (MAIN_ZONE_W-15))/30*30;
- bubble[i].y = ((int)rand() % (MAIN_ZONE_H ))/30*30;
- }
- }
- void MoveBack(int dir)
- {
- Slock(screen);
- switch(dir)
- {
- case DIR_LEFT:
- if(player1.x+30<=MAIN_ZONE_W)player1.x+=30;
- else player1.x=MAIN_ZONE_W;
- break;
- case DIR_RIGHT:
- if(player1.x-30>=0)player1.x-=30;
- else player1.x=0;
- break;
- case DIR_UP:
- if(player1.y+30<=MAIN_ZONE_H)player1.y+=30;
- else player1.y=MAIN_ZONE_H;
- break;
- case DIR_DOWN:
- if(player1.y-30>=0)player1.y-=30;
- else player1.y=0;
- break;
- }
- Sulock(screen);
- }
- void Explode()
- {
- if(away==1)return;
- if(g_timer==interval){
- void GameOver();
- g_timer=0;
- static int t=0;
- if(boom == 0 && erase==0) {//no bubbles and flames are cleared
- t=0;injured = 0;
- boom = 1 - boom; //switch on and show the bubbles
- current_num += 3;
- if(current_num > 60) current_num = 60;
- interval-=1;
- if(interval<2){interval=2;}
- RandBubblePos();
- Slock(screen);
- DrawBubbles(screen);
- Sulock(screen);
- }
- else if(boom==1&&erase == 0) {
- //bubbles now explode and no flames need to clear
- boom = 1 - boom;
- Slock(screen);
- ClearBubbles(screen);
- if(HitDetect(&player1)==1) {
- if(boom==0)MoveBack(player1.dir);
- injured = 1;
- player1.life--;
- printf("%d\n",player1.dir);
- }
- DrawFlames(screen);
- erase = 1;//switch on to clear flames signal
- Sulock(screen);
- }
- }
- if(erase==1){
- if(g_timer==1){
- ClearFlames(screen);
- //ClearFlamesPos();
- erase = 0;
- }
- }
- }
- int HitDetect(Player *player)
- {
- int x = player->x;
- int y = player->y;
- int ex,ey,level;
- int i,r;
- for(i = 0;i < current_num;i++) {
- ex = bubble[i].x;
- ey = bubble[i].y;
- level = bubble[i].level * INTERVAL;
- if(y - ey < 30 && ey - y < 30) {
- if(x - ex < 30 + level && ex - x < level)
- return 1;
- }
- if(x - ex < 30 && ex - x < 30) {
- if(y - ey < 30 + level && ey - y < level)
- return 1;
- }
- }
- return 0;
- }
- //碰撞检测,返回1表示移动受阻碍
- int BumpDetect(int dir) {
- Slock(screen);
- int i;
- if(boom == 0) return 0;
- int nx,ny;
- switch(dir) {
- case DIR_LEFT:
- for(i = 0;i < current_num;i++) {
- if(player1.x-bubble[i].x<=33&&player1.x-bubble[i].x>=1)
- if(bubble[i].y-player1.y<29&&bubble[i].y-player1.y>-29)
- {//player1.x++;
- if(bubble[i].y-player1.y>20)player1.y--;
- else if(bubble[i].y-player1.y<-20)player1.y++;
- return 1;}
- }
- break;
- case DIR_RIGHT:
- for(i = 0;i < current_num;i++) {
- if(bubble[i].x-player1.x<=33&&bubble[i].x-player1.x>=1)
- if(bubble[i].y-player1.y<29&&bubble[i].y-player1.y>-29)
- {//player1.x--;
- if(bubble[i].y-player1.y>20)player1.y--;
- else if(bubble[i].y-player1.y<-20)player1.y++;
- return 1;}
- }
- break;
- case DIR_UP:
- for(i = 0;i < current_num;i++) {
- if(player1.y-bubble[i].y<=33&&player1.y-bubble[i].y>=1)
- if(bubble[i].x-player1.x>-29&&bubble[i].x-player1.x<29)
- {player1.y+=player1.speed;
- if(bubble[i].x-player1.x>20)player1.x--;
- else if(bubble[i].x-player1.x<-20)player1.x++;
- return 1;}
- }
- break;
- case DIR_DOWN:
- for(i = 0;i < current_num;i++) {
- if(bubble[i].y-player1.y<=33&&bubble[i].y-player1.y>=1)
- if(bubble[i].x-player1.x>-29&&bubble[i].x-player1.x<29)
- {player1.y-=player1.speed;
- if(bubble[i].x-player1.x>20)player1.x--;
- else if(bubble[i].x-player1.x<-20)player1.x++;
- return 1;}
- }
- break;
- }
- Sulock(screen);
- return 0;
- }
- //人是否走出了屏幕,若走出返回1
- int RangeDetect(Player *player) {
- int x = player->x;
- int y = player->y;
- if(x > MAIN_ZONE_W - player->w - 1) {
- player->x = MAIN_ZONE_W - player->w - 1;
- return 1;
- }
- if(x < 0) {
- player->x = 0;
- return 1;
- }
- if(y > MAIN_ZONE_H - player->h) {
- player->y = MAIN_ZONE_H - player->h;
- return 1;
- }
- if(y < 0) {
- player->y = 0;
- return 1;
- }
- return 0;
- }
- Uint32 time_show(){
- SDL_Surface *time_image;
- time_image=IMG_Load(IMG_TIME);
- SDL_Rect time_dest,show_dest;
- /*显示初始化*/
- int x=550,y=125;
- show_dest.x=x; show_dest.y=y;
- show_dest.h=30;
- time_dest.y=0;
- time_dest.h=30;
- //:显示
- time_dest.x=0; show_dest.x=x+30;
- time_dest.w=show_dest.w=10;
- //Slock(screen);
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- //秒显示
- //SDL_Flip(screen);
- //Sulock(screen);
- show_dest.w=time_dest.w=15;
- int i;
- for(i=0;i<2;i++)
- second[i]=minute[i]=0;
- //Slock(screen);
- time_dest.x=10+15*second[0];show_dest.x=x+55;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- time_dest.x=10+15*second[1]; show_dest.x=x+40;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- time_dest.x=10+15*minute[0];show_dest.x=x+15;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- time_dest.x=10+15*minute[1];show_dest.x=x;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- //SDL_Flip(screen);
- //Sulock(screen);
- while(game_state == GAME_RUNNING){
- //首先做工具部分处理
- MedOrShoes.WaitForNext--;
- MedOrShoes.already_exist_time++;
- if(MedOrShoes.already_exist_time==ExistTime&&MedOrShoes.flag==1){
- MedOrShoes.flag=0;
- ClearTool(screen,&MedOrShoes);
- }
- if(MedOrShoes.WaitForNext==0){
- MedOrShoes.type=1-MedOrShoes.type;
- MedOrShoes.already_exist_time=0;
- MedOrShoes.WaitForNext=WaitTime;
- MedOrShoes.flag=1;
- RandToolPos();
- DrawTool(screen,&MedOrShoes);
- }
- //考虑一下生命值 避免刷屏遮盖生命
- Drawlife(screen);
- //考虑一下速度值 避免刷屏遮盖速度
- Drawspeed(screen);
- Draw_words(screen);
- g_timer++;/*全局数据*/
- //作时间部分处理
- SDL_Delay(950);
- bubble[0].timer=1-bubble[0].timer;
- for(i=1;i<current_num;i++)bubble[i].timer=1-bubble[i-1].timer;
- if(boom==1)DrawBubbles(screen);
- time_dest.x=0; show_dest.x=x+30;
- time_dest.w=show_dest.w=10;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- time_dest.w=15;
- show_dest.w=30;show_dest.x=x;
- SDL_BlitSurface(back_image,&show_dest,screen,&show_dest);
- show_dest.w=30;show_dest.x=x+40;
- SDL_BlitSurface(back_image,&show_dest,screen,&show_dest);
- show_dest.w=15;
- //Slock(screen);
- time_dest.x=10+15*second[0];show_dest.x=x+55;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- time_dest.x=10+15*second[1]; show_dest.x=x+40;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- time_dest.x=10+15*minute[0];show_dest.x=x+15;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- time_dest.x=10+15*minute[1];show_dest.x=x;
- SDL_BlitSurface(time_image,&time_dest,screen,&show_dest);
- //SDL_Flip(screen);
- //Sulock(screen);
- second[0]++;
- if(second[0]==10){
- second[1]++;
- second[0]=0;}
- if(second[1]==6){
- second[1]=0;
- minute[0]++;}
- if(minute[0]==10){
- minute[1]++;
- minute[0]=0;}
- if(minute[1]==6){
- minute[0]=minute[1]=second[1]=second[0]=0;
- }
- Explode();
- }
- return 0;
- }
- void GamePlay() {
- void GameOver();
- second[0] = second[1] = minute[0] = minute[1] = 0;
- back_image = IMG_Load(IMG_BG);
- SDL_BlitSurface(back_image,0,screen,0);
- Init_Player();
- Init_Bubble();
- Init_Tools();
- Init_life();
- Init_speed();
- SDL_UpdateRect(screen,0,0,0,0);
- SDL_SetTimer(10,time_show);
- Uint32 start_time,end_time;
- int i;
- start_time = SDL_GetTicks();
- boom = 0;
- erase=0;
- away=0;
- game_state = GAME_RUNNING;
- RandToolPos();
- DrawTool(screen,&MedOrShoes);
- Drawlife(screen);
- MedOrShoes.flag=1;
- while(game_state == GAME_RUNNING) {
- SDL_Event event1;
- ClearPlayer(screen,&player1);
- SDL_PollEvent(&event1);
- switch(event1.type) {
- case SDL_KEYDOWN:
- if(RangeDetect(&player1)) break;
- switch(event1.key.keysym.sym) {
- case SDLK_UP:
- if(BumpDetect(DIR_UP)) break;
- player1.dir = DIR_UP;
- player1.y -= player1.speed;
- break;
- case SDLK_DOWN:
- if(BumpDetect(DIR_DOWN)) break;
- player1.dir = DIR_DOWN;
- player1.y += player1.speed;
- break;
- case SDLK_LEFT:
- if(BumpDetect(DIR_LEFT)) break;
- player1.dir = DIR_LEFT;
- player1.x -= player1.speed;
- break;
- case SDLK_RIGHT:
- if(BumpDetect(DIR_RIGHT)) break;
- player1.dir = DIR_RIGHT;
- player1.x += player1.speed;
- break;
- case SDLK_ESCAPE:
- game_state = GAME_OVER;
- away=1;
- GameOver();
- break;
- }
- }
- DrawPlayer(screen, &player1);
- player1.ox = player1.x;
- player1.oy = player1.y;
- SDL_UpdateRect(screen,0,0,0,0);
- if(MedOrShoes.flag==1)
- if(Eat_detect()){
- MedOrShoes.flag=0;
- ClearTool(screen,&MedOrShoes);
- if(MedOrShoes.type==1)
- {
- if(player1.life<9)
- player1.life++;}
- else {
- if(player1.speed<9)
- player1.speed++;}
- //printf("life %d\n",player1.life);
- //printf("speed %d\n",player1.speed);
- }
- else{
- DrawTool(screen,&MedOrShoes);
- }
- //考虑一下生命值
- if(player1.life!=oldlife){
- oldlife=player1.life;
- Drawlife(screen);
- }
- //考虑一下速度值
- if(player1.speed!=oldspeed){
- oldspeed=player1.speed;
- Drawspeed(screen);
- }
- if(player1.life == 0) {
- SDL_Delay(2000);
- game_state = GAME_OVER;
- GameOver();
- }
- if(++player1.timer >= 8)
- player1.timer = 0;
- }
- }
- void GameOver() {
- SDL_Surface *gameover_image = IMG_Load(IMG_GAMEOVER);
- SDL_BlitSurface(gameover_image,0,screen,0);
- SDL_Flip(screen);
- while(1) {
- SDL_Event event;
- while(SDL_PollEvent(&event)) {
- if(event.type == SDL_KEYDOWN)
- if((event.key.keysym.sym == SDLK_ESCAPE)) {
- SDL_FreeSurface(gameover_image);
- SDL_FreeSurface(player1.image);
- SDL_FreeSurface(back_image);
- int i;
- for(i = 0;i < BUBBLE_NUM;i++)
- SDL_FreeSurface(bubble[i].image);
- SDL_Quit();
- exit(1);
- }
- if(event.type == SDL_KEYDOWN)
- if((event.key.keysym.sym == SDLK_RETURN)) {
- SDL_FreeSurface(gameover_image);
- GamePlay();
- }
- }
- }
- }
- int main() {
- Init_SDL();
- GamePlay();
- }


雅虎新CEO卡萝尔·巴茨正式上任
Large
Middle
Small
Attachment:
views(1438)
view comments(2)
add comment

Comments:
支持。。