class Pacman::LevelRenderer

main renderer class

Public Class Methods

field_size() click to toggle source
# File lib/pacman/level_renderer.rb, line 5
def field_size
  50
end
new(window, rel_path = '') click to toggle source
# File lib/pacman/level_renderer.rb, line 18
def initialize(window, rel_path = '')
  @ghosts_renderer = GhostsRenderer.new(window, rel_path)

  # initialize graphics
  @font = Gosu::Font.new(window, 'Arial', 18)

  @field_size = 50
  @background = Gosu::Image.new(window, rel_path + 'media/bg2_2.jpg', false)
  @wall = Gosu::Image.new(window, rel_path + 'media/wall.png')
  @pellet = Gosu::Image.new(window, rel_path + 'media/pellet.png')
  @power_pellet = Gosu::Image.new(window, rel_path + 'media/power_pellet.png')

  @player_left = Gosu::Image.load_tiles(window, rel_path + 'media/pacman_left.png',
                                        50, 50, false)
  @player_right = Gosu::Image.load_tiles(window, rel_path + 'media/pacman_right.png',
                                         50, 50, false)
  @player_up = Gosu::Image.load_tiles(window, rel_path + 'media/pacman_up.png',
                                      50, 50, false)
  @player_down = Gosu::Image.load_tiles(window, rel_path + 'media/pacman_down.png',
                                        50, 50, false)

  @timer = 0
end
x_min() click to toggle source
# File lib/pacman/level_renderer.rb, line 9
def x_min
  50
end
y_min() click to toggle source
# File lib/pacman/level_renderer.rb, line 13
def y_min
  50
end

Public Instance Methods

render(level, state) click to toggle source
# File lib/pacman/level_renderer.rb, line 42
def render(level, state)
  @timer += 1

  next_frame = @timer % 5 == 0
  if next_frame
    level.player.animation_index = (level.player.animation_index + 1) %
        @player_down.size
  end

  @background.draw(0, 0, 0)

  render_objects(level, state)

  # draw player
  x_pos = LevelRenderer.x_min + level.player.x * LevelRenderer.field_size
  y_pos = LevelRenderer.y_min + level.player.y * LevelRenderer.field_size

  @ghosts_renderer.render(level, state, next_frame)

  case level.player.direction
  when :left
    @player_left[level.player.animation_index].draw(x_pos, y_pos, 1)
  when :right
    @player_right[level.player.animation_index].draw(x_pos, y_pos, 1)
  when :up
    @player_up[level.player.animation_index].draw(x_pos, y_pos, 1)
  when :down
    @player_down[level.player.animation_index].draw(x_pos, y_pos, 1)
  end

  return unless (state == :win)

  @font.draw('END', 100, 100, 1.0, 4.0, 4.0)
  score = level.pellet_count - level.pellets_left
  @font.draw("Score: #{score} / #{level.pellet_count}",
             100, 150, 1.0, 1.5, 1.5)
end

Private Instance Methods

render_objects(level, _state) click to toggle source
# File lib/pacman/level_renderer.rb, line 82
def render_objects(level, _state)
  level.each_with_position do |x, y, obj|
    x_pos = LevelRenderer.x_min + x * LevelRenderer.field_size
    y_pos = LevelRenderer.y_min + y * LevelRenderer.field_size

    case
    when obj.class == Wall
      @wall.draw(x_pos, y_pos, 1)
    when obj.class == Pellet
      @pellet.draw(x_pos, y_pos, 1)
    when obj.class == PowerPellet
      @power_pellet.draw(x_pos, y_pos, 1)
    end
  end

  return if level.ghosts.empty?
end