我是Phaser新手。我尝试着创造一款迷你rpg游戏。我已经制作了我的地图,并将其导出为。json对象,并使用setCollisionByProperty来制作精灵和Tile之间的碰撞。当我在单独的场景中测试它时,它是有效的。但是当我想使用多个场景时,当我想返回到一个场景时出现错误。
Uncaught TypeError: n is undefined
经过多次测试,当我使用setCollisionByProperty时,我找到了问题,但我不明白如何解决它
代码如下:
import GameScene from "./GameScene.js"
import maisonScene from "./maisonScene.js"
import Joueur from "./joueur.js"
/* * Configuration du jeu */
var config = { type: Phaser.AUTO,
width: 800,
height: 600,
physics :{
default : 'arcade',
arcade:{
debug : true, //Pour debug les collisions
gravity :{
y:0
},
}
},
scene: {
preload: preload,
create: create,
update: update
},
pixelArt: true,
scene : [maisonScene, GameScene], };
var game = new Phaser.Game(config); export let joueur = new Joueur();
function preload(){}
function create(){}
function update(){}
在GameScene中(在maisonScene中也是一样):
let staticLayer =[] //tableau contenant les calques du paysage
export default class GameScene extends Phaser.Scene{
constructor(){
super({key : "GameScene"})
}
create(){
//chargement de la carte
const carteDuNiveau = this.add.tilemap("carte");
//chargement des tuiles
const tileset = carteDuNiveau.addTilesetImage("Citique","tuiles");
//chargement du calque sol
staticLayer.push(carteDuNiveau.createLayer("sol",tileset));
//chargement du calque chemin
staticLayer.push(carteDuNiveau.createLayer("chemin",tileset));
//chargement du calque fleurs
staticLayer.push(carteDuNiveau.createLayer("fleurs",tileset));
player = this.physics.add.sprite(300, 150, 'player');
player.body.setSize(40,22,false) //Redimensionner la hitbox du joueur
player.body.setOffset(4,42) //Deplacer la hitbox vers le bas du joueur
player.setScale(0.6);
staticLayer.forEach((element)=>{
element.setScale(2);
element.setCollisionByProperty({ estSolide: true });
// ajout d'une collision entre le joueur et les calques
this.physics.add.collider(player, element);
})
staticLayer包含我所有的图层
谢谢你的帮助(抱歉我英语不好,我是法国人)
谢谢,我发现我的错误了。就像你说的:错误是我的变量staticLayer。它需要重新启动场景,因为当场景重新启动时,它会在内存中保留第一个场景的层。因此,我将变量放入create()中,以便在场景再次开始时使数组为空:
create(){
staticLayer = []
再次感谢您
我希望它能帮助你找到/调试它(我的信息太长了,不能评论)
嗯,我在一个小的演示中测试了这个结构,它是有效的。所以我必须假设,错误在那里抛出,但可能是在其他地方引起的。这可能是场景的切换,但没有看到代码我不能说。这就是为什么我建议不要使用全局变量,而是使用属性来收集图层。
这里有一些修改,你可以这样做,可能会解决这个问题:
-
删除这一行:
let staticLayer = []
-
设置新属性:
export default class GameScene extends Phaser.Scene{ constructor(){ super({key : "GameScene"}) this.staticLayer = []; } ...
-
将所有
staticLayer
替换为this.staticLayer
:... this.staticLayer.push(carteDuNiveau.createLayer("sol",tileset)); ... staticLayer.forEach((element) => { ... }) ...
如果这没有帮助,你必须检查代码,在你切换场景的地方。