Phaser中添加碰撞后kiwi精灵失去键盘控制的问题咨询
问题根源与修复方案
核心错误点
- 变量名混淆:你创建的玩家精灵实例是
player,但碰撞代码里误写为kiwi(这是纹理资源名,不是精灵对象),这行错误代码会引发ReferenceError,导致游戏逻辑异常,直接让玩家操控失效。 - 缺少碰撞回调:没有设置碰撞触发后的回调函数,无法将
spiked设为true,自然无法触发游戏重置。 - 重置代码版本不兼容:你用的是Phaser 3,但
game.state.start(game.state.current)是Phaser 2的写法,Phaser 3不支持该API。
修正步骤
1. 修正碰撞代码
把错误的碰撞代码:
this.physics.add.collider(spikes, kiwi);
替换为:
this.physics.add.collider(spikes, player, hitSpike, null, this);
新增的hitSpike是碰撞触发后的回调函数,用于处理重置逻辑。
2. 添加碰撞回调函数
在代码中新增以下函数:
function hitSpike(player, spike) { spiked = true; }
玩家碰到尖刺时,这个函数会将spiked设为true,触发后续的游戏重置。
3. 修正游戏重置代码
把update函数里的重置代码:
if (spiked) { game.state.start(game.state.current); }
替换为Phaser 3的正确写法:
if (spiked) { this.scene.restart(); }
4. 可选优化:固定尖刺位置
为避免尖刺受重力影响移动,创建尖刺时添加固定属性:
spikes.create(200, 200, 'spike').setScale(.8).setBounce(0).setImmovable(true).body.setAllowGravity(false);
修正后的关键代码片段
function create() { // ... 其他原有代码省略 ... spikes = this.physics.add.group(); spikes.create(200, 200, 'spike').setScale(.8).setBounce(0).setImmovable(true).body.setAllowGravity(false); this.physics.add.collider(spikes, platforms); this.physics.add.collider(spikes, player, hitSpike, null, this); // ... 其他原有代码省略 ... } function hitSpike(player, spike) { spiked = true; } function update() { // ... 原有移动控制代码省略 ... if (spiked) { this.scene.restart(); } spiked = false; }
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

