Corona SDK - Как обнаружить столкновение на нефизическом теле? - PullRequest
1 голос
/ 03 февраля 2012

Мы используем объекты, которые не обязательно должны использовать физический движок, но нам все еще нужно обнаруживать столкновения. Вот пример, аналогичный тому, что мы пытаемся построить:

В пасьянсе карты - перетаскиваемые объекты. Когда они выпущены поверх другой колоды карт (столкновение), они будут «прилипать» к этой колоде. Целевые точки доступа (стопки карт) не всегда известны заранее - они динамические.

Как лучше всего подойти к этой проблеме в Corona SDK?

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Если вы не хотите использовать физический движок, вы можете кодировать приемник событий касания, чтобы проверить наличие перекрывающихся карт.Я полагаю, нет разницы в колоду карт или одной карты.

local cards={} --a list of display objects
cards[1]=display.newRect(100,100,100,100)
cards[2]=display.newRect(100,210,100,100)
cards[3]=display.newRect(100,320,100,100)

local tolerance=20 --20px radius
local cardAtPointer=0  --the index of the card stuck to user hand

local function onOverlap(self,event)
    if event.phase == "began" then
        cardAtPointer=self.index    --hold one card only    
    elseif event.phase == "moved" then
        if cardAtPointer > 0 and self.index == cardAtPointer then
            self.x,self.y = event.x,event.y     --drag card around
        end
    elseif event.phase == "ended" or event.phase == "cancelled" then
        local s=self

        for i=1,#cards do
            local t=cards[i]
            if s.index ~= t.index then  --dont compare to self
                if math.pow(tolerance,2) >= math.pow(t.x-s.x,2)+math.pow(t.y-s.y,2) then
                    print(s.index.." overlap with "..t.index)
                    break   --compare only 2 overlapping cards, not 3,4,5...
                end
            end
        end
        cardAtPointer=0     --not holding any cards
    end
end

for i=1,#cards do 
    cards[i].index=i
    cards[i].touch=onOverlap
    cards[i]:addEventListener("touch",cards[i])
end
1 голос
/ 03 февраля 2012

В функции, которая перемещает ваши карты, добавьте проверку на пересечение со стеками соответствующих карт, используя

CGRectIntersect (card, cardStack) 

, и запустите событие.(предполагая, что карточки прямоугольные).

Я также только начинаю использовать корону, нашел эту тему по теме вашего вопроса, которая может оказаться полезной:

http://developer.anscamobile.com/forum/2010/10/29/collision-detection-without-physics

...