在pygame中,如何检查精灵的一部分与另一个精灵之间的碰撞?

2024-06-16 11:06:05 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,问题很简单。如何在pygame中仅对精灵的一部分使用矩形碰撞。到目前为止,我有玩家类的代码

class Player(sprite.Sprite):        #player object class
def __init__(self,x,y):
    sprite.Sprite.__init__(self)
    #Groups for Movements
    self.dx,self.dy,self.frame= 0,0,0
    self.vel,self.cushion = 15,5
    self.vmap,self.rvel,self.vrmap=0.7*self.vel,self.vel*2.5,self.vel*2.5*0.5
    self.mapx,self.mapy = 0,0
    self.oldx,self.oldy = 0,0
    self.collide,self.running=False,False
    self.Sback,self.Sfront,self.Sleft,self.Sright = [],[],[],[]
    self.Wfront,self.Wback,self.Wright,self.Wleft=[],[],[],[]
    self.Rfront,self.Rback,self.Rleft,self.Rright=[],[],[],[]
    self.CWfront,self.CWback,self.CWleft=[20,26,1],[7,13,1],[33,39,1]
    self.CRfront,self.CRback,self.CRleft=[14,20,1],[1,7,1],[27,33,1]
    self.Wfront = self.loadimages(self.Wfront,self.CWfront)
    self.Wleft = self.loadimages(self.Wleft,self.CWleft)
    self.Wback = self.loadimages(self.Wback, self.CWback)
    self.Rback=self.loadimages(self.Rback,self.CRback)
    self.Rleft=self.loadimages(self.Rleft, self.CRleft)
    self.Rfront=self.loadimages(self.Rfront, self.CRfront)
    for i in range(0,len(self.Wleft)):
        img =transform.flip(self.Wleft[i],True,False)
        self.Wright.append(img)
    for i in range(0,len(self.Rleft)):
        img =transform.flip(self.Rleft[i],True,False)
        self.Rright.append(img)
    self.Sfront.append(image.load('lib/Images/Fair as Ice/13.gif').convert())
    self.Sleft.append(image.load('lib/Images/Fair as Ice/26.gif').convert())
    self.Sback.append(image.load('lib/Images/Fair as Ice/0.gif').convert())
    self.Sright.append(transform.flip(self.Sleft[0],True,False))
    self.stillimg = self.Sfront
    self.image = self.Sfront[0] #BY DEFAULT, PLAYER WILL HAVE THIS IMAGE(STAND LOOK FRONT)
    self.imagerect=self.image.get_rect()
    self.surface=Surface([self.imagerect.w,self.imagerect.h/3.5]) #surface for collision
    self.rect = self.surface.get_rect()
    self.imagerect.x,self.imagerect.y = x,y

def update(self):        #function is executed every frame by objlst group
    if self.running:
        self.vmap=self.vrmap
    else:
        self.vmap=self.vel*0.9
    if self.input() != 1 or self.input() != 2 or self.input() != 3 or self.input() != 4:
        self.frame+=1
        if self.input() ==1 and self.collide==False:        #checking return value of keyboard input to scroll
                                                            #map and animate player and check if player is colliding
                                                            #with anything
            self.mapx-=self.vmap
            self.stillimg = self.Sleft
        elif self.input()==2 and self.collide==False:
            self.mapx+= self.vmap
            self.stillimg = self.Sright
        elif self.input()==3 and self.collide==False:
            self.mapy -= self.vmap
            self.stillimg=self.Sback
        elif self.input()==4 and self.collide==False:
            self.mapy += self.vmap
            self.stillimg=self.Sfront
    if self.input()==0:
        self.frame=0
        self.image = self.stillimg[self.frame]
    self.oldx,self.oldy=self.imagerect.x,self.imagerect.y   #FOR COLLISION
    self.input()        #taking keyboard value
    if self.imagerect.x<self.mapx+self.cushion and self.collide==False:
        self.imagerect.x=self.mapx+self.cushion
    if self.imagerect.y<self.mapy+self.cushion and self.collide==False:
        self.imagerect.y=self.mapy+self.cushion
    if self.imagerect.x>=self.mapx+scrw-self.imagerect.w and self.collide==False:
        self.imagerect.x=self.mapx+scrw-self.cushion-self.imagerect.w
    if self.imagerect.y>self.mapy+scrh and self.collide==False:
        self.imagerect.y=self.mapy+scrh
    self.imagerect.x += self.dx
    self.imagerect.y += self.dy
    self.rect.x,self.rect.y=self.imagerect.x,self.imagerect.y+2.5*self.imagerect.h/3.5
    #INSERT COLLISION DETECTION HERE:
    for npc in downLayer or upLayer: #downayer and upLayer are sprite groups
        if sprite.collide_rect(self, npc):
            print('hello!')
    self.dx,self.dy=0,0

在这里,如果player类与NPC发生冲突,它将打印“hello”,但是我只想在自表面与NPC相撞。 另外,是否可以为此使用位掩码冲突?在

当我尝试使用自表面对于碰撞,它给了我一个error.self.surface没有rect属性。)我希望collide\u rect使用自校正为了克里希奥,但显然不是这样。 那么,如何检查自表面那npc呢?在


Tags: andrectimageselffalseinputifappend
1条回答
网友
1楼 · 发布于 2024-06-16 11:06:05

您可以使用pygame.Rect.colliderect(Rect)

# self.surface.get_rect().collidrect(another_rectangle)

self.surface.get_rect().collidrect(npc.rect)


self.surface.get_rect().collidrect(another_surface.get_rect())
self.surface.get_rect().collidrect(some_sprite.rect)
self.surface.get_rect().collidrect(pygame.Rect(x,y,width,height))

another_surface.get_rect().collidrect(self.surface.get_rect())
some_sprite.rect.collidrect(self.surface.get_rect())
pygame.Rect(x,y,width,height).collidrect(self.surface.get_rect())

Surface没有属性.rectself.surface.rect),它使用方法.get_rect()self.surface.get_rect()),但collide_rect()所需的对象具有属性而不是方法。pygame.Rect.colliderect()必需的对象Rect,因此可以使用surface.get_rect()或{}作为参数。在

顺便说一句:使用pygame.Rect可以检测到与单点的碰撞pygame.Rect.collidepoint

相关问题 更多 >