class Enemy():
def __init__(self, pos_x, pos_y, e_idx, enemy_move_x, enemy_move_y, init_speed_y):
self.pos_x = pos_x
self.pos_y = pos_y
self.e_idx = e_idx
self.enemy_move_x = enemy_move_x
self.enemy_move_y = enemy_move_y
self.init_speed_y = init_speed_y
# Enemy(랜덤한 x좌표, 랜덤한 y좌표, 인덱스번호, 적의 x축 이동방향(왼:-3, 오:3), 적의 y축 이동방향, 적 속도)
enemy1 = Enemy(coor_x, coor_y , 0, 3, -6, enemy_speed[0])
enemy2 = Enemy(coor_x, coor_y, 1, -3, -6, enemy_speed[1])
enemy3 = Enemy(coor_x, coor_y, 2, 3, -6, enemy_speed[2])
enemy4 = Enemy(coor_x, coor_y, 3, -3, -6, enemy_speed[3])
enemy5 = Enemy(coor_x, coor_y, 4, 3, -6, enemy_speed[4])
해당 클래스의 상태도 많이 마음에 들지는 않는다. 원래 pos_x
와 pos_y
값에다가 random.randrange(0, screen_w - enemy_w)
와 random.randrange(0, screen_h - enemy_h)
를 주려 했는데, 이것도 랜덤값이 뭔가 다섯개의 캐릭터에 모두 비슷하게 나오는 것 같아 그냥 내가 숫자를 써줬다. 그런데 너무 캐릭터 피하기가 쉬워서 결국 처음으로 돌아갔따. 튜터님께서는 모든 객체 사이에 랜덤을 껴주면 될거 같다 했지만 뭔가 너무 더러워보였다. 그래서 객체 안에다가 막 넣어보고 싶어서 별거 다하다가 결국 마감을 해야하니 포기했다. 그래도 게임을 하게 되면 눈치는 챌 수 없다. ㅋ 꼭 바꾼다 너는
for문이 계속 돌긴 할까?
라는 생각이 들었었다. 거기다 어제 튜터님이 슥 보시더니 이거 로직에 문제가 좀 있을수도 있겠는데?
라고 하신 것도 생각이 났다. 그래서 오늘 아침 퀴즈에서 복잡하게 생각하다 못풀게 되서 혼자 마음을 다잡으며 했던 단순해 져보자
를 생각했다. 그래서 이왕 클래스로 각 적 캐릭터에게 속성을 다 부여한 마당에 저것도 각자 다 해보자 했다. # 적1 위치 정의 (벽에 닿았을 때 처리)
# 가로벽에 닿았을 때 적의 이동위치를 변경해주자
if enemy1.pos_x < 0 or enemy1.pos_x > (screen_w - enemy_w):
enemy1.enemy_move_x = enemy1.enemy_move_x * -1
# 밑바닥에서 튕겨 올라가는 처리
if enemy1.pos_y >= screen_h - enemy_h:
enemy1.enemy_move_y = enemy1.init_speed_y
else:
# 그 외의 모든 경우에는 속도를 증가(시작값이 원래 음수) -> 포물선 효과
enemy1.enemy_move_y += 0.5
enemy1.pos_x += enemy1.enemy_move_x
enemy1.pos_y += enemy1.enemy_move_y
이 코드를 5번을 쳤다. 나도 클래스를 만들어야 된다는 걸 알고 있다. 추후에 이 부분도 수정할 것이다. (하다가 포기)
클래스
로 바꾸어야 한다는 것을 알고 있다. # 적1 위치 정보
enemy1_pos_x = enemy1.pos_x
enemy1_pos_y = enemy1.pos_y
enemy1_index = enemy1.e_idx
# 적1 rect 정보
enemy1_rect = enemies[enemy1_index].get_rect()
enemy1_rect.left = enemy1_pos_x
enemy1_rect.top = enemy1_pos_y
# 충돌한다잉~
if elapsed_time > 10 and hero_rect.colliderect(enemy1_rect):
print(1, hero_x_pos, hero_y_pos, enemy1_pos_x, enemy1_pos_y)
running = False
break
if elapsed_time > 20 and hero_rect.colliderect(enemy2_rect):
print(2, hero_x_pos, hero_y_pos, enemy2_pos_x, enemy2_pos_y)
running = False
break
if elapsed_time > 30 and hero_rect.colliderect(enemy3_rect):
print(3, hero_x_pos, hero_y_pos, enemy3_pos_x, enemy3_pos_y)
running = False
break
if elapsed_time > 40 and hero_rect.colliderect(enemy4_rect):
print(4, hero_x_pos, hero_y_pos, enemy4_pos_x, enemy4_pos_y)
running = False
break
if elapsed_time > 40 and hero_rect.colliderect(enemy5_rect):
print(5, hero_x_pos, hero_y_pos, enemy5_pos_x, enemy5_pos_y)
running = False
break
아까 다른 분께서 게임 발표회를 하실 때 collidepoint
를 이야기하셔서 구글링을 해보았는데, 원하는 결과는 얻지 못했다. 하지만 대략 의미는 colliderect
는 캐릭터의 둘레를 사각형으로 만들어 주는 반면, collidepoint
는 원으로 만들어 준다. 따라서 좀 더 나와같이 부딪히는 게임에서는 좋을 것 같다고 생각한다. 좀 더 연구해서 고칠 부분!
해당 부분에서 elapse_time
을 쓴 이유는 앞서 말했던 나오지도 않은 캐릭터에 부딪혀 사망하고 싶지 않았기 때문이다. 내가 하면서도 좀 억지스럽기는 했는데 이렇게 하니 투명한 무언가에 죽는 일은 없어졌다. 그런데 이미 나와있는 애들과 원래 스쳐도 죽었는데 예전만큼은 죽지 않는다. 하도 게임 시작하자마자 죽어서 그런지 안죽어서 더 재미있어지긴 했다.
# 적 캐릭터를 그림
if elapsed_time < 10:
screen.blit(enemies[0], (enemy1.pos_x, enemy1.pos_y))
if elapsed_time > 10:
screen.blit(enemies[0], (enemy1.pos_x, enemy1.pos_y))
screen.blit(enemies[1], (enemy2.pos_x, enemy2.pos_y))
if elapsed_time > 20:
screen.blit(enemies[0], (enemy1.pos_x, enemy1.pos_y))
screen.blit(enemies[1], (enemy2.pos_x, enemy2.pos_y))
screen.blit(enemies[2], (enemy3.pos_x, enemy3.pos_y))
if elapsed_time > 30:
screen.blit(enemies[0], (enemy1.pos_x, enemy1.pos_y))
screen.blit(enemies[1], (enemy2.pos_x, enemy2.pos_y))
screen.blit(enemies[2], (enemy3.pos_x, enemy3.pos_y))
screen.blit(enemies[3], (enemy4.pos_x, enemy4.pos_y))
if elapsed_time > 40:
screen.blit(enemies[0], (enemy1.pos_x, enemy1.pos_y))
screen.blit(enemies[1], (enemy2.pos_x, enemy2.pos_y))
screen.blit(enemies[2], (enemy3.pos_x, enemy3.pos_y))
screen.blit(enemies[3], (enemy4.pos_x, enemy4.pos_y))
screen.blit(enemies[4], (enemy5.pos_x, enemy5.pos_y))
이 부분은 시간이 10초 지날 때마다 캐릭터가 하나씩 추가되었으면 하는 나의 바램을 표현한 부분이다. 위에서 설정한 적의 캐릭터와 위치 좌표에 따라 적 캐릭터가 나오게 된다. 객체를 쓰면서 그래도 표현이 많이 정갈해진 것 같아 기분은 좋다.
클래스 적극 사용해본점과 이동과 충돌부분 별로 코드 정리를 잘해주셨습니다. 코드에 주석도 잘쓰셔서 다시 리팩토링하면서 읽으실때 많은 도움 될것 같습니다.
적캐릭터 그리는 부분도 객체 리스트로 리팩토링 해보시길 추천 드리고 개발한 코드 git에 올려서 버전관리 하시면서 시간날때 미구현 기능도 해보고 게임관리 하는부분도 클래스화 해보시면 도움되실꺼에요! 짧은기간 동안 구현하시느라 수고하셨습니다!