Love - Lemmings Movement
This tutorial will create the movement for an individual Lemming, it will fall to the ground and then move in one direction until it hits something it can't climb and then switch direction.
I have extended this by creating different subclasses of lemming, ones to block, explode, tunnel, bridge and so on.
I used this image for the map:
I also made this map for my extended version:
I used this image for a lemming:
Contents
Variables Required
local width = 800
local height = 800
local lemtime = 2 -- time between lemmings
local elapsed = lemtime
local maxlem = 10 -- number of lemmings to create
local lemcount = 0 -- used to count the number of lemmings created
local startx = 100 -- drop position for new lemmings
local starty = 100
Lemmings Class & List of Lemmings
Lems = {} -- a table/list for the lemmings
function Lem(x,y) -- a class for a lemming
local self = {
direction = 1, -- 1 is right -1 is left
climbheight = 4, -- the height from one pixel to another the lemming can climb
width = 10,
height = 20,
xpos = x, -- current position
ypos = y
}
function self.update(dt)
bl = self.checkground(self.xpos,self.ypos + self.height)
br = self.checkground(self.xpos + self.width,self.ypos + self.height)
if not bl and not br then -- currently in the air
self.ypos=self.ypos+1
else -- currently on the ground
local testheight = 0
local found = false
while not found and testheight <= self.climbheight do -- this tests upto four pixels for ground
if self.direction == 1 then -- if moving right check the pixel in front
frontx = self.xpos + self.width
fronty = self.ypos + (self.height) - testheight
else -- if moving left check the pixel behind
frontx = self.xpos - 1
fronty = self.ypos + (self.height) - testheight
end
if not self.checkground(frontx, fronty) then
self.xpos = self.xpos+self.direction
self.ypos = self.ypos - testheight
found=true
end
testheight = testheight + 1
end
if not found then -- the obstacle can't be climbed
self.direction = self.direction * -1 -- so change direction
end
end
end
function self.checkground(x,y) -- method used to check a pixel of the level
if mapdata:getPixel(x,y) ~= bgcolor then -- bgcolor is set in the love.load method
return true
else
return false
end
end
return self
end
Method to Create Lemming
function createlem()
if lemcount<maxlem then
Lems[lemcount] = Lem(startx,starty)
lemcount = lemcount + 1
end
end
love.load method
function love.load()
love.window.setMode(width, height)
mapdata = love.image.newImageData("level.png")
map = love.graphics.newImage(mapdata)
bgcolor = mapdata:getPixel(startx,starty)
lem = love.graphics.newImage("lemming.png")
end
love.update method
function love.update(dt)
elapsed = elapsed - dt
if elapsed <= 0 then
createlem()
elapsed=lemtime
end
for _,test in pairs(Lems )do
test.update(dt)
end
end
love.draw method
function love.draw()
love.graphics.draw(map, 0, 0)
for _,test in pairs(Lems )do
love.graphics.draw(lem,test.xpos, test.ypos)
end
end