Я пытаюсь проверить игровую механику, написав код lua в среде разработки игр LÖVE. Я хочу, чтобы вражеские юниты появлялись на одной из пяти полос и перемещались по экрану. На данный момент я могу генерировать указанные юниты и ограничивать их границами «полос». Однако я не уверен, как заставить их появляться явно на одной из пяти дорожек.
Прямо сейчас я использую math.random (), чтобы выбрать число между верхней и нижней границами полос. Размер спрайтов вражеских юнитов составляет 32x32, поэтому пять отдельных полос будут покрывать в общей сложности 160 пикселей экрана. Прямо сейчас у меня установлены границы 240 и 400 (середина высоты экрана). Как мне сгенерировать случайное число с шагом 32, чтобы враги появлялись на одной из пяти возможных полос?
РЕДАКТИРОВАТЬ: Итак, кажется, что границы на самом деле не установлены на середину. Буду пытаться вычислить координаты на нем, но если кто-то может дать мне чаевые, я буду счастлив! : D
Мой текущий рабочий код выглядит следующим образом:
-- Axis-based collision detection. Effective for rectangular units; does not work well with circles and non-quad shapes.
function CheckCollision(x1,y1,w1,h1, x2,y2,w2,h2)
return x1 < x2+w2 and
x2 < x1+w1 and
y1 < y2+h2 and
y2 < y1+h1
end
debug = true
-- Timers declared here to reference later.
createEnemyTimerMax = 0.4
createEnemyTimer = createEnemyTimerMax
-- Delcares images; will actually be established in love.load and brought out in love.draw
enemyImg = nil
enemies = {}
function love.load(arg)
enemyImg = love.graphics.newImage('assets/cat.png')
end
function love.update(dt)
if love.keyboard.isDown('escape') then
love.event.push('quit')
end
--Generates enemies.
--Create 5 if/then conditions to account for each lane?
--Conditions dependent on createEnemyTimer being < 0 and # of enemies in lane < 5
--First condition is met; how do we create the second?
--Will each lane need its own timer?
createEnemyTimer = createEnemyTimer - (.5 * dt)
if createEnemyTimer < 0 then
createEnemyTimer = createEnemyTimerMax
-- Create an enemy
randomNumber = math.random(240,400)
newEnemy = { y = randomNumber, x = 650, img = enemyImg }
table.insert(enemies, newEnemy)
end
--Updates position of enemies.
for i, enemy in ipairs(enemies) do
enemy.x = enemy.x - (200 * dt)
if enemy.x < 0 then -- remove enemies when they pass off the screen
table.remove(enemies, i)
end
end
-- Collision detection.
-- For MSJ, collision should prevent PC from moving onto enemy's square.
--[[
for i, enemy in ipairs(enemies) do
for j, bullet in ipairs(bullets) do
if CheckCollision(enemy.x, enemy.y, enemy.img:getWidth(), enemy.img:getHeight(), bullet.x, bullet.y, bullet.img:getWidth(), bullet.img:getHeight()) then
table.remove(bullets, j)
table.remove(enemies, i)
score = score + 1
end
end
if CheckCollision(enemy.x, enemy.y, enemy.img:getWidth(), enemy.img:getHeight(), player.x, player.y, player.img:getWidth(), player.img:getHeight())
and isAlive then
table.remove(enemies, i)
isAlive = false
end
end
]]
end
function love.draw(dt)
for i, enemy in ipairs(enemies) do
love.graphics.draw(enemy.img, enemy.x, enemy.y)
end
end