[0427] TIL 8일차

nikevapormax·2022년 4월 27일
0

TIL

목록 보기
8/116

😂 게임 프로젝트 제출

😭 변경한 내용

- 적 캐릭터의 정보를 '클래스'를 사용해서 담아봄

  • 클래스를 생각했다가 뭔가 힘들 것 같아 또 쉬운 길을 택했었다.
    하지만 쉬운 길은 역시 틀린다.
  • 클래스를 공부했음에도 많이 사용하지 않았고, 항상 망각하고 있어 이번에 클래스를 사용하면서 엄청 어려웠다.
  • 튜터님이 간단하게 작성해주신 내용을 바탕으로 일단은 작성했다. 그리고 이리저리 혼자 고쳐보면서 시간을 많이 태웠다.
  • 적 캐릭터의 클래스 생성
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_xpos_y 값에다가 random.randrange(0, screen_w - enemy_w)random.randrange(0, screen_h - enemy_h)를 주려 했는데, 이것도 랜덤값이 뭔가 다섯개의 캐릭터에 모두 비슷하게 나오는 것 같아 그냥 내가 숫자를 써줬다. 그런데 너무 캐릭터 피하기가 쉬워서 결국 처음으로 돌아갔따. 튜터님께서는 모든 객체 사이에 랜덤을 껴주면 될거 같다 했지만 뭔가 너무 더러워보였다. 그래서 객체 안에다가 막 넣어보고 싶어서 별거 다하다가 결국 마감을 해야하니 포기했다. 그래도 게임을 하게 되면 눈치는 챌 수 없다. ㅋ 꼭 바꾼다 너는

- 적들의 이동 또는 위치 정보 수정

  • 원래는 for문을 돌려서 했었다. 이게 내가 여러 유튭에서 내가 따라친 소스를 보고 짬뽕을 하다가 잘못 한 것도 있고, 계속 생각해보니 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을 쓴 이유는 앞서 말했던 나오지도 않은 캐릭터에 부딪혀 사망하고 싶지 않았기 때문이다. 내가 하면서도 좀 억지스럽기는 했는데 이렇게 하니 투명한 무언가에 죽는 일은 없어졌다. 그런데 이미 나와있는 애들과 원래 스쳐도 죽었는데 예전만큼은 죽지 않는다. 하도 게임 시작하자마자 죽어서 그런지 안죽어서 더 재미있어지긴 했다.

- 적 캐릭터 화면에 그리기

  • 메인 캐릭터까지는 신나서 TIL도 그림까지 그려가면서 만들었었는데, 여기서 멘탈이 다 갈려서 내용이 이상하다. 특히 이 부분은 좀 어떻게 하고 싶은데 결국 이쪽으로 돌아온다. 이 부분도 꼭 줄여보고 싶다.
# 적 캐릭터를 그림
    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초 지날 때마다 캐릭터가 하나씩 추가되었으면 하는 나의 바램을 표현한 부분이다. 위에서 설정한 적의 캐릭터와 위치 좌표에 따라 적 캐릭터가 나오게 된다. 객체를 쓰면서 그래도 표현이 많이 정갈해진 것 같아 기분은 좋다.

😭 느낀 점

  • 항상 느끼지만 너무 많이 부족하다. 아는 것임에도 활용하지 않는 점, 찾다가 안되면 포기하려는 경향(그래도 튜터님들께 질문도 하러 가고 많이 고치는 중), 안되면 시작되는 과도한 자기성찰 등을 좀 줄이고 다른 데 포커스를 두는 연습도 해야겠다.
  • 금일 오전에 진행한 퀴즈도 꼬아서 생각하고 못풀었다. (물론 끝나고 나서는 바로 풀었다.) 안될때는 다시 돌아가서 초심자의 마음으로 때로는 주먹구구가 가장 효율적인 방법일수도(거의 없겠지만) 있다는 것을 명심해야 겠다. 일단 만들고 짧게 바꿔라 좀 ㅎ
profile
https://github.com/nikevapormax

1개의 댓글

comment-user-thumbnail
2022년 4월 28일

클래스 적극 사용해본점과 이동과 충돌부분 별로 코드 정리를 잘해주셨습니다. 코드에 주석도 잘쓰셔서 다시 리팩토링하면서 읽으실때 많은 도움 될것 같습니다.
적캐릭터 그리는 부분도 객체 리스트로 리팩토링 해보시길 추천 드리고 개발한 코드 git에 올려서 버전관리 하시면서 시간날때 미구현 기능도 해보고 게임관리 하는부분도 클래스화 해보시면 도움되실꺼에요! 짧은기간 동안 구현하시느라 수고하셨습니다!

답글 달기