LifeOnLove
I found it a little bit metaphoric and maybe it can be handy for someone...
main.lua
1 gameObjects = require("gameObjects")
2 grids = {}
3 step = 0
4 time = 0;
5
6 function love.load(arg)
7 if arg[#arg] == "-debug" then require("mobdebug").start() end
8 grids[0] = gameObjects.Grid:new(50,35)
9 grids[1] = gameObjects.Grid:new(50,35)
10 grids[0]:init("gun_s.txt")
11 outGrid = 0
12 inGrid = 0
13 grid_switch()
14 end
15
16 function love.update(dt)
17 time = time + dt
18 if (time > 0.1) then
19 time = 0
20 grid_switch()
21 end
22 end
23
24 function love.draw()
25 love.graphics.setColor(0.085,1.0,0,0.1)
26 love.graphics.rectangle("line", 265, 50, 250, 50)
27 love.graphics.rectangle("line", 270, 55, 240, 40)
28 love.graphics.setColor(0.085,1.0,0,1.0)
29 love.graphics.print("LIFE", 375, 70);
30 grids[outGrid]:draw(150, 200, 10)
31 end
32
33 function grid_switch()
34 inGrid = step % 2
35 outGrid = (step + 1) % 2
36 step = step + 1
37 grids[outGrid]:update_from(grids[inGrid])
38 end
gameObjects.lua
1 local gameObjects = {}
2
3 -- Meta class
4 gameObjects.Grid = {w = 0, h = 0}
5
6 -- Derived class method new
7 function gameObjects.Grid:new (w,h)
8 local obj = {}
9 setmetatable(obj, gameObjects.Grid)
10 gameObjects.Grid.__index = gameObjects.Grid
11 obj.w = w or 0
12 obj.h = h or 0
13 obj.cells = {}
14 for i=1,w do
15 obj.cells[i] = {}
16 end
17 for i = 1,w do
18 for j = 1,h do
19 obj.cells[i][j] = false
20 end
21 end
22 return obj
23 end
24
25 function gameObjects.Grid:init(filename)
26 local file = io.open(filename,"r")
27 local line = file:read()
28 local j = 1
29 while line ~= nil and line ~= "" do
30 for i=1,#line do
31 local c = line:sub(i,i)
32 if (c=='1') then
33 self.cells[i][j] = true
34 else
35 self.cells[i][j] = false
36 end
37 end
38 j = j + 1
39 line = file:read()
40 end
41 io.close(file)
42 end
43
44 function gameObjects.Grid:update_from(grid)
45 for i=1,self.w do
46 for j=1,self.h do
47 self.cells[i][j] = grid:check_cell(i,j)
48 end
49 end
50 end
51
52 function gameObjects.Grid:check_cell(x,y)
53 local count = 0
54 local positions = {{x-1,y},{x+1,y},{x,y-1},{x,y+1},{x-1,y+1},{x+1,y+1},{x-1, y-1},{x+1,y-1}}
55 for i=1,8 do
56 local ok = false
57 local pos = positions[i]
58 ok = self:is_legal(pos)
59 if (ok) then
60 ok = self.cells[pos[1]][pos[2]]
61 end
62 if (ok) then
63 count = count + 1
64 end
65 end
66 if (count > 3) then
67 return false;
68 end
69 if (count < 2) then
70 return false
71 end
72 if (count == 2) then
73 return self.cells[x][y]
74 end
75 return true
76 end
77
78 function gameObjects.Grid:is_legal(pos)
79 if (pos[1] <= 1 or pos[1] > self.w) then
80 return false
81 end
82 if (pos[2] <= 1 or pos[2] > self.h) then
83 return false
84 end
85 return true
86 end
87
88 function gameObjects.Grid:draw(x,y, cellsize)
89 local fillType = "fill"
90 for i=1,self.w do
91 for j=1,self.h do
92 if (self.cells[i][j] == true) then
93 love.graphics.setColor(0.085,1.0,0,1.0)
94 fillType = "fill"
95 else
96 love.graphics.setColor(0.085,1.0,0,0.1)
97 fillType = "line"
98 end
99
100 love.graphics.rectangle(fillType, x+(i-1)*cellsize, y+(j-1)*cellsize, cellsize,cellsize)
101 end
102 end
103 love.graphics.setColor(0.085,1.0,0,1.0)
104 love.graphics.rectangle("line", x-10, y-10, self.w * cellsize + 20, self.h * cellsize + 20)
105 end
106
107 return gameObjects
gun_s.txt
1 00000000000000000000000000000000000000
2 00000000000000000000000001000000000000
3 00000000000000000000000101000000000000
4 00000000000001100000011000000000000110
5 00000000000010001000011000000000000110
6 01100000000100000100011000000000000000
7 01100000000100010110000101000000000000
8 00000000000100000100000001000000000000
9 00000000000010001000000000000000000000
10 00000000000001100000000000000000000000
11 00000000000000000000000000000000000000