def star1():
        global angle
        x = int(math.cos(angle) * 100) + 800
        y = int(math.sin(angle) * 65) + 400
        pygame.draw.circle(screen, white, (x, y), 17)
        angle += 0.02

Параметры pygame для .draw.circle здесь позволяют использовать только цвет RGB для раскрашивания фигуры. Мне интересно, есть ли способ передать изображение в виде цвета или использовать другой метод, позволяющий разместить изображение на объекте / круге. Круги перемещаются, поэтому изображение также должно оставаться с кругом при движении.

1
Dante 22 Янв 2021 в 22:04

2 ответа

Лучший ответ
  • Создайте прозрачный pygame.Surface с помощью желаемый size

  • Нарисуйте белый круг в центре поверхности

  • Смешайте изображение (my_image) с этой поверхностью , используя режим наложения BLEND_RGBA_MIN:

size = 100
circular_image = pygame.Surface((size, size), pygame.SRCALPHA)
pygame.draw.circle(circular_image, (255, 255, 255), (size//2, size//2), size//2)
image_rect = my_image.get_rect(center = circular_image.get_rect().center)
circular_image.blit(my_image, image_rect, special_flags=pygame.BLEND_RGBA_MIN)

Минимальный пример:

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

def create_circular_image(size, image):
    clip_image = pygame.Surface((size, size), pygame.SRCALPHA)
    pygame.draw.circle(clip_image, (255, 255, 255), (size//2, size//2), size//2)
    image_rect = my_image.get_rect(center = clip_image.get_rect().center)
    clip_image.blit(my_image, image_rect, special_flags=pygame.BLEND_RGBA_MIN)
    return clip_image

def create_test_image():
    image = pygame.Surface((100, 100))
    ts, w, h, c1, c2 = 25, 100, 100, (255, 64, 64), (32, 64, 255)
    [pygame.draw.rect(image, c1 if (x+y) % 2 == 0 else c2, (x*ts, y*ts, ts, ts)) 
        for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
    return image

my_image = create_test_image()
circular_image = create_circular_image(100, my_image)

rect = circular_image.get_rect(center = window.get_rect().center)
run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * 5
    rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * 5            

    window.fill((64, 64, 64))
    window.blit(circular_image, rect)
    pygame.display.flip()

pygame.quit()
exit()

Смотрите также:

2
Rabbid76 22 Янв 2021 в 19:45

Напишите функцию, которая рисует изображение на заданном x, y и передает эти x, y значения, используемые в функции круга. В основном это просто win.blit(image, (x,y)). Не забудьте вычесть значение radius. Итак, изображение совпадает с кругом.

0
Gantulga Gantumur 22 Янв 2021 в 19:20