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]-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.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)]打印(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屋!