Chingu :: GameWindow上的Chingu输入属性导致异常

时间:2012-02-15 05:05:30

标签: ruby

这段代码在Chingu引起了一个非常奇怪的例外,Chingu是一个依赖于Gosu 2D游戏框架的ruby游戏库:

class StopSignAttack < Chingu::Window

  def initialize
    super(1000, 1000, false)
    self.input = { :escape => :close }
    self.caption = "Stop Sign ATTACK!!!"
    push_game_state(Start.new)
  end

end

Chingu :: Window的输入属性的值应该只是在按下转义键时关闭游戏窗口。按下转义键时窗口关闭,但是有异常炸弹:

/Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/chingu-0.8.1/lib/chingu/helpers/input_dispatcher.rb:63:in `block in dispatch_input_for': undefined method `button_down?' for nil:NilClass (NoMethodError)
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/chingu-0.8.1/lib/chingu/helpers/input_dispatcher.rb:62:in `each'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/chingu-0.8.1/lib/chingu/helpers/input_dispatcher.rb:62:in `dispatch_input_for'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/chingu-0.8.1/lib/chingu/window.rb:148:in `block in intermediate_update'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/chingu-0.8.1/lib/chingu/window.rb:148:in `each'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/chingu-0.8.1/lib/chingu/window.rb:148:in `intermediate_update'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/chingu-0.8.1/lib/chingu/window.rb:133:in `update'
    from stop_sign_attack.rb:24:in `<main>'

我尝试在Chingu :: Window中实现close方法,调用超类close方法:

  def close
    super.close
  end

按ESC键时出现此异常:

stop_sign_attack.rb:23:in `close': undefined method `close' for nil:NilClass (NoMethodError)
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/gosu-0.7.41-universal-darwin/lib/gosu/swig_patches.rb:19:in `rescue in block (2 levels) in <class:Window>'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/gosu-0.7.41-universal-darwin/lib/gosu/swig_patches.rb:12:in `block (2 levels) in <class:Window>'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/gosu-0.7.41-universal-darwin/lib/gosu/swig_patches.rb:26:in `show'
    from /Users/sams/.rvm/gems/ruby-1.9.3-p0/gems/gosu-0.7.41-universal-darwin/lib/gosu/swig_patches.rb:26:in `show'
    from stop_sign_attack.rb:28:in `<main>'

任何想法都表示赞赏。

1 个答案:

答案 0 :(得分:2)

您遗漏了一些允许某人调试此信息的信息。例如,您正在推送一个名为Start的游戏状态,但在您的示例中未声明Start类。但是你还没有分享这部分代码。我创建了以下示例项目来测试您的目标:

require 'chingu'

# A simple GameState-example
class Start < Chingu::GameState
end

class StopSignAttack < Chingu::Window

  def initialize
    super(1000, 1000, false)
    self.input = { :escape => :close }
    self.caption = "Stop Sign ATTACK!!!"
    push_game_state(Start.new)
  end

end

StopSignAttack.new.show

这很好用,当我按下逃跑时没有任何异常退出。