저번 글에서는 맵을 간단하게 만드는 것을 해봤다
이번 글에서는 장애물을 만들고 장애물과 닿을 시 캐릭터가 밀려나는 것을 구현하려고 한다.
그 전에 각 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에 부딪힌 다음을 생각하기 전에 부딪혔는지를 확인할 수 있어야한다.
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()
그리고 게임을 실행해보자
회전방향이 반대로 되는 것을 확인할 수 있었다.
'프로그래밍 > 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 |