好的,問題很簡單。我如何在pygame中只使用一部分精靈來使用矩形碰撞。直到現在,我對球員類的代碼如何在pygame中使用sprite的一個唯一部分與另一個sprite進行衝突?
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
這裏,如果玩家類與NPC發生碰撞時,它打印「你好」,但我想要的是隻打印「你好」時self.surface碰撞與NPC。 此外,是否有可能爲此使用位掩碼衝突?當我嘗試使用self.surface進行碰撞時,它給了我一個error.self.surface沒有rect屬性。)我希望collide_rect使用self.rect來檢查collisio,但顯然那不是案件。 那麼,我如何檢查self.surface和npc之間的碰撞?
太感謝你了!那正是我需要的! – ahk