繁体   English   中英

PyGame rect.move 运动无法正常运行

[英]PyGame rect.move movement not functioning properly

我正在以砖块断路器克隆的形式开发我的第一个 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.rightrect.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 的新手,所以我完全不明白为什么我的逻辑有缺陷,所以非常感谢任何帮助。 谢谢

pygame.Rect.move不会改变Rect对象本身,但它会返回一个新的Rect对象(可能是该方法的名称具有误导性)。

这意味着

self.rect.move(xy[0], xy[1])

不会改变任何东西。 您必须将.move返回的矩形分配给“本身”:

self.rect = self.rect.move(xy)

或者,您可以使用pygame.Rect.move_ip() ,“就地”移动矩形并更改Rect对象:

self.rect.move_ip(xy[0], xy[1])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM