2

我正在尝试将玩家与物品碰撞的各种方式:

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

其中,只有第一个和最后一个有效(即我检查 Coin 的那些),尽管 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

4

1 回答 1

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 会遍历所有游戏对象,挑选出 kind_of? 您想要的类(实际上与较新的 Ruby 版本中的 Array#grep 相同,但可能更慢)。您可能希望每隔一段时间而不是每次要检查碰撞时都记录 Item 实例的列表,具体取决于您的游戏中有多少对象。

于 2011-11-29T16:01:10.340 回答