使用GameMaker中用于碰撞检测的脚本小记
在GameMaker的中文论坛精华例子里面下了一个关于跳跃的gmk,说是关于跳跃,但是里面实现了所有动作游戏角色的移动/跳跃(还有二段跳)/爬墙的逻辑。界面如下:
其中游戏核心是角色object的step_event中的200多行脚本。
原代码如下:
switch (state){
case 0:{//地面
if(keyboard_check_pressed(vk_left)){//向左移动
sprite_index=sp_l;
}
else if(keyboard_check_pressed(vk_right)){//向右移动
sprite_index=sp_r;
}
else if(keyboard_check_released(vk_left) || keyboard_check_released(vk_right)){//停止移动
sprite_index=sp0;
}
if(keyboard_check_pressed(ord('Z'))){//按下跳
state=1;
sprite_index=sp_u;
gravity_direction=270;
gravity=1;
vspeed=-16;
}
else if(instance_position(x-15,y+1,ob_land)<0 && instance_position(x+15,y+1,ob_land)<0){//落下
state=2;
gravity_direction=270;
gravity=1;
sprite_index=sp_d;
}
break;
}
case 1:{//跳起
test=collision_rectangle(x-15,y-37+vspeed,x+15,y-20,ob_bottom,false,false);//撞到顶
if(test!=noone ){
y=test.y+27;
vspeed=0;
state=2;
sprite_index=sp_d;
}
else if(keyboard_check_released(ord('Z')) || vspeed>=0 ){//松开或速度为0
vspeed=0;
state=2;
sprite_index=sp_d;
}
break;
}
case 2:{//落下
test=collision_rectangle(x-15,y,x+15,y+vspeed,ob_land,false,false);
if(keyboard_check_pressed(ord('Z'))){//按下跳
state=3;
sprite_index=sp_u;
vspeed=-12;
}
else if(test!=noone){//撞到地面
image_speed=7;
y=test.y-1;
vspeed=0;
gravity=0;
state=0;
sprite_index=sp0;
}
break;
}
case 3:{//二段跳起
test=collision_rectangle(x-15,y-37+vspeed,x+15,y-20,ob_bottom,false,false);
if(test!=noone ){//撞到顶
y=test.y+27;
vspeed=0;
state=4;
sprite_index=sp_d;
}
else if(keyboard_check_released(ord('Z')) || vspeed>=0 ){//松开或速度为0
vspeed=0;