summaryrefslogtreecommitdiff
path: root/enemy.lua
blob: 152cadfaa11693534a63c7d7bd1f2033a00d59ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
local Enemy = {}
local Entity = require("entity")
Enemy.__index = Enemy
setmetatable(Enemy, { __index = Entity })

function Enemy.new(spawnX, spawnY, width, height, physicsWidth, physicsHeight)
    local self = setmetatable(Entity:new(spawnX or 0, spawnY or 0, width or 16, height or 16, physicsWidth or width or 8, physicsHeight or height or 8), Enemy)
    self.isEnemy = true
    self.direction = math.random(1, 2) == 1 and 1 or -1
    self.speed = 20
    self.turnDelay = 0.35
    self.turning   = false
    self.turnTimer = 0
    return self
end

function Enemy:setWorldContext(world)
    self.world = world
    self:enablePhysics(world.physicsWorld, "dynamic")
end

function Enemy:noPathAhead()
    if not self.world then return false end

    local frontX
    if self.direction == 1 then
        frontX = self.x + self.physicsWidth * 1.5 + 1
    else
        frontX = self.x + self.physicsWidth * 0.5 - 1
    end

    local midY   = self.y + self.physicsHeight * 0.5
    local belowY = self.y + self.physicsHeight + 1

    local wallAhead  = self.world:isTileSolidAtPixel(frontX, midY)
    local floorAhead = self.world:isTileSolidAtPixel(frontX, belowY)

    return wallAhead or not floorAhead
end

function Enemy:patrolPlatform(dt)
    self:syncFromPhysicsBody()

    if self.turning then
        self.turnTimer = self.turnTimer - dt
        if self.turnTimer <= 0 then
            self.direction = self.direction * -1
            self.turning   = false
        end
        if self.body then
            local _, vy = self.body:getLinearVelocity()
            self.body:setLinearVelocity(0, vy)
        end
        return
    end

    if self:noPathAhead() then
        self.turning   = true
        self.turnTimer = self.turnDelay
    end

    if self.body then
        local _, vy = self.body:getLinearVelocity()
        self.body:setLinearVelocity(self.speed * self.direction, vy)
    end
end

function Enemy:update(dt)
    self:patrolPlatform(dt)
end

function Enemy:draw()
    --bug: texture is drawn shifted by half width to the left
    love.graphics.draw(self.texture, self.x + self.physicsWidth / 2, self.y)
end

return Enemy