为什么我的dodgeCount变量不起作用?

时间:2013-08-25 12:30:08

标签: ruby libgosu

我在红宝石中写了一个相当简单的游戏,你是一个航天飞机,你必须躲避一些陨石。我决定放入一个闪避计数器,但警报信息并未显示实际分数。这是代码:

@dodgeCount = 0
require 'gosu'

class  MyGame < Gosu::Window
  def initialize
    super(600, 400, false)
    @player1 = Player.new(self)
    @balls = 3.times.map {Ball.new(self)} 
    @running = true
  end

  def update
    if @running
      if button_down? Gosu::Button::KbLeft
        @player1.move_left
      end

      if button_down? Gosu::Button::KbRight
        @player1.move_right
      end

      if button_down? Gosu::Button::KbUp
        @player1.move_up
      end

      if button_down? Gosu::Button::KbDown
        @player1.move_down
      end

      @balls.each {|ball| ball.update} 

      if @player1.hit_by? @balls
        stop_game!
        alert "Your score is " + @dodgeCount.to_s
      end
    else
      #the game is now stopped
      if button_down? Gosu::Button::KbEscape
        restart_game
      end
    end
  end

  def draw
    @player1.draw
    @balls.each {|ball| ball.draw}
  end

  def stop_game!
    @running = false
  end

  def restart_game
    @running = true
    @balls.each {|ball| ball.reset!}
  end
end

class Player
  def initialize(game_window)
    @game_window = game_window
    @icon = Gosu::Image.new(@game_window, "gosu/player1.png", true)
    @x = 50
    @y = 330
  end

  def draw
    @icon.draw(@x, @y, 1)
  end

  def move_left
    if @x < 0
      @x = 0
    else
      @x = @x - 10
    end
  end

  def move_right
    if @x > (@game_window.width - 75)
      @x = @game_window.width - 75
    else
      @x = @x + 10
    end
  end

  def move_up
    if @y < 0
      @y = 0
    else
      @y = @y - 10
    end
  end

  def move_down
    if @y > (@game_window.height - 75)
      @y = @game_window.height - 75
    else
      @y = @y + 10
    end
  end

  def hit_by? (balls)
    balls.any? {|ball| Gosu::distance(@x, @y, ball.x, ball.y) < 50}
  end
end

class Ball
  def initialize(game_window)
    @game_window = game_window
    @icon = Gosu::Image.new(@game_window, "gosu/asteroid.png", true)
    reset!
  end

  def update
    if @y > @game_window.height
      reset!
      @dodgeCount = @dodgeCount + 1
    else
      @y = @y + 10
    end
  end

  def draw
    @icon.draw(@x, @y, 2)
  end

  def x
    @x
  end

  def y 
    @y
  end

  def reset!
    @y = 0
    @x = rand(@game_window.width)
  end

end

 window = MyGame.new
 window.show

1 个答案:

答案 0 :(得分:0)

似乎跟踪得分的@dodgeCount变量位于课程Ball中,而您使用alert在班级MyGame中显示另一个(否则未使用的)变量。当Ruby看到一个实例变量名称(以@开头)时,它将自动为您创建该实例变量(如果它尚不存在),因此最终得分为nil,然后最终显示为""(因为nil.to_s == "")。

还有一个问题是你有三个球,每个球都将分别跟踪得分。

您最好在要显示它的同一MyGame班级中跟踪分数。最简单的方法是将部分代码从Ball#update移至MyGame#update

您需要使用

初始化并重新设置分数
@dodgeCount = 0

MyGame#initializeMyGame#restart_game

您目前在MyGame#update中的位置,@balls.each {|ball| ball.update}添加代码以检测闪避,并跟踪分数:

@balls.each do |ball| 
  ball.update
  if ball.y > height
    ball.reset!
    @dodgeCount = @dodgeCount + 1
  end
end

Ball#update已简化:

def update
  @y = @y + 10
end

我希望这适合您,我没有gosu的副本可供查看。