PyGame rect.move 运动无法正常运行 [英] PyGame rect.move movement not functioning properly

查看:116
本文介绍了PyGame rect.move 运动无法正常运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发我的第一个 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]-25self.rect.top += displayRect.center[1]+450self.draw(0)def draw(self, x):pg.draw.rect(显示,黑色,(self.rect.x,self.rect.y,61, 16))self.rect.right += x如果不是 displayRect.contains(self.rect):self.rect.right -= xdisplay.blit(self.sprite, self.rect)#来自游戏循环moveNeg, movePos = False, False为真:对于 pg.event.get() 中的事件:如果 event.type == pg.KEYDOWN:如果 event.key == pg.K_LEFT 或 event.key == pg.K_a:moveNeg = 真如果 event.key == pg.K_RIGHT 或 event.key == pg.K_d:movePos = 真如果 event.type == pg.KEYUP:如果 event.key == pg.K_LEFT 或 event.key == pg.K_a:moveNeg = 假如果 event.key == pg.K_RIGHT 或 event.key == pg.K_d:移动位置 = 假如果 moveNeg:玩家绘制(-1)如果 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)]打印(self.dir)def draw(self, xy):pg.draw.rect(显示,黑色,(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])

I am developing my first pygame application in the form of a brick breaker clone. For the player paddle, I am checking for key holds in the main game loop and then redrawing the player object's sprite every frame, as show in the code snippet below:

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)

This code works fine, and also ensures that the player paddle stays within the display bounds.

However, for the ball object, I am trying to use rect.move(x,y) to move it. I have already tried with rect.right and rect.top but the ball object is still unresponsive. Here is the code I have so far:

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)

The ball is centered when the object is initialised (as shown on lines 3/4 of the __init__ function, but I don't see why this would affect the movement of the ball's rect. Also for clarity, self.dir is used to give the ball a random starting direction, and I am aware that it is able to move upward with this current configuration.

Since I am new to pygame it completely baffles me as to why my logic is flawed so any help is much appreciated. Thanks

解决方案

pygame.Rect.move doesn't change the Rect object itself, but it returns an new Rect object (Probably the name of the method is misleading).

This means, that

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

doesn't change anything. You've to assign the rectangle which is returned by .move to "itself":

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


Alternatively you can use pygame.Rect.move_ip(), moves the rectangle "in place" and changes the Rect object:

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

这篇关于PyGame rect.move 运动无法正常运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆