我正在尝试各种方式将玩家与物品相撞:
Coin.each_bounding_circle_collision(@player) do |coin, player|
puts "coin collides with player"
end
Item.each_bounding_circle_collision(@player) do |item, player|
puts "item collides with player"
end
@player.each_bounding_circle_collision(Item) do |player, item|
puts "player collides with item"
end
@player.each_bounding_circle_collision(Coin) do |player, coin|
puts "player collides with coin"
end
其中,只有第一个和最后一个有效(即我检查硬币的那个),尽管Item是Coin的父类:
class Item < Chingu::GameObject
trait :timer
trait :velocity
trait :collision_detection
trait :bounding_circle, :scale => 0.8
attr_reader :score
def initialize(options = {})
super(options)
self.zorder = Z::Item
end
end
class Coin < Item
def setup
@animation = Chingu::Animation.new(:file => "media/coin.png", :delay => 100, :size => [14, 18])
@image = @animation.first
cache_bounding_circle
end
def update
@image = @animation.next
end
end
由于我对Ruby的一般知识不足,我没有理解为什么这不起作用,也许我错过了一些明显的东西。任何帮助将不胜感激。
(由于声誉低,我不能用'chingu'标记这个,所以它会在下一个最接近的东西,'libgosu'下面)
感谢。
(资料来源:Rubyroids)
答案 0 :(得分:3)
不幸的是,Chingu只按类继续记录所有GameObject实例和GameObject实例,而不是通过继承。 Chingu在这里做的是检查Item.all的冲突,这是一个纯粹的Item实例数组,而不是它的子类。检查所有Item实例的方法是:
@player.each_bounding_circle_collision(game_objects.of_class(Item)) do |player, item|
puts "player collides with item"
end
但请注意,这很慢,因为game_objects#of_class遍历所有游戏对象,挑选出那些善良的游戏对象?你想要的类(与更新的Ruby版本中的Array#grep相同,但可能更慢)。您可能希望每隔一段时间记录一次Item实例列表,而不是每次都要检查碰撞,具体取决于您在游戏中拥有的对象数。