Необычное поведение обнаружения столкновений с использованием Chingu - PullRequest
2 голосов
/ 29 ноября 2011

Я пробую разные способы столкновения игрока с предметом:

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') *

Спасибо.

(Источник: Рубироиды )

1 Ответ

3 голосов
/ 29 ноября 2011

К сожалению, 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?класс, который вы хотите (такой же, как Array # grep в более новой версии Ruby, но предположительно медленнее).Возможно, вы захотите записывать список экземпляров Предметов время от времени, а не каждый раз, когда хотите проверить столкновения, в зависимости от того, сколько объектов у вас в игре.

...