使用GameMakerStudio2 制作《功夫》小游戲?qū)W習總結(jié)

注
[注] ? 教程地址: GameMakerStudio2?YOYOGAME制作的游戲引擎,接下來的文檔中簡稱GMS2
導入資源
由于紅激教程教的是gamemaker8,導入資源包為.gmres文件,這個舊版本的資源包無法直接導入到GMS2,需要經(jīng)過一些列版本轉(zhuǎn)換才可以轉(zhuǎn)換成可導入GMS2的資源包
將*.gmres文件導入到gamemaker8中,我用的是gm8.1,將*.gmres文件拖入gm8中,選擇導出項目*.gm81,接著將*.gm81文件拖入到gamemakerstudio1.4,再選擇導出項目*.gmz文件,不要以為到這就結(jié)束了,然后要把*.gmz文件導入到GMS2,其實這時候是新建了一個包含資源的新項目,如果只是想要資源包,那還需要再GMS2中導出資源包,最終導出的*.yymps文件就是可以直接導入到GMS2中的資源包啦。 *gamemaker8.1資源: https://wwr.lanzoui.com/b02i7m49i密碼:2bgy
gamemakerstudio1.4資源 ? ?
https://www.zy990.com/ziyuan/soft/56.html
游戲制作流程
創(chuàng)建玩家,設(shè)置基本屬性,血量,y值
創(chuàng)建對象(object)obj_player,精靈為spr_player_walk
添加創(chuàng)建事件(create),添加以下代碼
?face=1;//方向1右 -1左
?jump=0;//跳躍0 1
?jumpface=0;//跳躍方向-1 0 1
?state=0;//狀態(tài)0移動 1出招 2收招
?timer=0;//狀態(tài)計時器
?hp=9;//血
?//***固有
?image_speed=0;//動畫速度=0
?y=191;//地平線
?創(chuàng)建房間,設(shè)置寬高,背景,放入玩家
創(chuàng)建room,寬256,高240,幀率60,加入背景貼圖和玩家,修改縮放比為400%,在gm8中需要修改全局變量,但在GMS2中會發(fā)現(xiàn)找不到全局變量窗口了,那么在GMS2中如何調(diào)整縮放比呢?
打開房間設(shè)置propertices-Room1,打開視口和相機(viewports and Cameras)下拉單,將啟用視口(Enable Viewports)打勾,選擇一個視口(viewport),比如viewport1,將可見(visible)打勾,下面相機屬性(Camera Properties)的寬高就是room的寬高,視口屬性(Viewport Properties)的寬高就是最終游戲窗口的寬高,如果要調(diào)整縮放比為400%,那么就將寬和高分別設(shè)置為1024和960即可。
?玩家的左右移動,坐標限制
在obj_player中創(chuàng)建步事件(step),添加以下代碼
?var dx,dy;//臨時變量
?dy=0;//上下按鍵狀態(tài)-1上 0 1下
?dx=0;//左右按鍵狀態(tài)-1左 0 1右
?psb=1;//玩家移動速度
?//***按鍵功能
?if(jump==0&&state==0)//可相應(yīng)按鍵
?{
? if(keyboard_check(ord("A")))//左 ?注意這里是是雙引號,gm8中是單引號
? {
? ?dx=-1;
? ?image_index+=0.1;
? }
? if(keyboard_check(ord("D")))//右
? {
? ?dx=1;
? ?image_index+=0.1;
? }
?}
?
?//***坐標變化
?x+=dx*psb;
?x+=jumpface*psb*2;
?
?//***坐標限制
?if(x<24)
?{
? x=24;
? jumpface=-jumpface;
?}
?if(x>room_width-24)
?{
? x=room_width-24;
? jumpface=-jumpface;
?}
玩家上下按鍵檢測
將以下代碼添加到上面按鍵功能區(qū)塊中
?if(keyboard_check(ord("W")))//上
? {
? ?dy=-1;
? ?jump=1;
? ?if(dx!=0)jumpface=dx;
? ?direction=90;
? ?speed=5;
? ?gravity=0.25;
? ?sprite_index=spr_player_jump;
? }
? else//注意,不要漏掉
? if(keyboard_check(ord("S")))
? {
? ?dy=1;
? ?sprite_index=spr_player_jump;
? }
?
玩家狀態(tài)新定義,出招設(shè)計
將以下出招設(shè)計代碼添加到上述按鍵區(qū)塊中,其中scr_state_set()為接下來會編寫的腳本
?if(keyboard_check(ord("J")))&&jump==0//出腿
? {
? ?if(dx!=0)//左右腿
? ? scr_state_set(3,1,16);
? ?else
? ?if(dy==1)//蹲腿
? ? scr_state_set(2,1,16);
? ?else//原地腿
? ? scr_state_set(2,1,16);
? }
? if(keyboard_check(ord("K"))&&state==0)//出拳
? {
? ?if(dy==1)//蹲拳
? ? scr_state_set(1,1,16);
? ?else
? ?if(dy!=-1)//原地拳
? ? scr_state_set(0,1,16);
? }
飛踢出招放在按鍵區(qū)塊下面,不放在里面
?//***飛踢
?if(jump==1&&keyboard_check(ord("J"))&&state==0)
?{
? scr_state_set(5,1,16);
?}
重復使用的腳本
創(chuàng)建腳本(Scripts),將以下代碼添加到腳本中
?function scr_state_set(){
? sprite_index=spr_player_atk;
? image_index=argument0;
? state=argument1;
? timer=argument2;//出招定格幀數(shù)
? var dx,dy;
? dx=x+26*image_xscale;
? dy=y-16;
? audio_play_sound(snd_atk1)//注意gm8里是sound_play
? if(collision_point(dx,dy,Obj_enemy,0,0))
? {
? ?if(Obj_enemy.hp>0)
? ?{
? ? audio_play_sound(snd_hit1)
? ? timer+=16;
? ? instance_create_depth(dx,dy,0,Obj_fx);//obj_fx為攻擊效果對象,具體創(chuàng)建可看下面攻擊效果的實現(xiàn)
? ? Obj_enemy.hp-=1;
? ? Obj_enemy.hited=16;
? ?}
? }
?}
腳本中涉及到了一個未創(chuàng)建的對象(obj_enemy),因此可以先創(chuàng)建一個obj_enemy對象,精靈為spr_enemy_walk
動作控制邏輯
以下為出招、收招、下落狀態(tài)下需要執(zhí)行的代碼,放在按鍵區(qū)塊下面即可
?//***出招
?if(state==1)
?{
? timer-=1;//計時器自減
? if(timer<=0)//出招結(jié)束,變換狀態(tài)
? {
? ?state=2;//收招
? ?timer=8;//收招計時器
? ?if(image_index==1||image_index==4||image_index==5)//下蹲類出招的收招動作
? ?{
? ? if(image_index==5)
? ? {timer=100;}//飛腿再空中只能一次
? ? sprite_index=spr_player_jump;//變換動作
? ?}
? ?else//其他動作類收招動作
? ?{
? ? sprite_index=spr_player_walk;
? ?}
? ?image_index=0;//子圖像序號歸零,寫這句話其實沒什么用,因為給sprite_index賦值后會自動執(zhí)行這行代碼
? }
?}
?//***收招
? if(state==2)
? {
? ?timer-=1;//計時器
? ?if(timer<=0)
? ?{
? ? state=0;//變?yōu)榭梢苿訝顟B(tài)
? ? sprite_index=spr_player_walk;//變?yōu)檎玖赢?br>? ? if(jump==1)sprite_index=spr_player_jump;//變?yōu)樘S動畫
? ? image_index=0;
? ? timer=0;
? ?}
? }
?//***下落
?if(direction==270&&jump==1)
?{
? if(y+speed>191)
? {
? ?y=191;
? ?speed=0;
? ?gravity=0;
? ?jump=0;
? ?state=0;
? ?timer=0;
? ?jumpface=0;
? ?sprite_index=spr_player_walk;
? }
?}
繪制像素效果失真修復
為obj_player添加繪制事件(draw):
?//***繪制自己
?draw_sprite_ext(sprite_index,image_index,floor(x),floor(y),image_xscale,image_yscale,0,c_white,1);
?//***繪制血槽
?draw_sprite_ext(spr_blood,hp<6,112,210,-hp,1,0,c_white,1);
為obj_enemy添加繪制事件(draw):
?//***繪制自己
?draw_sprite_ext(sprite_index,image_index,floor(x),floor(y),image_xscale,image_yscale,0,c_white,1);
?//***繪制血槽
?draw_sprite_ext(spr_blood,hp<6,112,210,hp,1,0,c_white,1);
人物轉(zhuǎn)向判斷
在obj_player步事件中添加:
?//***方向變化
?if(jump==0)
?{
? if(x<=obj_enemy.x)face=1;//朝右
? else face=-1;//朝左
?}
?image_xscale=face;
敵人創(chuàng)建
為obj_enemy添加創(chuàng)建事件:
?face=-1;//方向1右 -1左
?jump=0;//跳躍0 1
?jumpface=0;//跳躍方向-1 0 1
?state=0;//狀態(tài)0移動 1出招 2收招
?timer=0;//狀態(tài)計時器
?hp=9;//血
?hited=0;//是否被擊中
?//***固有
?image_speed=0;//動畫速度=0
?y=191;//地平線
繪制血槽
查看上方繪制像素效果失真修復
打擊效果實現(xiàn)
創(chuàng)建對象obj-fx,添加創(chuàng)建事件,書寫以下代碼:
?image_speed=0;
?alarm[0]=24;//計時器啟動
創(chuàng)建計時器0(Alarm0),添加以下代碼:
?instance_destroy(Obj_fx);//24幀后銷毀
敵人死亡判斷
在obj_enemy中添加創(chuàng)建事件,添加死亡判斷代碼:
?if(hp<=0)
?{
? if(timer==0)//死亡第一幀
? {
? ?audio_stop_all();
? ?audio_play_sound(snd_fall1,0,false);
? ?sprite_index=spr_enemy_dead;
? }
? timer+=1;//計時器自加
? if(timer>180)game_restart();//重啟游戲
? exit;
?}
簡單的敵人邏輯
在創(chuàng)建事件中死亡判斷下面添加移動邏輯:
?//***簡單的移動邏輯
?if(hited==0)//未被打擊
?{
? if(x>=Obj_player.x+12)//在右邊
? {
? ?x-=0.25//左移
? ?image_index+=0.1;
? }
? else
? if(x<=Obj_player.x-12)//在左邊
? {
? ?x+=0.25;//右移
? ?image_index+=0.1;
? }
?}
?else hited-=1;//靜止,等待打擊效果結(jié)束
?if(x<=Obj_player.x&&jump==0)face=1;
?else face=-1;
?image_xscale=face;
背景音樂加入
創(chuàng)建對象obj_ctrl,添加創(chuàng)建事件:
?audio_stop_all();
?audio_play_sound(snd_music,1,true);
結(jié)束
至此,紅激教程視頻內(nèi)容結(jié)束,但我看到素材包里有敵人的攻擊精靈,我想實現(xiàn)下,我沒有設(shè)計出招、收招動作,只是簡單的設(shè)計了下自動攻擊。
敵人攻擊分支
在obj_enemy的創(chuàng)建事件中添加攻擊邏輯:
?//膝擊
? if((x-Obj_player.x)<20&&(x-Obj_player.x>-20))
? scr_state_set2(spr_enemy_atk0,0,1,32,x+12*image_xscale,y-13);
? else
? if((x-Obj_player.x)<27&&(x-Obj_player.x>-27))
? {
? ?scr_state_set2(spr_enemy_atk1,1,1,32,x+26*image_xscale,y-29);
? }
?
?}
在創(chuàng)建計時器alarm[0]
?state=0;
?sprite_index=spr_enemy_walk;
?hited+=32;
新建一個敵人攻擊腳本:
?function scr_state_set2(argument0,argument1,argument2,argument3,argument4,argument5){
? sprite_index=argument0;
? image_index=argument1;
? state=argument2;
? alarm[0]=argument3;//出招定格幀數(shù)
? var dx,dy;
? dx=argument4;//x+26*image_xscale;
? dy=argument5;//y-16;
? audio_play_sound(snd_atk1,0,false)//(索引,優(yōu)先級,循環(huán))
? if(collision_point(dx,dy,Obj_player,0,0))
? {
? ?if(Obj_player.hp>0)
? ?{
? ? audio_play_sound(snd_hit1,0,false)
? ?
? ? instance_create_depth(dx,dy,-1,Obj_fx);
? ? Obj_player.hp-=1;
? ?
? ?}
? }
?
?}

還以為B站專欄可以識別md文檔的代碼塊,竟然不可以。
豈可修