GameMaker 2如何实现屏幕指定边界内精灵随机位置生成
GameMaker 2 窗口范围内随机位置生成敌人精灵方案
你已经掌握固定位置生成精灵、固定频率触发生成的逻辑,只需要把原来写死的生成坐标替换成边界范围内的随机值即可,具体实现如下:
核心原理
精灵生成的坐标由X、Y两个轴的数值决定,只要在你设定的合法生成边界内,分别为X、Y取随机数,把得到的随机坐标传入实例创建函数,就能实现随机位置生成效果。
具体实现步骤
- 先明确生成边界:如果要和游戏窗口/当前视野完全匹配,直接调用GameMaker 2内置的相机参数获取边界即可;如果需要避开窗口最边缘(比如防止精灵生成在视野外半块),可以自定义边距数值。
- 调用随机数函数生成合法坐标,替换原有固定坐标参数。
可直接复用的代码示例
把这段代码放到你原本写固定位置生成敌人的位置(控制器对象的Alarm事件/Step事件的频率判断分支里都可以):
// 自定义生成边距,单位像素,可按需修改,设为0就是贴满窗口边缘生成 var _spawn_margin = 32; // 获取当前主相机的视野边界 var _cam = view_camera[0]; var _min_x = camera_get_view_x(_cam) + _spawn_margin; var _max_x = camera_get_view_x(_cam) + camera_get_view_width(_cam) - _spawn_margin; var _min_y = camera_get_view_y(_cam) + _spawn_margin; var _max_y = camera_get_view_y(_cam) + camera_get_view_height(_cam) - _spawn_margin; // 生成边界内的随机整数坐标(像素坐标用整数更稳妥) var _spawn_x = irandom_range(_min_x, _max_x); var _spawn_y = irandom_range(_min_y, _max_y); // 生成敌人实例,注意把"Instances"换成你自己的图层名,obj_enemy换成你自己的敌人对象名 instance_create_layer(_spawn_x, _spawn_y, "Instances", obj_enemy);
可选优化
避免敌人直接生成在玩家身上
如果不希望敌人一出生就和玩家重叠,可以加一层距离校验,找到和玩家保持安全距离的坐标再生成:
// 接上面边界定义的代码,先定义安全距离 var _safe_dist = 80; // 循环随机取点,直到点和玩家的距离满足安全要求 do { _spawn_x = irandom_range(_min_x, _max_x); _spawn_y = irandom_range(_min_y, _max_y); } until (point_distance(_spawn_x, _spawn_y, obj_player.x, obj_player.y) >= _safe_dist); // 之后再执行instance_create_layer生成敌人即可
适配卷轴类射击游戏
如果是纵向/横向滚动的射击关卡,不要用固定窗口尺寸当边界,始终以当前激活的相机视野范围作为生成边界即可,上面的相机参数写法已经自动适配相机移动,不需要额外修改。
内容的提问来源于stack exchange,提问作者ProGameDev
相关产品推荐
相关产品推荐

