我可以在 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 中的移动对象上使用图像而不是颜色吗?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在HitBox中移动图像? pygame

整个图像在屏幕上的移动

Pygame的图像移动

Pygame的图像移动

PyGame 游戏在幕后工作,但图像不会移动

使用 pygame 移动图像