我在红宝石中写了一个相当简单的游戏,你是一个航天飞机,你必须躲避一些陨石。我决定放入一个闪避计数器,但警报信息并未显示实际分数。这是代码:
@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
答案 0 :(得分:0)
似乎跟踪得分的@dodgeCount
变量位于课程Ball
中,而您使用alert
在班级MyGame
中显示另一个(否则未使用的)变量。当Ruby看到一个实例变量名称(以@
开头)时,它将自动为您创建该实例变量(如果它尚不存在),因此最终得分为nil
,然后最终显示为""
(因为nil.to_s == ""
)。
还有一个问题是你有三个球,每个球都将分别跟踪得分。
您最好在要显示它的同一MyGame
班级中跟踪分数。最简单的方法是将部分代码从Ball#update
移至MyGame#update
。
您需要使用
初始化并重新设置分数@dodgeCount = 0
MyGame#initialize
和MyGame#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
的副本可供查看。