我试着用不同的方法把玩家和物品碰撞:

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

其中,只有第一个和最后一个有效(即我检查硬币的那些),尽管物品是硬币的父类:
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

最佳答案

不幸的是,chingu只按类记录所有gameobject实例和gameobject实例,而不是继承。chingu在这里做的是检查item.all的冲突,它是一个纯item实例数组,而不是它的子类。检查所有项实例的方法是:

@player.each_bounding_circle_collision(game_objects.of_class(Item)) do |player, item|
    puts "player collides with item"
end

然而,要知道,这是相当缓慢的,因为类的游戏对象会遍历所有的游戏对象,挑选出类的对象?您想要的类(与较新ruby版本中的array grep相同,但可能较慢)。您可能希望每隔一段时间记录一次项实例列表,而不是每次检查冲突时,这取决于游戏中有多少对象。

10-08 07:40