Я вижу здесь три потенциальных проблемы.
Во-первых, вы ждете, пока мяч не перекроет весло, прежде чем считать это касанием. Звучит так, как будто вы действительно хотите начать движение мяча в другом направлении, когда он касается мяча, а не когда он пересекает его. 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;
}
}
Вторая потенциальная проблема связана со скоростью мяча. Не видя весь код, я не знаю, является ли это проблемой или нет. Если шарик может перемещаться более чем на один пиксель за раз, он может легко перекрывать - или даже проходить - весло без обнаружения удара. Существует множество логических изменений, которые вы можете добавить, чтобы позаботиться об этом, но самое простое решение может заключаться в том, чтобы просто убедиться, что шар не перемещается более чем на один пиксель за раз.
Наконец, если вы хотите использовать взлом для обеих ракет, поменяйте знак сравнения на другой стороне игры.