《隔离》里的死亡机制,和之前的《樱桃》不一样,主角玛丽亚并不会一碰到敌人就死掉,她是一个坚强的女孩,可以承受几次攻击。每次被敌人碰到后,就掉一颗血,直到用尽血,她才死亡,然后会在最后一个检查点出生。
下面是状态机的样子
三个状态,分别是暂停,游戏中,游戏结束。进入暂停,可以打开地图、背包和菜单。
开始写代码,创建一个对象obj_controller,添加create事件,填写下面的代码
//游戏状态 enum states{ playing, paused, gameover }; global.game_state=states.playing; //menu options=["RESUME","RESTART","QUIT"]; opt_number=array_length_1d(options); menu_index=0; cur_moved=false; menu_open=false; //resolution var width=1280; var height=720; display_set_gui_size(width,height);
上面的代码先定义了一个三个状态的类型,初始化的状态为游戏中,设置了菜单项的内容,定义了菜单的移动状态和控制。最后是游戏分辨率大小的设置。
我们继续添加step事件,填写下面的代码
//键盘控制代码 //手柄控制代码 var vaxis=gamepad_axis_value(0,gp_axislv);//左摇杆上下移动的值 var esc_pressed=keyboard_check_pressed(vk_escape) or gamepad_button_check_pressed(0,gp_start); var enter_pressed=keyboard_check_pressed(vk_enter) or gamepad_button_check_pressed(0,gp_face1);//A按钮 var move=(keyboard_check_pressed(vk_down) or gamepad_button_check_pressed(0,gp_padd) or (vaxis >0))-(keyboard_check_pressed(vk_up) or gamepad_button_check_pressed(0,gp_padu) or (vaxis <0));// var f_pressed=keyboard_check_pressed(ord("F")) or keyboard_check_pressed(ord(vk_f12)); //cursor move if move!=0 { if cur_moved { move=0; } cur_moved=true; } else { cur_moved=false; } //全屏画面 if(f_pressed) { window_set_fullscreen(not window_get_fullscreen()); } //菜单项 if esc_pressed { audio_play_sound(snd_menu,1,false); if(global.game_state==states.playing) { global.game_state=states.paused; menu_open=true; } else if(global.game_state==states.paused) { global.game_state=states.playing; menu_open=false; } } if(menu_open) { menu_index+=move; if(move!=0) { audio_play_sound(snd_menu,1,false); } if(menu_index<0)//一直往上移动, { menu_index=opt_number-1; } else if(menu_index>opt_number-1)//一直往下移动 { menu_index=0; } if(enter_pressed) { switch(menu_index) { case 0: global.game_state=states.playing; instance_activate_all(); menu_open=false; break; case 1: game_restart(); break; case 2: game_end(); break; } } } //game over if(global.game_state==states.gameover) { instance_deactivate_all(1); if(enter_pressed) { game_restart(); } }
上面的代码,我们在之前的项目里已经写了不知道几遍了,就不详细介绍了。主要的目的是用菜单的形式,来实现游戏的状态切换,也就是状态机的逻辑实现的代码。
最后,光有逻辑控制不行,我们需要用户端的界面绘制,让用户能切换游戏状态。增加Draw GUI事件,填写下面的代码
//screen settings var cam_w=display_get_gui_width(); var cam_h=display_get_gui_height(); //draw life if instance_exists(obj_player) { for(var i=0;i<obj_player.hp;i++) { draw_sprite_ext(spr_heart,-1,50+(40*i),50,2,2,0,c_white,1); } } //draw menu if(menu_open) { draw_set_alpha(0.5); draw_set_color(c_black); draw_rectangle(0,0,cam_w,cam_h,0); draw_set_alpha(1); draw_set_color(c_white); draw_set_font(fnt_text); draw_text(cam_w/2,cam_h/2,"PAUSE"); for(var i=0;i<opt_number;i++) { if(menu_index==i) { draw_set_color(c_red); } else { draw_set_color(c_white); } draw_text(cam_w-200,cam_h-200+30*i,options[i]); } } //draw game over screen if(global.game_state==states.gameover) { draw_set_color(c_black); draw_rectangle(0,0,cam_w,cam_h,0); draw_set_color(c_white); draw_set_font(fnt_text); draw_text(cam_w/2,cam_h/2,"GAME OVER"); }
上面的代码,会在你按下暂停键后,画出系统菜单界面,另外的地图和背包会在后面的内容里讲解。
现在我们可以测试了,不过,还要增加一行代码到obj_player的step事件里,
if global.game_state == states.paused exit;
这是为了,在暂停时,主角不要乱动。
按F5,运行效果如下
如果有报错,请设置obj_controller的属性为persistent,并放置到游戏房间里。
暂无关于此日志的评论。