2017-05-03 2 views
1

파이 게임을 사용하는 클래스 용 간단한 파이썬 게임을 작성 중입니다. 짧은 시간 동안 코딩했지만이 프로젝트까지는 그래픽을 사용하지 않았습니다. 나는 이미 플레이어에서 클릭 한 지점으로 이동하는 '불 덩어리'를 만들었습니다. 나는 전사와 함께 일하고있다, 그는 그와 함께 여행하는 칼을 가지고있다. 나는 또한 내가 원하는 슬래시 모양의 동작을 가지고있다. 스페이스 바를 누르면 칼의 각도가 바뀌고 다시 정상 위치로 돌아옵니다. 내가 가지고있는 문제는 일단 이미지/대상 (검)이 아래 위치에 그려지면 그 위치에 머물러 있다는 것입니다. 원본 이미지는 원래 위치로 다시 올라갑니다. 누군가가 올바른 방향으로 나아갈 수 있기를 바랬습니다. 이것은 내 첫 그래픽 게임입니다. 나는 이것이 일반적으로 객체가 메인에 그려져있는 선과 관련이 있다는 것을 알고 있지만, 나는 그 행운을 꽤 많이 가지고 장난 삼아 해왔다. 또한, 내가 잘못하려고한다면 무엇이든 주저하지 않습니다. 감사합니다. 감사합니다.파이 게임 애니메이션 객체가 그려지지 않음

클래스 플레이어 (pygame.sprite.Sprite) :

def __init__(self, name): 
    pygame.sprite.Sprite.__init__(self) 
    self.name = name 
    self.level = 1 
    self.xp = 0 
    self.health = 100 
    self.power = 100 
    self.disc = 0 
    self.currentAtk = 1 


def draw(self, screen): 
    screen.blit(self.image, (self.rect.x, self.rect.y)) 

def update(self): 
    key = pygame.key.get_pressed() 

    if key[K_SPACE]: 
     if self.disc == 1 and self.currentAtk == 1: 
      self.warsword.stab() 

클래스의 검 (pygame.sprite.Sprite) :

image = pygame.image.load('images\\sword.png') 

def __init__(self, x1, y1, angle = -25, stabtime = 5): 
    pygame.sprite.Sprite.__init__(self) 
    self.angle = angle 
    self.image = pygame.transform.rotate(Sword.image, self.angle) 
    self.rect = self.image.get_rect() 
    self.rect.x, self.rect.y = x1, y1 
    self.stabtime = stabtime 
    self.repeat = 2 

def update(self): 
    key = pygame.key.get_pressed() 

    if key[K_a] and self.rect.x >= 72: 
     self.rect.x -= 1 
    if key[K_d] and self.rect.x <= 572: 
     self.rect.x += 1 
    if key[K_w] and self.rect.y >= 154: 
     self.rect.y -= 1 
    if key[K_s] and self.rect.y <= 309: 
     self.rect.y += 1 

def draw(self, screen, x, y): 
    screen.blit(self.image, (x, y)) 

def stab(self): 
    if self.angle != -90 and self.stabtime == 5: 
     self.angle = -90 
     self.rect.y += 15 
    if self.stabtime >= -5: 
     self.image = pygame.transform.rotate(self.image, self.angle) 
    else: 
     pygame.sprite.Sprite.update(self) 
    self.stabtime -= 1 

수준의 전사 (플레이어) :

image = pygame.image.load('images\\warrior.png') 
SwordX = 0 
SwordY = 0 
def __init__(self, name, x, y): 
    super(Warrior, self).__init__(name) 
    self.disc = 1 
    self.image = Warrior.image 
    self.rect = self.image.get_rect() 
    self.rect.x = x 
    self.rect.y = y 
    Warrior.SwordX = self.rect.x + 12 
    Warrior.SwordY = self.rect.y + 10 
    self.warsword = Sword(Warrior.SwordX, Warrior.SwordY) 
    atks.add(self.warsword) 

def main() :

chars = pygame.sprite.Group(()) 
screen = pygame.display.set_mode((640, 480)) 
a = Warrior('Fago', 250, 200) 
chars.add(a) 
screen = pygame.display.set_mode((640, 480)) 
while True: 

    chars.update() 
    atks.update() 
    screen.blit(pygame.image.load('images\\arena.png'), (0,0)) 
    atks.draw(screen) 

    chars.draw(screen) 

    pygame.display.update() 
    CLOCK.tick(75) 
    pygame.event.pump() 

주()

답변

0

여기에 한 가지 방법이 있습니다. 먼저 원본 이미지의 복사본을 Sword 클래스에 저장하고 stabbing 속성을 지정합니다. stab()을 호출하면 이미지가 회전하고 self.stabbing = True으로 설정됩니다. 이제 update 방법에서는 여전히 찌르는 경우를 보며 self.stabtime을 감소시키고 <= 0이면 이미지와 각도를 재설정합니다.

SWORD_IMAGE = pygame.image.load('images\\sword.png').convert() 

class Sword(pygame.sprite.Sprite): 

    def __init__(self, x1, y1, angle=-25, stabtime=30): 
     super().__init__() 
     self.angle = angle 
     self.image = pygame.transform.rotate(SWORD_IMAGE, self.angle) 
     self.orig_image = self.image 
     self.rect = self.image.get_rect(topleft=(x1, y1)) 
     self.stabtime = stabtime 
     self.stabbing = False 

    def update(self): 
     if self.stabbing: 
      if self.stabtime <= 0: 
       self.reset_stab() 
      self.stabtime -= 1 

    def stab(self): 
     self.angle = -65 
     self.image = pygame.transform.rotate(self.orig_image, self.angle) 
     self.stabbing = True 

    def reset_stab(self): 
     self.stabtime = 30 
     self.image = self.orig_image 
     self.angle = -25 
     self.stabbing = False 

사이드 노트 :

while 루프 내부의 하드 디스크에서 또 다시 이미지를로드하지 마십시오, 단 한 번 세계를로드하고 프로그램을 다시 사용하십시오. 또한 성능을 향상 시키려면 convert() 또는 convert_alpha() 방법으로 이미지를 변환하십시오.

pygame.key.get_pressed()을 두 번 이상 호출하지 말고 while 루프에서 호출 한 다음 key 튜플을 필요한 객체에 전달하십시오.

+1

나는 그것을 (사이드 노트와 함께) 고맙게 생각하며, 나는 항상 더 잘할 수있는 것을 알고 싶다. 나는 일종의 일을해야하지만 이것을 구현하려고 노력할 것입니다, 그것은 훨씬 더 깨끗한 것으로 보입니다. 다시 한 번 감사드립니다! :) –