Phaser 3游戏分数达标时触碰门未触发floor2函数问题咨询
问题原因
- 门对象未添加物理属性:你使用
this.add.image创建的门只是普通渲染元素,没有物理碰撞盒,Phaser的物理重叠检测无法识别该对象。 - create函数参数覆盖全局分数:你给create函数声明了
score参数,但Phaser初始化场景调用create时不会传入分数值,该参数值为undefined,写在create中的if(score >= 10)判断永远不会成立,重叠检测代码根本没有执行。 - 重叠回调写法错误:你写的
this.physics.add.overlap(player,door,floor2(score))会在代码执行到这一行时就直接调用floor2函数,而不是将它作为碰撞触发时的回调传入;同时没有绑定this指向,就算后续触发回调,floor2中的this会指向全局对象,调用this.physics会直接报错。 - 分数判断时机错误:create函数只会在场景初始化时执行一次,此时玩家还未收集星星,分数初始为0,就算后续分数涨到10分以上,也不会重新执行判断添加碰撞检测。
修改方案
你可以按照以下步骤调整代码:
- 调整门的创建代码,给门添加静态物理体:
// 把原来的 door = this.add.image(50,550,'door'); 替换为下面的代码 door = this.physics.add.staticImage(50,550,'door');
- 去掉create函数的score参数,避免覆盖全局分数变量:
// 把原来的 function create (score) 改为 function create ()
- 删除create中原来的分数判断加碰撞的代码,直接添加重叠检测,在回调中判断分数:
// 删掉原来的if (score >= 10) {...} 代码块,替换为下面的代码 this.physics.add.overlap(player,door, function() { if(score >= 10) { floor2.call(this); } }, null, this);
- floor2函数不需要额外传score参数,直接读取全局的score变量即可,不需要做修改。
修改后你再运行游戏,当分数≥10时触碰门就会触发floor2的通关逻辑了。
内容的提问来源于stack exchange,提问作者Qrow
相关产品推荐
相关产品推荐

