pygame: идеальное столкновение пикселей с линиями?

У меня есть один или два проблемных вопроса. Я использую Pygame для создания игры для рисования.

У нас есть шары, прыгающие внутри на поверхности, друг против друга и стен. С помощью мыши вы можете рисовать прямые линии, по которым отскакивают шары.

Шары нарисованы с использованием pygame.image, поскольку у нас есть ball.png, покрывающий поверхность и прямоугольник шаров. Но для строк мы просто используем pygame.draw.line (), который возвращает простые прямоугольники.

И моя самая большая проблема на данный момент:

Я решил нарисовать каждую линию на отдельном объекте Surface, а затем перенести их на более крупный «игровой холст». Это потому, что я хотел использовать обнаружение идеального столкновения пикселей, предоставленное здесь, а также surfarray.array_colorkey (), и для этого мне нужна нижележащая поверхность (шары имеют изображение Surface, возвращаемое pygame.image). Мне нужна поверхность для линий, чтобы я мог использовать аспект прозрачности алгоритма столкновения, иначе шары будут отскакивать от прямоугольников, обертывающих линии.

Q1) Нет лучшего способа рисовать линии? Я хотел бы использовать что-то похожее на изображение или спрайт. Есть такое?

Q2) Если нет, как мне создать Поверхность для каждой линии, чтобы рисование линии на меньшей Поверхности с использованием координат из «игрового холста» было относительно простым, линия не обрезалась и пиксель идеальное столкновение описанный выше работает?

Q3) Если я полностью выключен / есть еще более эффективные способы делать столкновения, обнаружение, рисование и т. д. и т. д. Пожалуйста, я все уши.


person Parham    schedule 31.05.2012    source источник


Ответы (1)


Попиксельное столкновение для линии на круге - это излишне.

Информация о двумерном столкновении круга и линии: 2D столкновение между движущимся кругом и фиксированным отрезком линии

И euclid имеет Circle.intersect( Line2 ) коллизию: http://parfullydisassembled.net/euclid/point2.html#SECTION002530000000000000000

numpy может иметь лучшее решение.

person ninMonkey    schedule 31.05.2012