1 분 소요

작업 목표

  1. 기존 몬스터 패킷의 구조를 좀 더 최적화 시킬 수 있도록 해보자.
  2. 몬스터가 벗어났을 때 등의 작업을 클라이언트가 처리할지도 모르니 혹시 모르니 핸들러를 만들어 놓자.

트러블슈팅

발단

기존의 게임 루프에선 게임루프 내에서 몬스터가 발견을 하고 몬스터의 움직임을 동기화한 뒤, 이후 거리를 다시 측정하여 몬스터와 플레이어 간의 거리가 떨어진다면 몬스터가 플레이어의 정보를 잃는다는 식으로 3개에 나눠서 작성하고 있었다. 이 과정에서 플레이어를 잃는 작업을 별도의 패킷으로 보내줘야 한다고 생각하고 있었기에 해당 작업을 보류하고 있었다.

  monsterUpdate() {
    //몬스터가 플레이어의 거리를 구해서 발견한다.
    //몬스터의 거리가 너무 멀어지면 id값을 0이나 -1을
    this.monsterDisCovered();
    //몬스터가 플레이어를 가지고 있을 경우 움직인다.
    this.monsterMove();
    this.monsterLostPlayer();
  }

전개

클라이언트 쪽 담당자로부터 플레이어 ID가 0이 온다면 플레이어 정보가 초기화되는 거라는 이야기를 듣고, 몬스터가 플레이어 정보를 인식하는 지점에서 모든 걸 처리하도록 바꾸기로 했다. 기존의 lostplayer 함수를 제거하고 discovered 함수에 결합하여 체크하도록 했다.

  monsterUpdate() {
    //몬스터가 플레이어의 거리를 구해서 발견한다.
    //몬스터의 거리가 너무 멀어지면 id값을 0이나 -1을
    this.monsterDisCovered();
    //몬스터가 플레이어를 가지고 있을 경우 움직인다.
    //this.monsterMove();
  }
monsterDisCovered() {
    const monsterDiscoverPayload = [];
    for (const [monsterId, monster] of this.monsters) {
      // 대상이 없는 몬스터만
      let distance = Infinity;
      let inputId = 0;
      let inputPlayer = null;
      if (!monster.hasPriorityPlayer()) {
        for (const [playerId, player] of this.players) {
          // 대상 찾아보기
          const calculedDistance = monster.returnCalculateDistance(player);
          if (calculedDistance === -1 || distance < calculedDistance) {
            continue;
          }

          distance = calculedDistance;
          inputId = playerId;
          inputPlayer = player;
        }

        if (inputPlayer === null) {
          continue;
        }

        console.log(inputPlayer);
        monster.setTargetPlayer(inputPlayer);
        if (monster.hasPriorityPlayer()) {
          console.log('플레이어가 등록됨');
          monsterDiscoverPayload.push({
            monsterId: monsterId,
            targetId: inputId,
          });
        }
      }
      else {
        if (monster.lostPlayer()) {
          console.log(`${monsterId}가 플레이어를 잃음`)
          monsterDiscoverPayload.push({
            monsterId: monsterId,
            targetId: 0
          })
        }
      }
    }
    const packet = makePacket(
      config.packetType.S_MONSTER_AWAKE_NOTIFICATION,
      { monsterTarget: monsterDiscoverPayload },
    );
    this.broadcast(packet);

  }

태그:

카테고리:

업데이트: