/ld26-basecode

To get this branch, use:
bzr branch /bzr/ld26-basecode
4 by Josh C
basecode
1
-- monkey patches for zoetrope Sprite
2
3
-- displace on a specific axis
4
function Sprite:displaceDir(other, dir)
5
   if not self.solid or self == other or not other.solid then return end
6
   if STRICT then assert(other:instanceOf(Sprite), 'asked to displace a non-sprite') end
7
8
   if other.sprites then
9
      -- handle groups
10
11
      for _, spr in pairs(other.sprites) do
12
         self:displace(spr, dir)
13
      end
14
   else
15
      -- handle sprites
16
      local dim = util.dim(dir)
17
18
      local negMove = (other[dir] - self[dir]) + other[dim]
19
      local posMove = (self[dir] + self[dim]) - other[dir]
20
21
      -- TODO: re-add hinting?
22
      if negMove < posMove then
23
         chg = - negMove
24
      else
25
         chg = posMove
26
      end
27
   end
28
29
   other[dir] = other[dir] + chg
30
end
31
32
-- don't use zoetrope physics
33
function Sprite:update(elapsed)
34
   if self.onUpdate then self:onUpdate(elapsed) end
35
end
36
37
-- directional physics
38
function Sprite:doPhysics(dir, elapsed)
39
   local vel = self.velocity
40
   local acc = self.acceleration
41
   local drag = self.drag
42
   local minVel = self.minVelocity
43
   local maxVel = self.maxVelocity
44
45
   -- check existence of properties
46
47
   if STRICT then
48
      assert(vel, 'active sprite has no velocity property')
49
      assert(acc, 'active sprite has no acceleration property')
50
      assert(drag, 'active sprite has no drag property')
51
      assert(minVel, 'active sprite has no minVelocity property')
52
      assert(maxVel, 'active sprite has no maxVelocity property')
53
      assert(dir=='x' or dir=='y' or dir=='rotation', 'direction should be x, y, or rotation')
54
   end
55
56
   vel.x = vel.x or 0
57
   vel.y = vel.y or 0
58
   vel.rotation = vel.rotation or 0
59
60
   -- physics
61
62
   if acc[dir] and acc[dir] ~= 0 then
63
      vel[dir] = vel[dir] + acc[dir] * elapsed
64
   else
65
      if drag[dir] then
66
         if vel[dir] > 0 then
67
            vel[dir] = vel[dir] - drag[dir] * elapsed
68
            if vel[dir] < 0 then vel[dir] = 0 end
69
         elseif vel[dir] < 0 then
70
            vel[dir] = vel[dir] + drag[dir] * elapsed
71
            if vel[dir] > 0 then vel[dir] = 0 end
72
         end
73
      end
74
   end
75
76
   if minVel[dir] and vel[dir] < minVel[dir] then vel[dir] = minVel[dir] end
77
   if maxVel[dir] and vel[dir] > maxVel[dir] then vel[dir] = maxVel[dir] end
78
79
   -- ugly hack for falling through floor on really slow frames
80
   if math.abs(vel[dir] * elapsed) > 32 then
81
      print('skip')
82
      return
83
   end
84
85
   if vel[dir] ~= 0 then self[dir] = self[dir] + vel[dir] * elapsed end
86
87
   if self[dir] < 0 then self[dir] = 0 end
88
   local edge = the.view.map[util.dim(dir)] - the.player[util.dim(dir)]
89
   -- TODO: take map position into account
90
   if self[dir] > edge then self[dir] = edge end
91
end