pygame中绘制的图像与给定的位置不匹配
The image drawn in pygame does not match the location it is given
大家好,我正在学习 pygame 的基础知识。
我最近 运行 遇到了一个问题;
我决定载入一张图片并在 pygame window.But 中给它一个 运行dom 位置,问题是有时它不会出现在 window 中。所以我在要加载图片的地方画了一个黑色的指针。然后我发现黑色指针与图像不重合,因此图像没有出现在我想要的位置。
所以我想帮助解决这个问题。
先感谢您。
代码:
import pygame
import random
pygame.init()
#Pygame starters
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Blob runner")
clock = pygame.time.Clock()
targetpng = pygame.image.load("target.png")
#Quit checker
crashed = False
#COLOURS
white = (255, 255, 255)
black = (0, 0, 0)
def draw_environment(x,y):
game_display.fill(white)
#Image
game_display.blit(targetpng,(x, y))
#Black pointer
pygame.draw.circle(game_display, black, (x, y), 5 )
pygame.display.update()
x, y = random.randrange(0,display_width), random.randrange(0,display_height)
while not crashed:
for event in pygame.event.get():
if event.type == pygame.QUIT:
crashed = True
# print(event)
draw_environment(x,y)
clock.tick(30)
pygame.quit()
quit()
图片:
图像有尺寸。图片可能会出现在右侧或底部的 window 之外。 blit
的原点将图像的 左上角 角放在指定位置。
如果您希望图像以 (x, y) 为中心,则必须获得具有图像大小的 pygame.Rect
(get_rect
) 并将矩形的中心设置到指定位置(关键字参数)。使用矩形指定 blit
操作的位置。
img_rect = targetpng.get_rect(center = (x, y))
game_display.blit(targetpng, img_rect)
图片有尺寸,因此图片的随机位置必须在 [image_size/2、window_sizw - image_size/2][=34 范围内=].
一个pygame.Surface
的宽高可以通过get_width()
/get_height()
或者get_size()
得到。例如:
img_size = targetpng.get_size()
x = random.randrange(img_size[0]//2, display_width - img_size[0]//2)
y = random.randrange(img_size[1]//2, display_height - img_size[1]//2)
我现在明白@Rabbid76 提供的见解出了什么问题。
问题是我在 paint 中绘制了图片,然后在 gimp 中打开文件,将图像中的白色转换为 alpha(类似棋盘的背景)。但是当我没有清除不需要的 alpha 时出现了问题,因为我认为计算机不会识别 alpha 但事实上它可以。
所以当我加载图像时,图像的角不是实际 "target spot" 而是整个图像的角,因此角将在 alpha 上。黑点一直指向图像的一角,有时不显示图像,因为角太靠近边框,图像会侵入window未显示的部分。
因此解决方法是将 alpha 或白色背景清除到最小,然后才将其转换为 alpha。然后像@Rabbid76 说的那样做 :D.
大家好,我正在学习 pygame 的基础知识。 我最近 运行 遇到了一个问题; 我决定载入一张图片并在 pygame window.But 中给它一个 运行dom 位置,问题是有时它不会出现在 window 中。所以我在要加载图片的地方画了一个黑色的指针。然后我发现黑色指针与图像不重合,因此图像没有出现在我想要的位置。 所以我想帮助解决这个问题。 先感谢您。 代码:
import pygame
import random
pygame.init()
#Pygame starters
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Blob runner")
clock = pygame.time.Clock()
targetpng = pygame.image.load("target.png")
#Quit checker
crashed = False
#COLOURS
white = (255, 255, 255)
black = (0, 0, 0)
def draw_environment(x,y):
game_display.fill(white)
#Image
game_display.blit(targetpng,(x, y))
#Black pointer
pygame.draw.circle(game_display, black, (x, y), 5 )
pygame.display.update()
x, y = random.randrange(0,display_width), random.randrange(0,display_height)
while not crashed:
for event in pygame.event.get():
if event.type == pygame.QUIT:
crashed = True
# print(event)
draw_environment(x,y)
clock.tick(30)
pygame.quit()
quit()
图片:
图像有尺寸。图片可能会出现在右侧或底部的 window 之外。 blit
的原点将图像的 左上角 角放在指定位置。
如果您希望图像以 (x, y) 为中心,则必须获得具有图像大小的 pygame.Rect
(get_rect
) 并将矩形的中心设置到指定位置(关键字参数)。使用矩形指定 blit
操作的位置。
img_rect = targetpng.get_rect(center = (x, y))
game_display.blit(targetpng, img_rect)
图片有尺寸,因此图片的随机位置必须在 [image_size/2、window_sizw - image_size/2][=34 范围内=].
一个pygame.Surface
的宽高可以通过get_width()
/get_height()
或者get_size()
得到。例如:
img_size = targetpng.get_size()
x = random.randrange(img_size[0]//2, display_width - img_size[0]//2)
y = random.randrange(img_size[1]//2, display_height - img_size[1]//2)
我现在明白@Rabbid76 提供的见解出了什么问题。
问题是我在 paint 中绘制了图片,然后在 gimp 中打开文件,将图像中的白色转换为 alpha(类似棋盘的背景)。但是当我没有清除不需要的 alpha 时出现了问题,因为我认为计算机不会识别 alpha 但事实上它可以。
所以当我加载图像时,图像的角不是实际 "target spot" 而是整个图像的角,因此角将在 alpha 上。黑点一直指向图像的一角,有时不显示图像,因为角太靠近边框,图像会侵入window未显示的部分。
因此解决方法是将 alpha 或白色背景清除到最小,然后才将其转换为 alpha。然后像@Rabbid76 说的那样做 :D.