module AdventureRL::Modifiers::Gravity

Constants

DEFAULT_GRAVITY_SETTINGS

include AdventureRL::Modifiers::Velocity # NOTE: This modifier relies on Modifiers::Velocity

Public Class Methods

new(settings = {}) click to toggle source
Calls superclass method
# File lib/AdventureRL/Modifiers/Gravity.rb, line 14
def initialize settings = {}
  @settings          = DEFAULT_GRAVITY_SETTINGS.merge settings
  @gravity           = 0.0
  @gravity_force     = @settings.get :gravity_force
  @gravity_direction = @settings.get :gravity_direction
  #@max_velocity = @max_velocity_original.dup
  super @settings
  @max_velocity_original[:y] = Float::INFINITY
  @max_velocity[:y]          = @max_velocity_original[:y].dup
  @velocity_decay[:y]        = 0
end

Public Instance Methods

gravitize() click to toggle source

Apply gravitational force.

# File lib/AdventureRL/Modifiers/Gravity.rb, line 27
def gravitize
  previous_position = get_position.dup
  get_gravity_directions.each do |axis, multiplier|
    next  if (@has_increased_velocity_for[axis])
    set_position axis => (get_position(axis) + multiplier)  unless (multiplier == 0)
    if (in_collision?)
      @velocity[axis] = 0.0
    else  #if ([0, @gravity_direction[axis].sign].include? get_velocity(axis).sign)
      increase_velocity_by(
        axis => ((@gravity_force * @gravity_direction[axis]) * @velocity_deltatime.dt),
        no_quick_turn_around: true
      )
    end
    set_position previous_position
  end
end
move() click to toggle source

Overwrite Modifiers::Velocity#move, so we can update the gravity.

Calls superclass method
# File lib/AdventureRL/Modifiers/Gravity.rb, line 46
def move
  super
  gravitize
end

Private Instance Methods

get_gravity_directions() click to toggle source
# File lib/AdventureRL/Modifiers/Gravity.rb, line 53
def get_gravity_directions
  return @gravity_direction.select do |axis, value|
    next value != 0
  end
end