class MovementComponent

Public Class Methods

new(parent, movement_style=:fourway) click to toggle source
# File lib/delve/component/movement.rb, line 6
def initialize(parent, movement_style=:fourway)
  raise 'Cannot create movement component when parent is nil' unless parent
  @parent = parent
  @style = movement_style || :fourway
  raise 'Cannot create movement component with unknown style' unless @@styles.include?(@style)
end

Public Instance Methods

east() click to toggle source
# File lib/delve/component/movement.rb, line 45
def east
  move 1, 0
end
id() click to toggle source
# File lib/delve/component/movement.rb, line 13
def id
  :movement
end
north() click to toggle source
# File lib/delve/component/movement.rb, line 41
def north
  move 0, -1
end
north_east() click to toggle source
# File lib/delve/component/movement.rb, line 26
def north_east
  raise @@diagonal_error unless diagonal_movement_is_valid
  move 1, -1
end
north_west() click to toggle source
# File lib/delve/component/movement.rb, line 21
def north_west
  raise @@diagonal_error unless diagonal_movement_is_valid
  move -1, -1
end
south() click to toggle source
# File lib/delve/component/movement.rb, line 49
def south
  move 0, 1
end
south_east() click to toggle source
# File lib/delve/component/movement.rb, line 36
def south_east
  raise @@diagonal_error unless diagonal_movement_is_valid
  move 1, 1
end
south_west() click to toggle source
# File lib/delve/component/movement.rb, line 31
def south_west
  raise @@diagonal_error unless diagonal_movement_is_valid
  move -1, 1
end
style() click to toggle source
# File lib/delve/component/movement.rb, line 17
def style
  @style
end
west() click to toggle source
# File lib/delve/component/movement.rb, line 53
def west
  move -1, 0
end

Private Instance Methods

diagonal_movement_is_valid() click to toggle source
# File lib/delve/component/movement.rb, line 58
def diagonal_movement_is_valid
  @style == :eightway
end
move(dx, dy) click to toggle source
# File lib/delve/component/movement.rb, line 62
def move(dx, dy)
  if @parent.has? :position
    pos = @parent.get :position

    if @parent.has? :collision
      col = @parent.get :collision

      if col.free?(pos.x + dx, pos.y + dy)
        pos.displace(dx, dy)
      end
    else
      pos.displace(dx, dy)
    end
  end
end