[CH 4 리얼 타임 과제] 트러블슈팅 - 1002

2024. 10. 2. 22:13[Node.js_6기 본캠프 TIL]

🗺️ 아이템에 맞는 점수 부여하기

item.json 파일에 정의한 데이터를 사용하기 위해, 에셋 정보를 불러오는 코드를 활용하고자 했다.

export const loadGameAssets = async () => {
  try {
    const [stages, items, itemUnlocks] = await Promise.all([
      readFileAsync('stage.json'),
      readFileAsync('item.json'),
      readFileAsync('item_unlock.json'),
    ]);
    gameAssets = { stages, items, itemUnlocks };
    return gameAssets;
  } catch (error) {
    throw new Error('Failed to load game assets: ' + error.message);
  }
};

export const getGameAssets = () => {
  return gameAssets;
};

 

다른 파일에서도 해당 코드를 활용하고 있기 때문에, Score.js 파일에도 적용할 수 있으리라 믿었다. 그러나 import만 해도 게임이 먹통이 되는 현상이 발생했다.

공룡도 선인장도 없이 깨끗하게 청소된 하얀 상자만 둥둥 떠 있는 모습을 보며, 뭔가 단단히 잘못 되었음을 알 수 있었다. 아이템을 먹으면 점수를 올려주는 getItem() 함수를 한참 뜯어본 결과, 매개변수로 사용되고 있는 itemId가 실제 인게임에서 먹은 아이템의 id 값으로 자동 치환된다는 것을 알 수 있었다.

 

이 값을 사용해서  json에 있는 item을 조회하고, score를 반환해주는 코드를 짜야할 것 같아서 또 한참 테스트를 반복했다. 그러던 중 stage를 넘겨주는 update() 함수의 구조를 다시 보게 되었다.

 

update(deltaTime) {
    this.score += deltaTime * 0.001;
    if (Math.floor(this.score) === 100 && this.stageChange) {
      this.stageChange = false;
      sendEvent(11, { currentStage: 1000, targetStage: 1001 });
    }
  }

 

기본적으로 제공된 코드를 보고, 마지막 단계까지 넘어갈 수 있게 가공까지 해놓고... 같은 방식으로 매핑할 수 있다는 생각을 못하고 있었던 것이다.

 

item의 id값은 바로 받아올 수 있으니, if 문으로 각 id 값에 맞는 score 값을 매핑해주기로 했다.

getItem(itemId) {
    if (itemId === 1) {
      this.score += 10;
    }
    if (itemId === 2) {
      this.score += 20;
    }
    if (itemId === 3) {
      this.score += 40;
    }
    if (itemId === 4) {
      this.score += 80;
    }
    if (itemId === 5) {
      this.score += 160;
    }
    if (itemId === 6) {
      this.score += 320;
    }
    if (itemId === 7) {
      this.score += 640;
    }
  }

 

테스트 결과, 각 아이템에 맞는 점수가 추가되는 것을 확인할 수 있었다. 하드코딩을 해버린 것 같아, score 값을 매핑하는 다른 좋은 방법이 있을지는 다시 한번 더 고민해봐야 할 것 같다.