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

Я пытаюсь сделать относительно простую анимацию, требующую вращения эллипса на вращающемся фоне. Мне пришлось прибегнуть к небольшому обману, чтобы заставить 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 строк, но я надеюсь, что моего объяснения вам хватит, ребята. Я подумал, что надо начинать локально и работать дальше =)

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


person Louis Thibault    schedule 26.12.2012    source источник


Ответы (2)


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

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

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

person ninMonkey    schedule 26.12.2012
comment
Ах, я слишком упростил и допустил опечатки, извините! Этот последний фрагмент кода на самом деле не означает, что его нельзя воспринимать буквально, он вместо этого показывает, как все взаимосвязано. Как упоминалось в тексте, я вижу свидетельство вращающегося эллипса (изменение размера прямоугольника поверхности), но не вижу фактического эллипса. Предположим, что rotate_ellipse вызывается правильно! - person Louis Thibault; 27.12.2012

Ладно, проблема в моей ужасной глупости.

Я принял аргумент rect за pygame.draw.ellipse за center_x_coordinate, center_y_coordinate, width, height.

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

person Louis Thibault    schedule 26.12.2012