Почему не работает моя переменная dodgeCount?
Я написал довольно простую игру на ruby, где вы - космический челнок, и вам нужно увернуться от нескольких метеоритов. Я решил добавить счетчик уклонения, но в сообщении с предупреждением не отображается фактический счет. Вот код:
@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 ответ
@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
доступны для проверки в деталях.