/ld26-basecode

To get this branch, use:
bzr branch /bzr/ld26-basecode

« back to all changes in this revision

Viewing changes to sprite.lua

  • Committer: Josh C
  • Date: 2013-04-23 16:17:44 UTC
  • Revision ID: josh@9ix.org-20130423161744-20ltahst6yf9ftcq
basecode

Show diffs side-by-side

added added

removed removed

 
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