RPG_Basic(29):AI优化
Youtube视频地址:HeartBeast
实现效果为
首先打开obj_enemy_slime,在Create事件中,删除test变量,并将变量targetx,targety(基于向目标的方式来移动)改为xaxis, yaxis(基于渐近的方式来移动)
打开scr_enemy_choose_next脚本,在现有的代码,可以看到怪物巡逻的地点,是在房间内随机选取一个点。现在要做一个改变,将target_x个target_y的代码移除
换成xaxis, yaxis,在怪物处于巡逻的状态,选取一个新的移动轴来进行移动
同样的,scr_idle_state脚本不用更改,但怪物巡逻时每帧检测玩家的scr_check_for_player脚本,也要修改targetx, targety为xaxis, yaxis,
在scr_enemy_chase_state和scr_enemy_wander_state追击角色的脚本也同样要替换,并且移除掉条件
这样修改以后,会发现怪物巡逻的脚本scr_enemy_wander_state和怪物追击的脚本scr_enemy_chase_state脚本是一样的。
所以为了方便调用,新建一个脚本scr_move_axis(),来作为向着某个移动轴进行移动
此时保存代码,运行游戏会发现,怪物只会自由移动,而不会追击角色
这是因为在scr_move_axis()脚本中,怪物获取方向的代码不对。
因为xaxis和yaxis已经不再是某个坐标的xy值了,如果仍然用point_direction( x, y, xaxis, yaxis)当然是错的。
xaxis和yaxis实际上应该看待为移动速度的分量,所以这里直接改为point_direction( 0, 0, xaxis, yaxis)即可修复。
导入新的怪物精灵图片,全选所有图片,将其拖入GMS2的工作区
然后依次命名名称Name,设置图片原点Origin
spr_chinlin_run_up
spr_chinlin_run_down
spr_chinlin_run_right
spr_chinlin_stand_up
spr_chinlin_stand_rightS
复制obj_enemy_slime,将复制后的副本对象重命名为obj_chinlin,设置精灵图片为obj_chinlin_stand_right
并设置碰撞形状
由于该怪物对象是从obj_lifeform_parent继承而来,只具有最基本一些属性(例如死亡),如果想要额外的属性,可以创建一个从obj_lifeform_parent继承的怪物父对象,然后该怪物对象从怪物父物体继承就可以了,但这里只不打算额外增加了。
和角色创建movement和facing类似,这里也要在obj_enemy_chin的create事件里创建。首先新建一个宏变量IDLE
然后使用方向,状态变量,和二维数组来更新精灵子图片
由于额外增加了IDLE的状态,所以在scr_enemy_stall_state和scr_enemy_idle_state脚本需要为状态movement赋值
因为在移动时,我们只导入right方向上的精灵图片,这里利用sign函数,根据实例移动方向,对对象的精灵进行水平翻转,并且更新了movement为MOVE
修改函数scr_get_face脚本,添加一个参数作为脚本参数
但是因为在obj_player也使用了scr_get_face()脚本,这里改为传参的函数,那么其他地方也要跟着改变,怎么批量更改呢,这里可以按快捷按钮 Ctrl + Shift + F.会呼出一个弹窗,在弹窗搜索栏,直接输入scr_get_input搜索,会得到搜索结果
然后在obj_enemy_chinlin的step事件中也添加更新精灵索引代码
把obj_enemy_chinlin对象拖入房间,运行游戏即可看到效果
jiaoshou827 youtube主自己提供的素材
你在哪找的素材呢?这个宠物好可爱