我正在以打砖块克隆的形式开发我的第一个pygame应用程序。对于玩家桨,我正在检查主游戏循环中的按键保持力,然后每帧重新绘制玩家对象的精灵,如下面的代码片段所示:
class Player():
def __init__(self):
self.sprite = pg.transform.scale(pg.image.load('49-Breakout-Tiles.png'), (61,16))
self.rect = self.sprite.get_rect()
self.rect.right += displayRect.center[0]-25
self.rect.top += displayRect.center[1]+450
self.draw(0)
def draw(self, x):
pg.draw.rect(display, black, (self.rect.x, self.rect.y, 61, 16))
self.rect.right += x
if not displayRect.contains(self.rect):
self.rect.right -= x
display.blit(self.sprite, self.rect)
#from gameloop
moveNeg, movePos = False, False
while True:
for event in pg.event.get():
if event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT or event.key == pg.K_a:
moveNeg = True
if event.key == pg.K_RIGHT or event.key == pg.K_d:
movePos = True
if event.type == pg.KEYUP:
if event.key == pg.K_LEFT or event.key == pg.K_a:
moveNeg = False
if event.key == pg.K_RIGHT or event.key == pg.K_d:
movePos = False
if moveNeg:
player.draw(-1)
if movePos:
player.draw(1)
此代码可以正常工作,还可以确保玩家的操纵杆停留在显示范围之内。
但是,对于球形物体,我试图使用rect.move(x,y)
移动它。我已经尝试过使用rect.right
和rect.top
,但是球形物体仍然没有响应。这是我到目前为止的代码:
class Ball():
def __init__(self):
self.sprite = pg.transform.scale(pg.image.load('58-Breakout-Tiles.png'), (16, 16))
self.rect = self.sprite.get_rect()
self.rect.x += displayRect.center[0]
self.rect.y += displayRect.center[1]
self.dir = [random.uniform(-1.0,1.0), random.uniform(-1.0,1.0)]
print(self.dir)
def draw(self, xy):
pg.draw.rect(display, black, (self.rect.x, self.rect.y, 16, 16))
self.rect = self.rect.move(xy[0], xy[1])
display.blit(self.sprite, self.rect)
初始化对象时,球居中(如__init__
函数的3/4行所示,但我不明白为什么这会影响球rect
的运动。同样为清楚起见,self.dir
用于给球提供随机的起始方向,我知道它可以在当前配置下向上移动。
由于我是pygame的新手,因此我完全无法理解为什么我的逻辑存在缺陷,因此非常感谢您的帮助。 谢谢
答案 0 :(得分:3)
pygame.Rect.move
不会更改Rect
对象本身,但是会返回一个新的Rect
对象(方法的名称可能会引起误解)。
这意味着,
self.rect.move(xy[0], xy[1])
没有任何改变。您必须将.move
返回的矩形分配给“自身”:
self.rect = self.rect.move(xy)