我可以在 Pygame 中的移动对象上使用图像而不是颜色吗?
Posted
技术标签:
【中文标题】我可以在 Pygame 中的移动对象上使用图像而不是颜色吗?【英文标题】:Can I use an image on a moving object within Pygame as opposed to to a color? 【发布时间】:2021-01-22 19:04:42 【问题描述】: 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
这里的 .draw.circle 参数 pygame 只允许使用 RGB 颜色为图形着色。我想知道是否有一种方法可以将图像作为颜色传递,或者使用其他方法允许我将图像放置在对象/圆圈上。圆圈四处移动,因此图像在移动时也需要与圆圈保持一致。
【问题讨论】:
【参考方案1】:使用所需的size
创建一个透明的pygame.Surface
在表面的中间画一个白色圆圈
使用混合模式BLEND_RGBA_MIN
在这个Surface上混合图像(my_image
):
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()
另见:
how to make circular surface in PyGame How to fill only certain circular parts of the window in PyGame? Clipping【讨论】:
【参考方案2】:编写一个在给定x, y
上绘制图像的函数,并将这些x, y
值传递给circle 函数。
基本上它只是win.blit(image, (x,y))
。不要忘记减去radius
值。所以图像与圆圈匹配。
【讨论】:
以上是关于我可以在 Pygame 中的移动对象上使用图像而不是颜色吗?的主要内容,如果未能解决你的问题,请参考以下文章