본문 바로가기

프로그래밍/pygame

Pygame 도전기 5 - 장애물 만들기

저번 글에서는 맵을 간단하게 만드는 것을 해봤다

이번 글에서는 장애물을 만들고 장애물과 닿을 시 캐릭터가 밀려나는 것을 구현하려고 한다.

 

그 전에 각 sprite마다 group을 지정해주자.

그래야 ground타일이면 ground 그룹에 tree면 tree_group에 들어가 있어야지 플레이어랑 부딪히는 sprite가 어디 그룹에 속해있는지 알고 그에 따른 반응을 구현해야하기 때문이다.

 

#sprite_group
sprite_group = pygame.sprite.Group()
player_group = pygame.sprite.Group()
sea_group = pygame.sprite.Group()
ground_group = pygame.sprite.Group()
tree_group = pygame.sprite.Group()

그리고 다음과 같이 sprite를 sprite_group에 추가할 때 각각에 맞는 group에 따로 또 추가해주었다.

장애물은 나무로 할 것이기 때문에 다른 타일들과 같이 Tree 클래스를 만들어주고 맵 텍스트 파일에서는 't'로 지정해준다.

class Tree(pygame.sprite.Sprite):
    
    def __init__(self, col, row):
        pygame.sprite.Sprite.__init__(self)
        # 타일 한개당 위치를 좌표로 본다
        self.grid_x = row * TILESIZE
        self.grid_y = col * TILESIZE
        self.image = pygame.image.load(path.join(image_folder, 'tree.png')).convert_alpha()
        self.rect = self.image.get_rect()
        # 타일 생성위치를 좌표에 대입
        self.rect.x = self.grid_x
        self.rect.y = self.grid_y
        
...



...

for col in range(0,len(map_data)):
    for row in range(0,len(map_data[col])):
        if map_data[col][row] == "s":
            sea = Sea(col, row)
            sprite_group.add(sea)
            #각각의 그룹에 맞게 추가해준다.
            sea_group.add(sea)
        if map_data[col][row] == "g":
            ground = Ground(col, row)
            sprite_group.add(ground)
            #각각의 그룹에 맞게 추가해준다.
            ground_group.add(ground)
        if map_data[col][row] == "t":
            tree = Tree(col, row)
            sprite_group.add(tree)
            #각각의 그룹에 맞게 추가해준다.
            tree_group.add(tree)
            
    
'''
 
 
'''

#각각의 그룹에 맞게 추가해준다.
sprite_group.add(player)
player_group.add(player)  

그리고 맵 파일을 다음과 같이 바꿔주자

 

맵 파일에 tree를 추가해주자

 

그 다음으로는 tree에 부딪힌 다음을 생각하기 전에 부딪혔는지를 확인할 수 있어야한다.

def tree_collide(self):
    # spritecollide에서 첫번째 인자는 비교할 부딪혔을 때 반응할 sprite이고
    # 두번째 인자는 부딪힌 sprite를 삭제시킬지 여부이다. tree sprite는 삭제시킬 것이 아니기 때문에 False로 해주었다.
    collide_tree = pygame.sprite.pygame.sprite.spritecollide(self, tree_group, False)
    if collide_tree:
        # 정상적으로 작동하는지 확인하기 위해 부딪혔을 때 collide라는 문자열이 나오게 한다.
        print("collide")

 

그리고 게임을 실행하면

오른쪽 아래에 충돌이 확인된다.

tree와 부딪혔을 때 오른쪽 아래에 정상적으로 collide가 출력되는걸 볼 수 있다.

 

정상적으로 작동되는 것을 확인하였으니 tree와 부딪혔을 때 체력이 깎이고 튕겨져 나오는 것을 구현하자.
우선 class Player에 hp class를 추가한다. 우선 hp = 3이라고 하자.

그리고 나무와 부딪히면 튕겨져 나오는 것을 구현해보자

여기서는 회전방향이 반대로 바뀌는 것으로 튕겨져 나오는 것을 표현하였다.

그리고 바다 타일에 부딪히면 hp를 0으로 만들어 버린다.

class Player(pygame.sprite.Sprite):
    def __init__(self):
        
        '''
        
        '''
        #플레이어의 체력이다.
        self.hp = 3
    
    '''
    
    '''
    def tree_collide(self):
        collide_tree = pygame.sprite.pygame.sprite.spritecollide(self, tree_group, False)
        if collide_tree:
            # 회전방향이 반대로 된다
            self.rotate_speed *= -1
            # 체력이 1 깎인다.
            self.hp -= 1
    
    def sea_collide(self):
        collide_sea = pygame.sprite.spritecollide(self, sea_group, False)
        if collide_sea:
            # 바다에 부딪히면 바로 피가 0이 된다.
            self.hp = 0
    
class Hp(pygame.sprite.Sprite):
    
    def __init__(self,player):
        pygame.sprite.Sprite.__init__(self)
        #처음에는 체력이 3으로 시작한다.
        self.image = pygame.image.load(path.join(image_folder, 'hp3.png')).convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.x = 32
        self.rect.y = 32

    def update(self):
        # hp가 줄어들 때마다 그 체력에 맞는 체력이미지를 불러온다.
        if player.hp == 3:
            self.image = pygame.image.load(path.join(image_folder, 'hp3.png')).convert_alpha()
        elif player.hp == 2:
            self.image = pygame.image.load(path.join(image_folder, 'hp2.png')).convert_alpha()
        elif player.hp == 1:
            self.image = pygame.image.load(path.join(image_folder, 'hp1.png')).convert_alpha()
        elif player.hp <= 0:
            self.image = pygame.image.load(path.join(image_folder, 'hp0.png')).convert_alpha()

그리고 게임을 실행해보자

시작할 때 hp는 3이다.

 

나무에 부딪혀 hp가 깎이는 것을 볼 수 있다.

회전방향이 반대로 되는 것을 확인할 수 있었다.

'프로그래밍 > pygame' 카테고리의 다른 글

Pygame 도전기 4 - 맵 짜기  (0) 2020.01.09
Pygame 도전기 3 - player 움직임 구현  (0) 2020.01.08
Pygame 도전기 - 2(그리드 만들기)  (2) 2020.01.06
Pygame 도전기 - 1  (0) 2019.10.22
Pygame에 도전하다  (0) 2019.10.22