Руби Госу, как начать новое время на клике

Я пытаюсь просто переместить изображение по клику с одной стороны экрана на другую. Но я не могу понять, как работать со временем. В основном мне нужно начать движение мяча после Gosu::KbReturn.

Любая помощь будет очень оценена

require 'gosu'
  def media_path(file)
    File.join(File.dirname(File.dirname(
       __FILE__)), 'media', file)
  end
    class Game < Gosu::Window

  def initialize
    @width = 800
    @height = 600
    super @width,@height,false
    @background = Gosu::Image.new(
      self, media_path('background.png'), false)
    @ball = Gosu::Image.new(
      self, media_path('ball.png'), false)
    @time = Gosu.milliseconds/1000
    @x = 500
    @y = 500
    @buttons_down = 0
    @text = Gosu::Font.new(self, Gosu::default_font_name, 20)
  end

  def update
    @time = Gosu.milliseconds/1000
  end

  def draw
    @background.draw(0,0,0)
    @ball.draw(@x,@y,0)
    @text.draw(@time, 450, 10, 1, 1.5, 1.5, Gosu::Color::RED)
  end 
  def move
    if ((Gosu.milliseconds/1000) % 2) < 100 then @x+=5 end
  end

  def button_down(id)
    move if id == Gosu::KbReturn
    close if id ==Gosu::KbEscape
    @buttons_down += 1
  end
  def button_up(id)
    @buttons_down -= 1
  end
end

Game.new.show

2 ответа

Решение

Сначала у вас есть обработчик событий клавиатуры в неправильном месте. update метод служит только в качестве обратного вызова в период update_interval, и вы обязательно должны поместить его в button_downметод экземпляра Gosu::Window.

Во-вторых, если вы вызываете метод move для обновления позиций игровых объектов, бессмысленно делать это в цикле. Вы должны просто обновить@xодин раз за звонок.

Третье ваше использование@timeпеременная экземпляра вmoveметод не имеет никакого смысла. Если вам нужно ограничить движение только по истечении некоторого времени, вы можете просто проверить превышение заданного значения таймера, fE с целым числом по модулю (с некоторым допуском): if (Gosu.milliseconds % @increment) < @epsilon then,

Обновление:обновление @xв течение 10 секунд после нажатия клавиши Enter

class Game < Gosu::Window
  def initialize
    …
    @trigger = false    # if trigger for delayed action was activated
    @start_time = 0     # saved time when trigger was started
  end

  def update
    …
    if @trigger
      if Gosu.milliseconds - @start_time < 10_000
        @x += 1           # update x-position for 10 seconds
      else
        @trigger = false  # disable trigger after timeout elapsed
      end
    end
  end

  def button_down(key)
    case key
    when Gosu::KbReturn
      @start_time=Gosu.milliseconds   # store current elapsed time
      @trigger=true                   # enable trigger
    when Gosu::KbEscape
      …
    end
  end
end

Добавленной

def update
    @x+=1 # in this method it increments every game second
end 

def move
   @x = 0
   while @x > 0
    do somemthing
   end
end

Я просто не понял, что метод обновления постоянно зацикливается

Другие вопросы по тегам