2017-12-03 2 views
1

내 게임에 두 개의 스프라이트를 만들려고합니다. 하나는 Player1이고 다른 하나는 Player2입니다. 따라서 매우 유사한 속성을 갖게됩니다. 내 Player1 클래스에 대해 가지고있는 모든 메소드를 어떻게 사용할 수 있는지 알아 내려고 노력 중입니다. Player2 클래스입니다. 내 Player2 클래스를 만들 때다른 클래스에서 한 클래스의 메서드를 사용합니까?

class Player2(pygame.sprite.Sprite): 
    def __init__(self): 
     Player1.__init__(self) 
     self.rect.x = 400 
     self.walkImages = ["p2 walk/Run (1).png", "p2 walk/Run (2).png", "p2 walk/Run (3).png", "p2 walk/Run (4).png", "p2 walk/Run (5).png", "p2 walk/Run (6).png", "p2 walk/Run (7).png", 
         "p2 walk/Run (8).png"] 

     self.idleImages = ["p2 idle/Idle (1).png", "p2 idle/Idle (2).png", "p2 idle/Idle (3).png", "p2 idle/Idle (4).png", "p2 idle/Idle (5).png", "p2 idle/Idle (6).png", "p2 idle/Idle (7).png", 
         "p2 idle/Idle (8).png", "p2 idle/Idle (9).png", "p2 idle/Idle (10).png"] 

    def update(Player1, blocksGroup): 
     pass 

, 나는 Player1에서 상속합니다. 그러나, 내 업데이트 방법으로 이론적으로 Player1 동일합니다. Player1의 업데이트 방법을 어떻게 사용합니까? 여기

Player1의 업데이트 방법 : Player1에서

def update(self, blocksGroup): 
    self.gravity() 

    if self.velx == 0: 
     self.walkFrame = 1 
     self.idleFrame += 1 
     if self.idleFrame == 42: 
      self.idleFrame = 0 

     if self.idleFrame % 3 == 0: 
      self.image = pygame.image.load(self.idleImages[self.idleFrame // 3]) 
      if self.direction == "left": 
       self.image = pg.transform.flip(self.image, True, False) 


    #Block collision 

    self.rect.x += self.velx 
    block_hit_list = pygame.sprite.spritecollide(self, blocksGroup, False) 
    for block in block_hit_list: 
     if self.velx > 0: 
      self.rect.right = block.rect.left 
     elif self.velx < 0: 
      self.rect.left = block.rect.right 

    self.rect.y += self.vely 
    block_hit_list = pygame.sprite.spritecollide(self, blocksGroup, False) 
    for block in block_hit_list: 
     if self.vely > 0: 
      self.rect.bottom = block.rect.top 
      self.jumps = 2 
     elif self.vely < 0: 
      self.rect.top = block.rect.bottom 
+0

'Player2'가'Player1'에서 [s]를 상속한다고 말하면, 표시된 코드가 일치하지 않습니다. 아마도'class Player2 (Player1)'을 원할 것입니다. 문제를 해결하는보다 자연스러운 방법은 공통 부분을 두 플레이어가 상속 할 수있는 기본 클래스로 이동하는 것입니다. – Blckknght

+0

당신이 실제로 같은 클래스의 두 개의 다른 인스턴스를 원한다고합니다. 하나는 플레이어 1의 이미지이고 다른 하나는 플레이어 2의 이미지입니다.이 가정은 맞습니까? BTW, 업데이트 방법에서 하드 디스크의 이미지를로드하지 마십시오. 글로벌 범위 또는 다른 모듈에서이를 수행하고 클래스에서 참조하십시오. – skrx

답변

3

당신은 정말 당신이 좋은 이유는 내가 PlayerBase라는 기본 클래스를 만드는 것을 사용하는 것을 제안 할이 가정 Player1Player2 클래스 다른 어떻게 말했지만하지 않은이 두 가지 다른 클래스를위한 기본 클래스처럼.

이렇게하면 행동을 공유하고 각 하위 클래스의 메소드에서 차이점 만 구현해야한다는 점을 분명하게 알 수 있습니다.

두 클래스를 사용하는 것에 대한 "좋은 이유가 있다고 가정"한 이유는 그 중 유일한 차이가 포함 된 데이터 인 경우 (예 : 두 클래스를 가질 필요가 없기 때문입니다) - 대신에 (단일) 클래스의 __init__() 메서드를 정의하여이 데이터를 제공하는 인수를 받아들이고 기본적으로 모든 일반 메서드에 전달되는 self 인수를 통해 클래스 인스턴스 데이터로 필요한 경우 저장합니다.

위키피디아의 기사에서 Object-oriented Programming (OOP)에 관한 섹션이 있습니다. 두 섹션의 차이점을 설명합니다.이 두 섹션의 차이점을 통해 작업 할 때 더 많은 정보를 얻을 수 있습니다.

+0

첫 번째 문장은 또 다른 가능한 해결책을 제안합니다. 두 개의'PlayerX' 클래스가 실제로 필요할 수도 있고, 둘 다 동일한 클래스의 인스턴스가 될 수도 있습니다 (전달 된 여러 인수로 인해 차이가있을 수 있음). – Blckknght

+0

@Blckknght : 바로 그 이유가 제가 약간 말한 것을 헷지하고 "당신이 좋은 이유가 있다고 가정하면"(두 개의 분리 된 클래스를 갖는 것에 대해) 썼습니다.나는 사람들이 단순히 하나의 클래스 내에 다른 속성 값을 저장하고 (인스턴스의 동작을 제어하기 위해 그것을 사용하여) 처리 할 수있는 무언가가있을 때마다 별도의 클래스가 필요하다고 생각하는 것이 상당히 흔한 실수라고 생각합니다. – martineau

+1

이미지와 시작 위치와 같이 변경되는 데이터가 몇 개 밖에 없다는 것을 고려하면 제안한 것과 다른 데이터가 전달 된 한 클래스를 사용했습니다. 도움을 주셔서 감사합니다. – Mattattack

0

Player2 만약 상속과 update 방법은 단순히 Player2에 대한 update를 정의 할 수 없습니다 정확히 동일합니다. updatePlayer2는 객체가 호출 될 때 그 경우

는 그 Player1로부터 상속 된 정의를 사용하며 self Player2는 예를 참조한다.

관련 문제