Phaser:当使用多个场景时,setCollisionByProperty问题



我是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 = []

再次感谢您

我希望它能帮助你找到/调试它(我的信息太长了,不能评论)

嗯,我在一个小的演示中测试了这个结构,它是有效的。所以我必须假设,错误在那里抛出,但可能是在其他地方引起的。这可能是场景的切换,但没有看到代码我不能说。这就是为什么我建议不要使用全局变量,而是使用属性来收集图层。

这里有一些修改,你可以这样做,可能会解决这个问题:

  1. 删除这一行:

    let staticLayer = [] 
    
  2. 设置新属性:

    export default class GameScene extends Phaser.Scene{
    constructor(){
    super({key : "GameScene"})
    this.staticLayer = [];
    }
    ...
    
  3. 将所有staticLayer替换为this.staticLayer:

    ...
    this.staticLayer.push(carteDuNiveau.createLayer("sol",tileset));   
    ...
    staticLayer.forEach((element) => {
    ...
    })
    ...
    

如果这没有帮助,你必须检查代码,在你切换场景的地方。

相关内容

  • 没有找到相关文章

最新更新