如何通过hitTestObject实现角色触碰Jelly前保持可移动状态?
实现角色碰撞Jelly前可移动的方案
核心逻辑很直白:用JellyHitted变量标记是否撞到Jelly,只有没撞到的时候,才允许角色响应移动按钮的操作,同时要让碰撞检测持续运行,实时更新这个状态。
1. 修改角色控制代码
给每个移动按钮的点击事件加状态判断,仅在未碰撞时执行移动逻辑:
up_btn.addEventListener(MouseEvent.CLICK, function(){ if(!JellyHitted){ // 未碰撞时才允许向上移动 character.y -= 10; } }) down_btn.addEventListener(MouseEvent.CLICK, function(){ if(!JellyHitted){ character.y += 10; } }) left_btn.addEventListener(MouseEvent.CLICK, function(){ if(!JellyHitted){ character.x += 10; } }) right_btn.addEventListener(MouseEvent.CLICK, function(){ if(!JellyHitted){ character.x -= 10; } })
2. 补全碰撞检测逻辑
把碰撞检测绑定到帧事件上,让程序持续检测碰撞状态,同时补全原代码未闭合的函数:
var JellyHitted:Boolean = false; // 初始默认未碰撞 // 绑定到帧事件,每一帧都检查一次碰撞状态 addEventListener(Event.ENTER_FRAME, hitJelly); function hitJelly(e: Event):void { if (character.hitTestObject(Jelly1)) { JellyHitted = true; character.gotoAndStop(7); // 如果想碰撞后彻底禁用移动,可直接移除按钮监听: // up_btn.removeEventListener(MouseEvent.CLICK, 对应函数); if (character.electrocuted.currentFrame == 30) { character.gotoAndStop(1); } } else { JellyHitted = false; } }
关键细节
- 必须初始化
JellyHitted为false,否则角色初始状态可能无法移动 - 用
ENTER_FRAME实时检测碰撞,能保证状态及时更新;如果不需要高频检测,也可以在每次点击移动按钮后调用一次hitJelly函数 - 若碰撞后想彻底禁用移动,直接移除按钮的点击监听会比变量判断更彻底
内容的提问来源于stack exchange,提问作者Isaac Yeap Jie Ling
相关产品推荐
相关产品推荐

