попытка индексировать локальный def (нулевое значение) - PullRequest
1 голос
/ 29 апреля 2020

Я работаю над игрой. В определенный момент я хотел бы создать специальный GameObject. Специальный GameObject называется Projectile и является таким же, как GameObject, но имеет dx и dy, а также некоторые другие функции, которые будут иметь только снаряд. Я пытаюсь заставить Projectile расширить класс GameObject, но у меня возникают проблемы, когда я пытаюсь создать экземпляр Projectile. Я пробовал разные способы объявления снаряда и порядка перетасовки декларации, но не могу понять, почему я получаю ошибку, упомянутую в названии. Спасибо!

Следующее работает просто отлично:

table.insert(self.dungeon.currentRoom.objects, GameObject(
                        GAME_OBJECT_DEFS['pot'],
                        self.player.x,
                        self.player.y
                    ))

Но когда я меняю "GameObject" на "Снаряд", это не так.

table.insert(self.dungeon.currentRoom.objects, Projectile(
                        GAME_OBJECT_DEFS['pot'],
                        self.player.x,
                        self.player.y
                    ))

Остальное поддерживает код. Я использую код класса от Матиаса Рихтера

require 'src/Projectile'
require 'src/GameObject'
require 'src/game_objects'

GameObject = Class{}

function GameObject:init(def, x, y)
    -- string identifying this object type
    self.type = def.type

    self.texture = def.texture
    self.frame = def.frame or 1

    -- whether it acts as an obstacle or not
    self.solid = def.solid

    self.defaultState = def.defaultState
    self.state = self.defaultState
    self.states = def.states

    -- dimensions
    self.x = x
    self.y = y
    self.width = def.width
    self.height = def.height

    -- default empty collision callback
    self.onCollide = def.onCollide
end

Projectile = Class{__includes = GameObject}

function Projectile:init()
    GameObject.init(self, def)

    self.dx = 0
    self.dy = 0
end

GAME_OBJECT_DEFS = {
    ['pot'] = {
        type = 'pot',
        texture = 'tiles',
        frame = 14,
        width = 16,
        height = 16,
        solid = true,
        defaultState = 'idle',
        states = {
            ['idle'] = {
                frame = 14,
            }
        },
        onCollide = function()
        end
    }
}

1 Ответ

2 голосов
/ 29 апреля 2020
function Projectile:init()
    GameObject.init(self, def)

    self.dx = 0
    self.dy = 0
end

def равно nil

, поэтому при

function GameObject:init(def, x, y)
    -- string identifying this object type
    self.type = def.type

вы индексируете нулевое значение.

То же самое произойдет для x и y

...