팀원분들과 타워 디펜스 게임 멀티서버 프로젝트를 하면서
맡은 기능을 구현하던 중
트러블 슈팅
클라이언트에서 일단 랜덤생성된 x, y좌표를 타워 인스턴스를 생성하는 부분이 있는데
여기서 생성된 타워 인스턴스를 그대로 서버로 socket.emit을 했다.
서버에서 처리 후 클라이언트로 다시 반환해 온 이 타워 인스턴스를
draw메서드(class 내부 메서드)를 사용해 웹 브라우저에 타워를
그리도록 구현을 했는데 분명 class내에 draw함수가 있어서
해당 타워를 그릴 수가 있어야 하는데 자꾸 draw를 인식 못하는 문제가 발생했었다.
(당시 에러코드, 사진을 안 찍어둠)
해결과정
그래서 어디서 변형이 된 건지 전송과정부터 하나하나 콘솔 찍어봤는데
클라에서 생성된 타워 인스턴스랑 서버에서 반환되어 온 타워 인스턴스가
달라진 것을 확인할 수 있었다.
이유를 찾아보니 socket.emit으로 클래스로 생성된 객체를 전송하면
해당 객체는 클래스로서의 기능?을 잃는다고 한다
그래서 일반 타워객체로 변환이 되고
반환된 객체는 클래스로 생성된 객체가 아닌 일반 객체로 인식이 되기 때문에
draw를 찾을 수가 없던 것이었다.
변경점
그래서 변경한 부분은 기존에 클라이언트에서 타워 인스턴스를 생성했는데
생성하지 않도록 변경하고 랜덤생성된 좌표를 서버로 보낸 후 서버에서 처리한 후에
반환된 좌표를 토대로 타워 인스턴스를 생성하고 바로 draw 하도록 수정했다.
기존
좌표 생성 -> 타워인스턴스 생성 -> 서버로 인스턴스 전송 ->
서버에서 검증 등 처리 -> 클라이언트 반환 -> 반환된 객체는 변형이 된 상태 -> 오류
변경
좌표 생성 -> 서버로 좌표 전송 -> 서버에서 검증 등 처리 ->
클라이언트 반환 -> 반환된 좌표를 토대로 인스턴스 생성 -> draw적용 -> 해결