실전도 벌써 한 달째, 정말 끝을 향해 달려가고 있다.
월요일 배포를 목표로 하고 있으나... 할 수 있을련지...??
아직 배포하기엔 뭔가 완벽하지 않은 느낌이라 약간쓰 걱정이다 ㅎㅅㅎ...
room의 방장이 상대방의 스트림을 가져오지 못했다. 새 스트림을 담는 div를 생성해서 ref에 담아주는 형식이었는데 ref 생성보다 useEffect가 먼저 실행이 되어서 ref.current가 null 값이어서 에러가 자꾸 나는 것이었다.
-> ref가 true 일 때 실행하는 if문을 하나 추가하니 정말 쉽게.. 해결되었다. 뭔가 너무 허무...
room에 입장하는 유저의 닉네임을 소켓으로 받으니 rtc로 받는 비디오와 생성 속도가 달라 유저간의 닉네임이 꼬이는 문제가 생겼다.
webRTC가 비디오뿐만 아니라 다른 데이터로 전송이 가능하다는 점에서 닉네임도 peer로 전송하기로 했다.
myPeer.on('open', (peerId) => {
myPeerId = peerId
socket.emit('peerJoinRoom', myPeerId, userNick, streamId)
})
peer를 open할때 peerId뿐만 아니라 유저닉네임을 시그널링 서버로 보내주었다.
socket?.on('user-connected', (userId, userNick, streamId) => {
if (videoWrap.current) {
const call = myPeer.call(userId, myStream)
const dataConnection = myPeer.connect(userId, {
metadata: UserNick,
})
그리고 user-connected가 될 때 데이터에 유저 닉네임을 담아 새로 보내주는 로직을 추가하였다. 그리고 나서 call부분에서 닉네임 데이터를 서로 주고받을 수 있는 코드를 추가했다.
peerId가 중복으로 입장되는 문제가 있었는데 요 코드를 추가했더니 갑자기 해결되었다(?)
이유는 모르겠으나.. 일단 해결이 되어서..좋다 근데 왜 해결된거지?
그러다보니 게임 중 죽은 사람을 화면에 표시를 해야 했는데 화면에 뿌려지는 정보는 전부 peer 통신이라 물고 있는 데이터가 없어 어떻게 보여줘야 할지 고민을 많이 했다.
//죽은 사람 표기
if (killed === null) {
killed = []
}
let nickBox = document.getElementsByClassName('fl')
for (let i = 0; i < nickBox.length; i++) {
for (let e = 0; e < killed.length; e++) {
if (
nickBox[i].innerText === killed[e] ||
nickBox[i].innerText === nowKilled
) {
nickBox[i].classList.add('die')
}
}
}
결론적으로 usernick을 담은 div의 클래스명으로 배열을 가져온다음 innerText로 죽은 사람 명단과 비교하여 죽은 사람 분기를 줄 클래스명을 추가해 주었다.
이 부분은 배열 가공도 불가능했기 때문에 중복 for문에 if문까지 같이 돌려버려서.. 솔직히 좋은 코드는.. 아닌 것 같지만 알고리즘 문제 풀듯이 작업했기 때문에 조금 재밌었던 시간이었다.