所以你有一个图像,需要绘制到一个特定的位置。因此,不要“硬编码”(500, 0),而是开始将其存储在变量中。
PyGame Rect 类非常适合这个,因为它也可以与blit() 函数一起使用,并且已经有一堆handy collision functions。
您可以创建一个 Rect,只需向图像询问其 Rect - 除非它位于 (0,0),因为图像没有位置概念。
castle_image = pygame.image.load('castle.png').convert_alpha()
castle_image = pygame.transform.scale(castle_image, (100, 100))
castle_rect = castle_image.get_rect()
castle_rect.topleft = ( 500, 0 )
screen.blit( castle_image, castle_rect )
所以现在变量castle_rect 将类似于[ x=500, y=0, width=100, height=100 ]
要移动图片的绘制位置,现在只需调整castle_rect的坐标,例如:
castle_rect.x += 10
castle_rect.y += 100
screen.blit( castle_image, castle_rect )
或者,通过再次重置其坐标来移动整个图像:
castle_rect.topleft = ( 200, 200 )
screen.blit( castle_image, castle_rect )
更有效的方法是在启动时加载和缩放图像一次,然后将它们全部绘制在当前矩形位置的主循环内。
def loadImageWithScale( image_filename, size=(100,100) ):
""" Load the given image file, then rescale the image to size """
new_image = pygame.image.load( image_filename ).convert_alpha()
new_image = pygame.transform.scale( new_image, size )
return new_image
def getImageRectAt( image, position ):
return image.get_rect( topleft=position )
# Load images
enemy_castle = loadImageWithScale( 'castle.png' )
enemy_sorcerer = loadImageWithScale( 'sorcerer.png' )
player_castle = loadImageWithScale( 'castle.png' )
# Set initial positions
enemy_castle_rect = getImageRectAt( enemy_castle, ( 0, 500 ) )
enemy_sorceror_rect = getImageRectAt( enemy_sorceror, ( 400, 0 ) )
player_castle_rect = getImageRectAt( player_castle, ( 500, 0 ) )
### Main Loop
clock = pygame.time.Clock()
exiting = False
while not exiting:
# Handle user-input
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
exiting = True
# Update the window, but not more than 60fps
window.fill( ( 128, 128, 128 ) )
window.blit( enemy_castle, enemy_castle_rect )
window.blit( enemy_sorceror, enemy_sorceror_rect )
window.blit( player_castle, player_castle_rect )
pygame.display.flip()
# Clamp FPS
clock.tick_busy_loop( 60 )
pygame.quit()
可能当你得到更多的屏幕元素时,你可以将它们排列成方便的列表,以使绘图代码更简洁。