Я пытаюсь создать свой собственный редактор мира на Javascript. Я использую папку с отдельными плитками и размещаю их на экране. Затем, когда вы нажимаете на плитку, вы по сути выбираете ее. Это работает, но когда указатель вниз переключается с выбора плитки на ее размещение, я получаю эту ошибку.
Я проверил, все ли определено, но, возможно, я что-то упускаю.
Обновление: я изменил функции стрелок, чтобы использовать обычные, но они все еще не работают и выдают ту же ошибку, и теперь предоставляю весь код файла.
я столкнулся с этим console.info(this.map) VM10362:1 не определено неопределенный
Я думаю, это ошибки, известные как трассировка стека
это мой код
class WorldEditor extends Phaser.Scene {
constructor() {
super("editWorld")
this.tileSize = 48
this.tileIndex = 0
this.tileFolder = 'Assets/Tiles/'
this.tilesPerRow = 37
this.totalTiles = 160
this.tilePicked = false
}
preload() {
// Load tile images from the folder
for (let i = 0; i < this.totalTiles; i++) {
this.load.image('tile (' + i + ')', this.tileFolder + 'tile (' + i + ').png')
}
}
create() {
const tileWidth = this.tileSize
const tileHeight = this.tileSize
const tilesPerRow = this.tilesPerRow
if (!this.map){
this.map = this.make.tilemap({
tileWidth: this.tileSize,
tileHeight: this.tileSize,
width: 1200,
height: 720
})
}
for (let i = 0; i < this.totalTiles; i++) {
const x = ((i % tilesPerRow) * tileWidth)/1.48
const y = (Math.floor(i / tilesPerRow) * tileHeight)/1.48
this.tile = this.add.image(x, y, 'tile (' + i + ')')
this.tile.setOrigin(0)
this.tile.setScale((tileWidth / this.tile.width)/1.48, (tileHeight / this.tile.height)/1.48)
}
// Set up pointer events
this.setupPointerEvents()
// Keyboard event to switch back to tile selection
this.input.keyboard.on('keydown-F', () => {
this.tilePicked = false
console.info('Switched back to tile selection')
this.setupPointerEvents() // Update pointer events after switching back
})
}
setupPointerEvents() {
this.input.off('pointerdown')
if (!this.tilePicked) {
const tiles = this.children.list.filter(child => child.texture && child.texture.key.startsWith('tile ('))
tiles.forEach((tile, i) => {
tile.setInteractive()
tile.on('pointerdown', function() {
this.tileIndex = i
this.tilePicked = true
tile.setTint(0xff0000)
console.info('Selected tile index:', this.tileIndex)
this.setupPointerEvents()
}, this)
})
} else {
this.input.on('pointerdown', function(pointer) {
this.tileX = Math.floor(pointer.x / this.tileSize)
this.tileY = Math.floor(pointer.y / this.tileSize)
this.placeTile(this.tileX, this.tileY)
}, this)
}
}
// Other methods...
placeTile(tileX, tileY) {
this.map.putTileAt(this.tileIndex, tileX, tileY)
}
// Implement saveMap and loadMap functions to save and load level data
}
Где переменная config должна получить значение?
В сообщении об ошибке также должен быть указан номер строки, если вы его укажете, это поможет. Отладчики браузеров в наши дни являются первоклассными, и нажатие на стек вызовов даже приведет вас к коду, вызвавшему ошибку.
Конфигурация находится в game.js, а проблемы со строками — this.map.putTileAt(this.tileIndex, tileX, tileY) и this.placeTile(tileX, tileY), все остальные ошибки находятся в Phaser.js.
В исходном коде нет ссылки на только что добавленный вами раздел «проблемы с линией». Что такое «остальные ошибки»?
Невозможно прочитать свойства неопределенного значения (чтение «ширины») в t.exports (phaser.min.js:1:1082810) в t.exports [as PutTileAt] (phaser.min.js:1:1084458) в Initialize.putTileAt ( Phaser.min.js:1:1057178) в WorldEditor.placeTile (WorldEditor.js:79:18) при инициализации.<anonymous> (WorldEditor.js:72:22) в a.emit (phaser.min.js:1) :1600) при инициализации.processDownEvents (phaser.min.js:1:471023) при инициализации.обновление (phaser.min.js:1:468865) при инициализации.updateInputPlugins (phaser.min.js:1:461466) при инициализации .onMouseDown (phaser.min.js:1:462898)
И все строки фазера взяты из библиотеки фазера. Должен ли я также предоставить строки из фазера, которые вызывают ошибки?
Хорошо, это не дополнительные ошибки, а трассировка стека, которая показывает, где инициируется каждый вызов. Похоже, вы передаете переменную функции, которая не имеет всех необходимых свойств.
Вам следует отредактировать ошибку и добавить трассировку в свой вопрос. Что касается комментариев, то такой контент нечитабелен.
Да, извини, я новичок в этом и пытаюсь, хаха
Я попытался указать значения ширины и высоты карты вместо конфигурации, но это ничего не дало. та же проблема сохраняется



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Основная проблема заключается в том, что слой не создан. создайте слой (с тайлсетом) и ошибок быть не должно.
кстати: функции стрелок и прицелы
thisв данном конкретном случае (развитие фазера) верны.
Мини-пример, который решает проблему:
(Я мог бы обновить его, чтобы он выглядел лучше)
Просто нажмите на белый квадрат. и проверьте консоль браузера
document.body.style = 'margin:0;';
console.clear();
class MainScene extends Phaser.Scene{
create () {
this.add.text(10,10, 'DEMO TEXT')
const tileHeight = 10
const tilesPerRow = 3
// just for the demo -- START
let graphics = this.make.graphics();
graphics.fillStyle(0xffffff);
graphics.fillRect(0, 0, 100, 100);
graphics.generateTexture('tileset', 100, 100);
// just for the demo -- END
if (!this.map){
this.map = this.make.tilemap({
tileWidth: tileHeight,
tileHeight: tileHeight,
width: config.width,
height: config.height
})
const tileset = this.map.addTilesetImage('tileset', null, 10, 10);
this.layer = this.map.createBlankLayer('layer1', tileset);
}
for (let i = 0; i < 9 ; i++) {
const x = ((i % tilesPerRow) * tileHeight)
const y = (Math.floor(i / tilesPerRow) * tileHeight)
// just for the demo
graphics.generateTexture('tile (' + i + ')', 10, 10);
this.tile = this.add.image(x, y, 'tile (' + i + ')')
this.tile.setOrigin(0)
this.tile.setScale(10, 10)
}
// Set up pointer events
this.setupPointerEvents()
// Keyboard event to switch back to tile selection
this.input.keyboard.on('keydown-F', () => {
this.tilePicked = false
console.info('Switched back to tile selection')
this.setupPointerEvents() // Update pointer events after switching back
})
}
setupPointerEvents() {
this.input.off('pointerdown')
if (!this.tilePicked) {
const tiles = this.children.list.filter(child => child.texture && child.texture.key && (/tile \(/).test(child.texture.key))
tiles.forEach((tile, i) => {
tile.setInteractive()
tile.on('pointerdown', () => {
this.tileIndex = i
this.tilePicked = true
tile.setTint(0xff0000)
console.info('Selected tile index:', this.tileIndex)
this.setupPointerEvents()
})
})
} else {
this.input.on('pointerdown', (pointer) => {
const tileX = Math.floor(pointer.x / 10)
const tileY = Math.floor(pointer.y / 10)
this.placeTile(tileX, tileY)
})
}
}
placeTile(tileX, tileY) {
console.info('tileplaced')
this.map.putTileAt(this.tileIndex, tileX, tileY, this.layer)
}
}
var config = {
width: 536,
height: 183,
scene: MainScene
};
new Phaser.Game(config);<script src = "//cdn.jsdelivr.net/npm/phaser/dist/phaser.min.js"></script>Да, спасибо... такая странная ошибка, но спасибо, я ее исправила.
Я добавил изображение набора тайлов, которое не использую, и слой, и теперь все работает. спасибо за всю помощь!
if (!this.map){
this.map = this.make.tilemap({
tileWidth: this.tileSize,
tileHeight: this.tileSize,
width: 1200,
height: 720
})
const tileset = this.map.addTilesetImage('tiles', 'tiles', this.tileSize, this.tileSize)
const groundLayer = this.map.createBlankLayer('groundLayer', tileset)
}
Хороший короткий ответ/решение. Если возможно, примите свой ответ (с зеленой галочкой под стрелками голосования), чтобы вопрос выглядел решенным. Это поможет другим людям с той же проблемой быстрее найти решение.
Что ж, эта ошибка, очевидно, относится либо к
config, либо кtile. Вы установили точки останова для проверки их значений во время работы?