PyGame, сделайте так, чтобы танковая пушка следовала за курсором, также хорошие практики реализации столкновений - PullRequest
1 голос
/ 18 июня 2020

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

Я нарисовал прямоугольник, который является телом танк и линия от центра прямоугольника до позиции курсора, которая должна быть орудием танка. Теперь нарисованная линия не зафиксирована, если я отведу указатель мыши от резервуара, длина линии будет следовать за курсором мыши. Вот как это выглядит: enter image description here

Понятия не имею, как сделать фиксированную длину, я сделал какую-то математическую иллюстрацию проблемы, которая может помочь: enter image description here Где A - центр танка, B - позиция мыши, R - длина орудия танка, а C - конечная точка орудия танка. . Цель состоит в том, чтобы получить C при заданных A, B и r, при этом также принимая во внимание, что расстояние между A и B может быть меньше радиуса (потому что мышь может go где угодно). Хотя я не уверен, что иллюстрация правильная, потому что возможно, что мышь может войти в круг, и, честно говоря, я запутался дальше ..

И последнее, есть ли лучший способ реализовать столкновение? Потому что мое решение состоит в том, чтобы просто сохранить координаты каждой платформы и просто выполнить инструкции if, например, следующим образом:

if playerY> platform1Y: перестать падать

if playerX> platform2X: перестать двигаться влево

if playerY

if playerX

1 Ответ

2 голосов
/ 18 июня 2020

Вы должны вычислить вектор направления от A до B . Вычислите уникальный вектор (вектор с длиной 1) и масштабируйте его до радиуса r . Добавьте вектор к точке A . Результатом является точка C.
В pygame это вычисление очень просто. Используйте pygame.math.Vector2 и операцию scale_to_length(), чтобы получить векторную форму ( V ) от A до C. Наконец, добавьте V к C:

def point_on_circle(ax, ay, bx, by, radius):
    if ax == bx and ay == by:
        return ax, ay

    A = pygame.math.Vector2(ax, ay)
    B = pygame.math.Vector2(bx, by)

    V = B - A
    V.scale_to_length(radius)

    C = A + V
    return C.x, C.y  

Вы передали центр объекта аргументам (ax, ay). Вы можете использовать pygame.Rect для вычисления центра прямоугольника. Например:

player_rect = pygame.Rect(playerX, playerY, playerWidth, playerHeight)
ax, ay = player_rect.center 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...