Zombie
- ваш единственный зомби.Каждый «новый» зомби, которого вы создаете, на самом деле является просто псевдонимом для него:
zombie = Zombie
не создает копию, но говорит, что zombie
- это просто другое имя для того же объекта.
Вам нужно создать новую таблицу для каждого нового зомби.Возможно, вы захотите использовать методы , чтобы вы могли использовать одни и те же функции для каждого экземпляра.
Метод определяется с помощью :
и автоматически получает невидимый параметр с именем self
, которыйэто объект, на котором был вызван метод.Методы называются как :move(0.5)
вместо .move(0.5)
:
function Zombie:move(dt)
local distance = self.speed * dt * 60
self.position.x = self.position.x + math.cos(self.angle) * distance
self.position.y = self.position.y + math.sin(self.angle) * distance
end
Чтобы создать новый экземпляр зомби, вам нужно создать новую таблицу с начальными свойствами, которые вы хотите
local newZombie = {
position = {},
speed = 1,
angle = 0,
}
и затем дайте ему все методы, которые должен иметь Зомби.Кратчайший способ сделать это - использовать metatables .Метаметод __index
объясняет Lua, что делать, когда поле / метод запрашивается, но это не было явно установлено.Это позволяет нам «копировать» «класс» Zombie на новые экземпляры:
setmetatable(newZombie, {__index = Zombie})
Это можно заключить в метод «конструктор» в «классе» Zombie.Поскольку этот конструктор не действует на существующий объект-зомби, вы должны определить и вызвать его с помощью .
вместо :
:
local Zombie = {}
-- This property is shared between ALL zombies,
-- and changing it will change it for ALL zombies
Zombie.sprite = love.graphics.newImage('sprites/zombie.png')
-- RETURNS a freshly created Zombie instance
function Zombie.create()
local newZombie = {
position = {},
speed = 1,
angle = 0,
sprite = love.graphics.newImage('sprites/zombie.png')
}
return setmetatable(newZombie, {__index = Zombie})
end
-- MODIFIES the zombie that this is called on
function Zombie:move(dt)
local distance = self.speed * dt * 60
self.position.x = self.position.x + math.cos(self.angle) * distance
self.position.y = self.position.y + math.sin(self.angle) * distance
end
function Zombie:setPos(x, y)
self.position.x = x
self.position.y = y
end
-- MODIFIES zombies by adding a freshly created zombie to it
function spawnZombie(zombies)
local newZombie = Zombie.create()
newZombie:setPos(math.random(0, love.graphics.getWidth()), math.random(0, love.graphics.getHeight()))
table.insert(zombieTable, newZombie)
end
-- In update function:
for i, z in ipairs(zombies) do
z:rotate(player1)
z:move(dt)
end
Вы должны привыкнуть использовать local
переменных в ваших функциях, таких как distance
в Zombie:move
.Глобальные переменные могут вызывать ошибки, а также приводить к (небольшому) снижению производительности, поскольку совместное использование переменной для всех занимает больше времени, чем ее скрытие (а также усложняет работу оптимизатора JIT).