1 回答
TA贡献1836条经验 获得超4个赞
好的,首先是对这些问题的标准回答:如果你使用PyGame Sprite函数,在最初做一些额外的工作之后,你的程序将更容易编写和维护。
要在任意对象上进行良好的碰撞,首先需要一个“边界框”。这是一个围绕您的对象的矩形。
查看施利滕/雪橇的代码,我必须从各种绘图坐标中计算出这一点(但我只是在做一个快速/粗略的工作)。它看起来像从 和 渲染扩展了另外 31 像素和 75 像素在 .您可能希望临时添加一些代码来绘制边界框以进行检查。Schlitten.xSchlitten.yxy
因此,要定义碰撞函数,我们需要一个 PyGame 矩形。
class Schlitten:
def __init__( self ):
self.x = px
self.y = py
self.width = 31
self.height = 75
self.rect = pygame.Rect( px, py, self.width, self.height )
从代码中可以看出,PyGame 矩形只需要坐标。需要随着对象的移动而更新,但我们可以在碰撞测试之前执行此操作。我们添加了,因此我们的代码不会到处都是无意义的数字。此外,如果雪橇的绘图发生变化,则只需在一个地方调整这些数字。.rectself.widthself.height
无论如何,现在对于碰撞函数:
class Schlitten:
...
def collideWith( self, other_rect ):
""" Has the sleigh collided with the other object """
self.rect.x = self.x # update the rect position
self.rect.y = self.y
collision = self.rect.colliderect( other_rect )
return collision
对类进行类似的更改 - 至少到代码具有 .Baumbaum.rect
class Baum():
def __init__( self, pos_x, pos_y, pscreen, pschlitten ):
self.x = pos_x
self.y = pos_y
self.width = 50
self.height = 95
self.rect = pygame.Rect( pos_x, pos_y, self.width, self.height )
def bewegung( self ):
self.y += 5
self.rect.y += 5
def spawn( self ):
if self.y > 600:
self.y = -50
self.x = random.randrange(0,700)
self.rect.x = x
self.rect.y = y
然后,这允许代码快速轻松地检查冲突:
alles_baumen = [ Baum1, Baum2, Baum3 ] # all tree objects
# main loop
while not exiting:
...
for baum in alles_baumen: # for each tree
baum.draw()
baum.bewegung()
baum.spawn()
if ( speiler1.collideWith( baum.rect ) ): # player hits tree?
speiler1.kollision() # Oh-noes!
注: 树绘图功能将绘制树,就好像坐标是左下角一样。我所做的更改没有考虑到这一点,因此要么更改绘图代码,要么更改 的位置以适应此负 y 布局。yBaum.rect
添加回答
举报