如何设置图片在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
?
不幸的是,答案是“视情况而定”。有些人的代码将对象的位置保持在一个内部 x
和 y
,使用一个 rect
来处理碰撞。其他代码只维护 rect
,如果(曾经)需要一个位置,则使用 rect.x
和 rect.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
时,您可以像 x
和 y
一样轻松调整矩形
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
也许作者认为将x
和y
分开可以使代码更容易理解。这是影响编程风格的首要原因。程序代码被读取的次数比编写的次数多很多,因此通常会包含额外的变量以更好地说明程序流程。
例如,例如检查鼠标单击事件:
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 语法,否则它是不可读的。
我在游戏中创建了一个名为“外星人”的对象。上传“外星人”的图像并使用“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
?
不幸的是,答案是“视情况而定”。有些人的代码将对象的位置保持在一个内部 x
和 y
,使用一个 rect
来处理碰撞。其他代码只维护 rect
,如果(曾经)需要一个位置,则使用 rect.x
和 rect.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
时,您可以像 x
和 y
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
也许作者认为将x
和y
分开可以使代码更容易理解。这是影响编程风格的首要原因。程序代码被读取的次数比编写的次数多很多,因此通常会包含额外的变量以更好地说明程序流程。
例如,例如检查鼠标单击事件:
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 语法,否则它是不可读的。