Почему не появляется эллипс на моей поверхности?

Я пытаюсь сделать относительно простую анимацию, которая требует вращения эллипса на вращающемся фоне. Мне пришлось прибегнуть к хитрости, чтобы получить pygame.transform.rotate чтобы хорошо играть с поверхностями, которые я пытаюсь вращать. А именно, я сделал эту функцию, которая перецентрирует новый прямоугольник, полученный из функции вращения Pygame:

def recenter(orig_rect, rotated_surf):
    oldcenter = orig_rect.center

    rotRect = rotated_surf.get_rect()
    rotRect.center = oldcenter

    screen.blit(rotated_surf, rotRect)

Функционирование довольно очевидно. Я понимаю, что оригинальная (не повернутая) поверхность остается на дисплее, но это не является проблемой. Не беспокойся об этом.

Вышеупомянутая функция используется вращающимися функциями (фон и эллипс) как таковые:

# width, height, screen are globals
def rotate_background(surf, speed, t0):
    new_angle = ((pygame.time.get_ticks() - t0) * (speed / 1000)) % 360

    w, h = surf.get_size()
    blittedRect = screen.blit(surf, (width / 2 - w / 2, height / 2 - h / 2))
    recenter(blittedRect, pygame.transform.rotate(surf, new_angle))

    return surf


def rotate_ellipse(surf, coords, speed, t0):
    new_angle = ((pygame.time.get_ticks() - t0) * (speed / 1000)) % 360
    if new_angle > 90:
        new_angle = 90  # limit rotation

    w, h = surf.get_size()
    x, y = coords
    blittedRect = screen.blit(surf, (width / 2 - w / 2 + x, height / 2 - h / 2 + y))
    recenter(blittedRect, pygame.transform.rotate(surf, new_angle))

Эти функции вращения называются по одной для каждого кадра.

Вот упрощенная версия моего основного игрового цикла. Обратите внимание, что это не фактический производственный код, а служит иллюстрацией того, как вышеуказанные элементы (которые взяты непосредственно из базы кода) связаны друг с другом:

ellipse = create_ellipse()  # returns a surf
background = create_background()  # returns a surf

while True:
    rotate_background()
    rotate_ellipse()
    pygame.display.flip()

Слово о background а также ellipse Переменные выше. Обе переменные содержат pygame.Surface экземпляр, на котором вещи были нарисованы. Я не буду вдаваться в подробности о background так как это работает нормально. В create_ellipse эллипс был нарисован на ellipse поверхность с помощью pygame.draw.ellipse в желтом. Перед этим, ellipse.fill(GREEN) назывался. Цветная клавиша для ellipse также был установлен на GREEN чтобы убедиться, что вся поверхность прозрачна, за исключением того, где был нарисован желтый эллипс.

Проблема: я не вижу эллипс

Я закомментировал ellipse.set_colorkey чтобы убедиться, что эллипс был должным образом свернут. Это. Я вижу зеленый прямоугольник, который изменяется в размерах при вращении эллипса. Это привело меня к выводу, что на самом деле нарисован эллипс, поскольку его можно вращать.

Что дает? Я могу предоставить полный код, если это может быть полезно. Всего около 200 строк, но я надеюсь, что моего объяснения, приведенного выше, будет достаточно для вас, ребята. Я решил, что мы должны начать локально и работать наружу =)

Большое спасибо заранее!

2 ответа

Решение

Итак, проблема в моей страшной глупости.

Я ошибся rect аргумент в пользу pygame.draw.ellipse как существо center_x_coordinate, center_y_coordinate, width, height,

Я изменил свои звонки на pygame.draw.ellipse и теперь все работает прекрасно.

while True:
    rotate_background()
    rotate_ellipse
    pygame.display.flip()

rotate_elipse() Не вызывается и не имеет аргументов. Если это опечатка, используйте распечатку, чтобы проверить, что elipse вспыхивает там, где вы ожидаете. Может быть, математика не так?

Вы можете упростить такие вещи, как width/2 эквивалентно rect.centerx

Другие вопросы по тегам