如何设置图片在pygame中的位置?

How to set the position of an image in pygame?

我在游戏中创建了一个名为“外星人”的对象。上传“外星人”的图像并使用“get_rect()”设置其矩形属性。

现在我想改变“外星人”的x坐标值。以下两种方式,哪一种是正确的?

alien.x = ......alien.rect.x = ......

我在课本上看到使用了以下代码:

alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x 

为什么作者不直接用alien.rect.x来改变“外星人”的横坐标值呢?喜欢:

alien.rect.x = alien_width + 2 * alien_width * alien_number

为什么一定要alien.x

不幸的是,答案是“视情况而定”。有些人的代码将对象的位置保持在一个内部 xy,使用一个 rect 来处理碰撞。其他代码只维护 rect,如果(曾经)需要一个位置,则使用 rect.xrect.y

这完全取决于您,但我的建议是将其全部放在 PyGame 矩形内,因为如果您希望在轨道上使用它,它具有易于碰撞检测的优点。

class Alien:

    def __init__( self, x, y, image ):
        self.image  = image
        self.rect   = image.get_rect()  # copy the image dimensions
        self.rect.x = x
        self.rect.y = y                 # move to location

    def draw( self, window ):
        window.blit( self.image, self.rect )    # paint it

当需要移动 Alien 时,您可以像 xy

一样轻松调整矩形
class Alien:
    ...

    def moveBy( self, by_x, by_y ):
        self.rect.move_ip( by_x, by_y )

    def moveTo( self, x, y ):
        self.rect.x = x
        self.rect.y = y
    

也许作者认为将xy分开可以使代码更容易理解。这是影响编程风格的首要原因。程序代码被读取的次数比编写的次数多很多,因此通常会包含额外的变量以更好地说明程序流程。

例如,例如检查鼠标单击事件:

for event in pygame.event.get( ):
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.MOUSEBUTTONUP:
        handleGameClick( mouse2Board( event.pos ) )  # <-- HERE

添加额外的变量记录发生了什么:

    elif event.type == pygame.MOUSEBUTTONUP:
        mouse_click_coord = event.pos
        game_board_coord  = mouse2Board( mouse_click_coord )
        handleGameClick( game_board_coord )

这里它告诉 reader event.pos 是一个 坐标(所以可能是一对值),并且来自鼠标。然后它会强制将坐标转换为游戏板 space,然后再传递给 handleGameClick() 进行处理。

这两段代码的结果(可能执行速度)完全相同,但第二段代码更容易理解。

恕我直言,理想情况下应该编写代码,使不熟悉该语言的人(但仍然是程序员)可以轻松理解它。这就是为什么在我的回答中你不会看到太多“pythonic”列表循环创建,例如:

[[col +1 for col in row] for row in a]   # Taken from 10 vote answer

因为除非你非常熟悉 python 语法,否则它是不可读的。