GameMaker碰撞问题求助:1v1坦克游戏自定义移动逻辑的碰撞解决方案
1v1坦克游戏碰撞问题解决方案建议
以下是针对你的坦克控制逻辑和碰撞问题的具体优化建议:
替换
motion_add为精准速度控制
当前用motion_add会持续累加速度,导致坦克速度失控,碰撞时易出现穿模、卡顿。改用直接计算速度向量的方式,确保移动速度始终稳定:// W键前进(修正角度适配GameMaker坐标系) if keyboard_check(ord("W")) { var _move_dir = image_angle - 90; // GameMaker默认0度朝右,调整为坦克朝向对应前进方向 hspeed = lengthdir_x(_velocidad, _move_dir); vspeed = lengthdir_y(_velocidad, _move_dir); } // S键后退 else if keyboard_check(ord("S")) { var _move_dir = image_angle + 90; hspeed = lengthdir_x(_velocidad, _move_dir); vspeed = lengthdir_y(_velocidad, _move_dir); } // 无前后输入时停止移动 else { hspeed = 0; vspeed = 0; }添加步进式碰撞修正逻辑
在移动代码后加入碰撞检测与位置修正,避免坦克穿模:// 以墙体对象obj_wall为例,处理垂直方向碰撞 if place_meeting(x, y + vspeed, obj_wall) { while !place_meeting(x, y + sign(vspeed), obj_wall) { y += sign(vspeed); } vspeed = 0; } // 处理水平方向碰撞 if place_meeting(x + hspeed, y, obj_wall) { while !place_meeting(x + sign(hspeed), y, obj_wall) { x += sign(hspeed); } hspeed = 0; }分离炮塔旋转的作用范围
当前炮塔旋转逻辑未做玩家区分,1v1游戏中会导致双方炮塔同时响应按键。建议添加玩家身份判断:// 假设此代码属于玩家1的坦克对象 if (instance_exists(obj_canon) && id == obj_player1) { if keyboard_check(vk_right) { obj_canon.image_angle -= 1.33; } if keyboard_check(vk_left) { obj_canon.image_angle += 1.33; } }使用内置函数简化碰撞处理
GameMaker的move_and_collide函数可自动处理移动与碰撞,大幅简化代码:if keyboard_check(ord("W")) { move_and_collide(lengthdir_x(_velocidad, image_angle-90), lengthdir_y(_velocidad, image_angle-90), obj_wall, true); } else if keyboard_check(ord("S")) { move_and_collide(lengthdir_x(_velocidad, image_angle+90), lengthdir_y(_velocidad, image_angle+90), obj_wall, true); } else { hspeed = 0; vspeed = 0; }该函数会在碰撞时自动停止移动并修正位置,返回布尔值可用于后续逻辑判断。
内容的提问来源于stack exchange,提问作者Yakken
相关产品推荐
相关产品推荐

