好吧,问题很简单。如何在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呢?在
您可以使用pygame.Rect.colliderect(Rect)
Surface没有属性}作为参数。在
.rect
(self.surface.rect
),它使用方法.get_rect()
(self.surface.get_rect()
),但collide_rect()
所需的对象具有属性而不是方法。pygame.Rect.colliderect()
必需的对象Rect
,因此可以使用surface.get_rect()
或{顺便说一句:使用
pygame.Rect
可以检测到与单点的碰撞pygame.Rect.collidepoint
相关问题 更多 >
编程相关推荐