- 资源处理:导入与分类
1.导入墙体文件作为精灵sprite
2.使用strip14后缀来导入连续图片自动分割精灵
3.导入角色文件作为精灵
使用独立的碰撞笼罩
4.创建分组Group
wall:
Mario:
5.导入声音sound
6.使用import resource的方式来导入背景backgrond
创建游戏对象与事件
obj_mario
特有属性
face(方向两种)
jump(跳跃状态两种)
state(人物状态)两种
timer(计时器)
固有属性
image_speed = 0;手动控制代码
创建wall对象组
obj_wall_father
obj_wall0
obj_wall1
obj_wall2
obj_wall3
obj_wall4
为0~4wall对象设置父对象,为了书写代码的灵活性。
创建房间并设置背景颜色
大小:512*240
速度:60
背景图片:自定义(80.128.255)
刷墙体对象(shift左右键)
创建mario对象
取消网格吸附,按住alt加鼠标按键,即可任意移动对象
设置屏幕视野
激活视野
使用视角0
视野范围(256.240)一个屏幕的视野范围
视野跟随选择为马里奥对象
左右选择为128,当马里奥处于这个点上,向左向右都要发生屏幕滚动
如果是32,那么马里奥需要走到屏幕边缘,32的位置才发生滚动。
设置在中心的位置比较自然
逻辑代码
马里奥自由下落逻辑与落地逻辑
双击马里奥对象,添加Step步事件
//自由落体
var temp;
if(jump == 0)
{
temp = collision_line(x-6,y,x + 5,y,obj_wall_father,0,0);
x,y和x,y两点确定一条直线,(y不变,默认在脚下)
是不是精确碰撞,是否排除自己,
跟父对象进行碰撞判断代替与五个墙体进行判断(判断起来比较龌蹉的用词)
if( temp == 0)
{
如果没有发生碰撞就自由下落
jump = 1;
speed =1;
direction = 270;
gravity = 0.3; //如果帧率在60,不宜超过0.5,不然下落会非常快
}
}
发生碰撞区域为透明区域,如果脚下一团像素中有任何一个点在墙上,都可以认为它是已经落地的。
马里奥的中心向左6个像素,向右5个像素的位置。
//落地判断
if (jump == 1)
{
temp = collision_line(x-6,y,x + 5,y,obj_wall_father,0,0); 返回的是所碰撞物体ID(代表这个物体,可以进行引用)
if(temp >= 1)
{
如果发生了碰撞,设置落地状态
Jump = 0;
Speed = 0;
gravity = 0;
y = temp.y; 墙体y轴中心在上边缘。
}
}
人物下落的时候,并非是按单个像素单位下落的,可能是2,3,1.5,1.6不规则的数。
这会导致人物嵌进地面2个像素,然后设置成落地状态,静止不动。
长条蓝色表示地面。
进行预先判断,预先判断下一帧是否发生碰撞y+speed
和向上顶区分开来direction == 270
f (jump == 1 and direction == 270)
{
temp = collision_line(x-6,y+speed,x + 5,y + speed,obj_wall_father,0,0); 返回的是所碰撞物体ID(代表这个物体,可以进行引用)
if(temp >= 1)
{
如果发生了碰撞,设置落地状态
Jump = 0;
Speed = 0;
gravity = 0;
y = temp.y; 墙体y轴中心在上边缘。
}
}
马里奥左右移动逻辑
继续在mario对象的步事件里面写
if (keyboard_check(vk_left) || key )
马里奥顶撞逻辑
顶撞砖墙逻辑
顶问号逻辑
创建金币物体
创建敌人,自由落体与落地,左右移动与碰撞
马里奥踩踏敌人逻辑
好文章