Ошибка типа: невозможно прочитать свойства неопределенного значения (чтение «ширины»)

Я пытаюсь создать свой собственный редактор мира на 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, либо к tile. Вы установили точки останова для проверки их значений во время работы?

isherwood 19.02.2024 15:12

Где переменная config должна получить значение?

Pointy 19.02.2024 15:12

В сообщении об ошибке также должен быть указан номер строки, если вы его укажете, это поможет. Отладчики браузеров в наши дни являются первоклассными, и нажатие на стек вызовов даже приведет вас к коду, вызвавшему ошибку.

Keith 19.02.2024 15:14

Конфигурация находится в game.js, а проблемы со строками — this.map.putTileAt(this.tileIndex, tileX, tileY) и this.placeTile(tileX, tileY), все остальные ошибки находятся в Phaser.js.

Duckpedia 19.02.2024 15:20

В исходном коде нет ссылки на только что добавленный вами раздел «проблемы с линией». Что такое «остальные ошибки»?

mykaf 19.02.2024 15:22

Невозможно прочитать свойства неопределенного значения (чтение «ширины») в 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)

Duckpedia 19.02.2024 15:23

И все строки фазера взяты из библиотеки фазера. Должен ли я также предоставить строки из фазера, которые вызывают ошибки?

Duckpedia 19.02.2024 15:24

Хорошо, это не дополнительные ошибки, а трассировка стека, которая показывает, где инициируется каждый вызов. Похоже, вы передаете переменную функции, которая не имеет всех необходимых свойств.

mykaf 19.02.2024 15:25

Вам следует отредактировать ошибку и добавить трассировку в свой вопрос. Что касается комментариев, то такой контент нечитабелен.

Pointy 19.02.2024 15:25

Да, извини, я новичок в этом и пытаюсь, хаха

Duckpedia 19.02.2024 15:28

Я попытался указать значения ширины и высоты карты вместо конфигурации, но это ничего не дало. та же проблема сохраняется

Duckpedia 19.02.2024 15:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
11
483
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Основная проблема заключается в том, что слой не создан. создайте слой (с тайлсетом) и ошибок быть не должно.

кстати: функции стрелок и прицелы 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>

Да, спасибо... такая странная ошибка, но спасибо, я ее исправила.

Duckpedia 19.02.2024 16:25
Ответ принят как подходящий

Я добавил изображение набора тайлов, которое не использую, и слой, и теперь все работает. спасибо за всю помощь!

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)
        }

Хороший короткий ответ/решение. Если возможно, примите свой ответ (с зеленой галочкой под стрелками голосования), чтобы вопрос выглядел решенным. Это поможет другим людям с той же проблемой быстрее найти решение.

winner_joiner 20.02.2024 14:28

Другие вопросы по теме