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