본문 바로가기
TIL&WIL

241213 TIL - 개인과제01, 음수인덱스

by 나노다 2024. 12. 13.

개인과제) 오늘 한 작업

Commit01 : [add] 이미지 파일 추가

[add] 1. 플레이어, 장애물, 아이템 이미지 추가

 

Commit02 : [add] Boss 추가 [fix] 게임 요소들 조정

[add]

1. Boss.js 파일 추가

- Boss 클래스 관리 위함

- 필요 속성들 조정

2. 이미지 추가

- Boss 및 Backgroud 이미지

- 수정된 작은 제리 이미지

 

[fix]

1. Boss 추가에 따른 요소들 조정

- index.js에서 Boss 관련 변수 추가, 인스턴스 생성, 메서드 실행 등 추가

2. 게임 요소들 속성 조정

- 등장 위치 및 크기 조정

 

Commit03 : [add] Stage 클래스 추가 [fix] 관련요소 수정

[add]

1. Stage.js 파일 생성

- Stage 클래스 관리 위함

- 필요한 속성 및 메서드 추가

- index.js 파일에 적용

 

[fix]

1. 아이템 관련 수정

- 아이템 획득 시 점수 얻기 구현(아직 고정값)

2. 점수 관련 수정

- 시간에 따라 증가하지 않도록 수정

- 점수에 따라 스테이지 승급하지 않도록 수정

3. 리드미 일부 수정

 

Commit04 : [fix] 아이템 연관 속성 수정

[fix]

1. 아이템 데이터테이블 파일들 수정

- id, score 값 수정 및 데이터 개수 맞춤

2. Item 및 ItemController 클래스 개편

- 스테이지마다 다른 코인 등장

- 등장 간격 고정

- 등장 y좌표 최적화

3. 별 획득 효과 일부 구현

- 점수 대폭 획득

- 획득 시 일정 프레임 무적

 

개인과제) 오늘 만난 문제 상황

Problem01 : 별이 안 나온다!!!

[상황 설명]

보고싶구나 별아...

 

기본적으로 점수를 획득하는 코인 말고, 특수 효과가 있는 아이템을 하나 쯤은 구현하고 싶었다!!

슈퍼마리오의 별 개념을 그대로 가져와서 ^_^, 획득 시 일정 프레임 동안 충돌을 무시하는 아이템을 목표로 작업 착수!

기존에 존재하는 Item과 ItemController 클래스로 어렵지않게 구현할 수 있었는데, 

문제는 별이 당최 등장할 생각을 안 하는 것이다!!

 

[해결 과정]

별 등장 관련 메서드

 

아이템이 등장하는 로직은 위 사진과 같다!! 우선 기존에 없던 별 등장 간격 관련 속성을 만들어 넣어주었고!

stage 값은 item[id]와 동일한데 별의 아이드는 6으로, 최대가 5스테이지인 이 게임의 예외적인 존재였당

그래서 createItem() 메서드에 상수 6을 넣어주었고, deltatime에 따라 간격도 감소하고,

등장하면 올바르게 인터벌도 초기화해줬다!! 근데 왜 안 나오니!!

별과 코인의 간격 일치시켜봄

 

오늘도 테스트를 위해 데려온 콘솔로그 씨(4세)... 테스트를 위해 별과 코인의 인터벌을 동일하게 부여했다!

이러면 조건문에 선행하는 게 별 조건이니까 별만 나오겄지!!

잘 나오고 잘 찍힌다...

 

보시다시피 잘 등장하고, 콘솔도 무쟈게 찍힌다!! 그렇담 로직 흐름 자체에 문제는 없단 것이니!!

변수 값이나 조건 등을 살펴보기로 했다!!

찾았다 요 놈

 

깨달았다!!! setNextItemTime 메서드는 아이템이 등장하면 그 인터벌을 초기화 시켜주는 기능을 담당한다!

그런데 그 내부에서 별도 초기화하고, 코인도 초기화하니, 인터벌이 더 긴 별은 나올래야 나올 수가 없었던 것!!

 

0일 때만 초기화해!!

 

그래서 메서드를 이렇게 바꾸어 보았다!!

이러면 별이 등장할 때만 초기화되겠지? 라고 부푼 꿈을 안고 게임을 실행하자...

너무 많이 나옴ㅋㅋㅋㅋㅋㅋ

 

그 동안 안 나왔던 녀석들이 많이 참았는지 우수수수 튀어나오기 시작했다!!ㅋㅋㅋㅋㅋㅋㅋ

살짝 지칠랑말랑 하던 타이밍이었는데 덕분에 즐거워져서 힘이 나더라...

결국 분리를 해주었다...

 

우선 사이가 너무 좋은 코인과 별 두 녀석을 분리를 해주었고! 
계산한 간격 대로 따로 등장해주기 시작했는데, 또다른 문제가 발생했다??!!

바로 별이 등장할 시점에 게임오버될 시, 이어지는 게임 시작하자마자 별이 등장하는 문제였다!!

문제의 조건

 

원인은 이 곳이었다! starInterval의 기본값은 null인데, 대소 비교 연산자들은 느슨한 비교를 해버리는 바람에,

null과 0이 같다고 판단해버려 시작하자마자 별을 뱉었던 것이다!! 그럼 다른 falsy한 값들도 같은 결과를 뱉겄지?

null 넌 나가라

 

이렇게 엄격하게 비교하는 절차를 추가해줌으로써 내 숙원을 이룰 수 있었다!!

그런데 추가하고 보니 별이 너무 사기다... 그치만 자주 보고 싶은 걸.... 등장 간격 또는 효과 유지 시간 조정을 고려해보자!!

 

추가로 알게 된 것

아 배열 관련 메서드들에서 findIndex 매개변수에 음수를 넣어서 뒤에서 부터 찾곤 하잖아?

그게 나는 뒤에서부터 앞으로 작업을 하는 줄 알았는데, 시작 위치 정할 때만 뒤에서부터 찾는 거고,

작업 수행은 정방향대로 한다네? 그니까 만약 findIndex에 -1을 넣으면, 맨 마지막 요소 하나 체크하고 마는 거지!!

그리고 lastIndexOf() 메서드의 존재를 잊지 말자..... 이거 하나 기억 못 해서 엄청난 고생을 했다!!

왜 indexOf()든 find()든 다 첫 등장 하나만 찾는 겨!!! 무튼 오늘의 회고 끝!

"음수 인덱스는 배열의 끝부터 거꾸로 셉니다. 즉, fromIndex < 0이면, fromIndex + array.length가 사용됩니다. 그러나, 이 경우에도 배열은 여전히 앞에서 뒤로 검색됩니다."