gpt4 book ai didi

javascript - JS、Socket.io、Phaser3、未创建对象

转载 作者:行者123 更新时间:2023-12-05 04:37:50 25 4
gpt4 key购买 nike

我是 JS、phaser3 和 Socket.io 新手,我真的很想学习。

代码上下文:

  • Phaser3
  • Socket.io
  • socket连接前游戏房间的加载状态
  • 生成 NPC 和玩家
  • 在创建 NPC 的同一回调中尝试访问 NPC 的(大量) Sprite 时失败

问题:

  • 无法访问 sprite 属性,一般来说对象似乎不是一开始就创建的

在连接到套接字服务器后,我让套接字在 Phaser3 的“create()”函数中监听“universeState”。索引.js:

this.socket.on('universeState',(universe)=>
{
console.log(`mass? ${JSON.stringify(universe.sys.mass[1].id)}`)
for(let i = 0;i < universe.sys.mass.length; i++)
{
console.log(universe.sys.mass[i].id,universe.sys.mass[i].x,universe.sys.mass[i].y,universe.sys.mass[i].asset);
this.utils.genMass(universe.sys.mass[i].id,universe.sys.mass[i].x,universe.sys.mass[i].y,universe.sys.mass[i].asset);
console.log(`check: 3 ${JSON.stringify(this.state.state.mass)}`);
this.state.state.mass[universe.sys.mass[i].id].sprite.setScale(0.5,0.5); //issue here
console.log('check: 4');

this.physics.add.collider(this.state.state.mass[universe.sys.mass[i].id].sprite, this.state.state.playerMass[this.state.id].sprite, function(mass, player) {
mass.destroy();
player.setScale(player.scaleX + 0.03);
let camera = this.cameras.main;
camera.zoomTo(camera.zoom * 0.975);
}, null, this);
}

用于在 utils.js 中创建“质量”的函数:

genMass(id,x,y,tex)
{
console.log(`creating sprite with operands: ${id},${x},${y},${tex}`);
let sprite = this.scene.physics.add.sprite(50,50,tex)//needs to be a physics object
if(id.substring(0,5)=='mass:')
{
console.log(`is equal`)
}
id.substring(0,4)=='mass:'?
this.scene.state.state.mass[id] = {id:id,sprite:sprite,x:x,y:y}:
this.scene.state.state.playerMass[id] = {id:id,sprite:sprite,x:x,y:y}; //generate an extra parameter argument for quantified mass
console.log('check: 0');
id.substring(0,4)=='mass:'?
this.scene.physics.world.enable(this.scene.state.state.mass[id].sprite):
this.scene.physics.world.enable(this.scene.state.state.playerMass[id].sprite);
console.log('check: 1');
id.substring(0,4)=='mass:'?
this.scene.state.state.mass[id].sprite.body.collideWorldBounds = true:
this.scene.state.state.playerMass[id].sprite.body.collideWorldBounds = true;
console.log('check: 2');

}

在注释为“此处问题”的第一个代码片段中,一切都首先出现错误。因为我使用的是 webpack,所以捆绑文件帮不上什么忙。控制台:

Player ID returned:null
bundle.min.js:1 connected to game
bundle.min.js:1 mass? "mass:3961482"
bundle.min.js:1 mass:7107097 19134 14999 arc_purple
bundle.min.js:1 creating sprite with operands: mass:7107097,19134,14999,arc_purple
bundle.min.js:1 is equal
bundle.min.js:1 check: 0
bundle.min.js:1 check: 1
bundle.min.js:1 check: 2
bundle.min.js:1 check: 3 {}
bundle.min.js:1 Uncaught TypeError: Cannot read properties of undefined (reading 'sprite')
at Q.<anonymous> (bundle.min.js:1:978636)
at Q.i.emit (bundle.min.js:1:40837)
at Q.emitEvent (bundle.min.js:1:969227)
at Q.onevent (bundle.min.js:1:969030)
at Q.onpacket (bundle.min.js:1:968708)
at et.i.emit (bundle.min.js:1:40837)
at et.ondecoded (bundle.min.js:1:973286)
at q.i.emit (bundle.min.js:1:40837)
at q.add (bundle.min.js:1:964368)
at et.ondata (bundle.min.js:1:973261)

问题:

为什么我创建的对象在记录时是空的?如何成功创建对象并访问它?

注意事项:

我怀疑这是某种回调行为,您无法在同一回调中初始化某些内容并访问它。我比较新,我想学习谢谢。

最佳答案

我们在评论部分谈到了两件事。

  1. 您的子字符串需要包含冒号才能通过创建质量类型对象的测试。

  2. 未创建 playerMass 的对象。

你走在正确的轨道上。

关于javascript - JS、Socket.io、Phaser3、未创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70661274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com