2013-12-09 53 views
0

好的,問題很簡單。我如何在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之間的碰撞?

回答

0

您可以使用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()) 

表面無屬性.rectself.surface.rect),它使用方法.get_rect()self.surface.get_rect()),但collide_rect()所需的對象具有屬性不是方法。 pygame.Rect.colliderect()必填對象Rect因此您可以使用surface.get_rect()sprite.rect作爲參數。

BTW:與pygame.Rect可以檢測單點碰撞pygame.Rect.collidepoint

+0

太感謝你了!那正是我需要的! – ahk