iOS Pong Разработка, обнаружение столкновений - PullRequest
0 голосов
/ 14 января 2012

Я заканчиваю работу над своим первым приложением для iOS, которое можно использовать. Я создаю простую игру Pong, я использую простое обнаружение столкновений, используя CGRectIntersectsRect, но у меня возникла проблема.

if(CGRectIntersectsRect(mic.frame,plosina_a.frame)) {
        if(mic.center.y < (plosina_a.center.y + plosina_a.frame.size.height)) {
            RychlostMice.y = -RychlostMice.y;
        }
    }
    if(CGRectIntersectsRect(mic.frame,plosina_b.frame)) {
        if(mic.center.y < (plosina_b.center.y + plosina_b.frame.size.height)) {
            RychlostMice.y = -RychlostMice.y;
        }
    }

Когда я использую его таким образом, мяч (микрофон) попадает на весла (плозина) и начинает двигаться другим способом, вроде середины весла. Моему учителю по программированию удалось решить эту проблему для одной из лопастей (_b), добавив .frame.size.height вместо просто .frame, который я использовал ранее, но когда я сделал то же самое для другой, запустил ее не работает, я не знаю, что с этим.

Также это создает другую проблему, иногда возникает ситуация, когда мяч попадает в ракетку - поэтому я ищу определение всего объекта, а не только одной его стороны, вероятно?

Я надеюсь, что вы можете помочь.

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Я вижу здесь три потенциальных проблемы.

Во-первых, вы ждете, пока мяч не перекроет весло, прежде чем считать это касанием. Звучит так, как будто вы действительно хотите начать движение мяча в другом направлении, когда он касается мяча, а не когда он пересекает его. CGRectIntersectsRect ждет, пока они не перекрываются, прежде чем вернуть true. Если вы сделаете любой прямоугольник на один пиксель больше при вызове CGRectInset, ваш тест вернет true, как только шарик достигнет этого весла - к тому времени будет один пиксель, перекрывающий прямоугольник расширения. Тест будет выглядеть так:

if(CGRectIntersectsRect(CGRectInset(mic.frame, -1, -1),plosina_a.frame)) {
    if(mic.center.y < (plosina_a.center.y + plosina_a.frame.size.height)) {
        RychlostMice.y = -RychlostMice.y;
    }
}
if(CGRectIntersectsRect(CGRectInset(mic.frame, -1, -1),plosina_b.frame)) {
    if(mic.center.y < (plosina_b.center.y + plosina_b.frame.size.height)) {
        RychlostMice.y = -RychlostMice.y;
    }
}

Вторая потенциальная проблема связана со скоростью мяча. Не видя весь код, я не знаю, является ли это проблемой или нет. Если шарик может перемещаться более чем на один пиксель за раз, он может легко перекрывать - или даже проходить - весло без обнаружения удара. Существует множество логических изменений, которые вы можете добавить, чтобы позаботиться об этом, но самое простое решение может заключаться в том, чтобы просто убедиться, что шар не перемещается более чем на один пиксель за раз.

Наконец, если вы хотите использовать взлом для обеих ракет, поменяйте знак сравнения на другой стороне игры.

0 голосов
/ 14 января 2012

Я предполагаю, что ваш понг играется вертикально, так что одно весло находится вверху экрана, а другое внизу?

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

if(CGRectIntersectsRect(mic.frame,plosina_b.frame)) {
    if(mic.center.y > (plosina_b.center.y - plosina_b.frame.size.height)) {
        RychlostMice.y = -RychlostMice.y;
    }
}

Обратите внимание, как я использую знак> и вычитаю высоту вместо того, чтобы добавить ее.

...