블록이 자동으로 내려오는 것을 setInterVal을 활용해 구현한 것에서 착안하여 setInterVal을 또 활용하는 방식으로 이를 구현해 보았다.
this.init = ()=>{
...
this.AccelationInterval = setInterval(() => {
this.duration -= 100;
}, 60000);
}
const generateNewBlock = (type)=>{
...
if (this.duration === 200) {
clearInterval(this.AccelationInterval);
}
...
}
const selectBlock = () => {
const blockTypes = Object.keys(BLOCKS);
const randomIndex = Math.floor(Math.random() * blockTypes.length);
return blockTypes[randomIndex];
};
this.init = () =>{
generateNewBlock(selectBlock());
}
const generateNewBlock = (type) =>{
...
renderBlocks();
showNextBlocks();
}
const showNextBlocks = () => {
// 다음 블록을 그리기 전에 이전의 블록을 제거
clearNextBlockGround();
const type = selectBlock();
const direction = 0;
BLOCKS[type][direction].forEach((block) => {
let [x, y] = [block[0] + 1, block[1] + 1];
const target = nextBlockGround.childNodes[y].children[0].childNodes[x];
target.classList.add(type, "next-block");
target.style.outline = "1px solid #ccc";
});
this.nextBlock = type;
};
const checkMatch = ()=>{
...
generateNewBlock(this.nextBlock)
}
방향키 한 번 누르면 한칸 씩 이동해야하는데 두번째 판 부터 두칸씩, 세번 째 판에는 세칸씩 이동했다. 원인을 분석해보니(getEventListeners(window)로 확인함) 같은 eventListener가 게임이 시작될 때마다 호출이 되어 동일한 이벤트리스너가 중복으로 존재하였고 따라서 키보드 입력 이벤트 발생 시 중복으로 callback이 실행되는 것이었다. (다시 시작 버튼도 같은 문제가 있었다.)
또 게임이 종료되었음에도 eventListener가 등록되어 있어 블록을 움직일 수 있는 문제가 있었다.
이러한 문제를 해결하기 위해 임시방편으로 location.reload()
을 사용하여 다시시작 버튼을 누르면 페이지를 새로고침하여 재시작 시 eventListener의 중복을 막을순 있었지만, 게임 종료시
블록이 움직이는 문제를 해결할 수 없었다. 다른 방법을 찾게 되었고 removeEventListener를 알게 되었다.
게임 시작 시(init)과 종료 시에 removeEventListener를 사용하여, 이벤트 리스너를 제거하여 문제를 해결하였다.
점수 순위 보여주는 부분이 작동은 하지만 그냥 점수 순위를 나타내는 것에만 치중해 코드가 지저분한 것 같다. 다른 방법을 추가로 찾아봐야할 것 같다. (유저명을 입력받고 각 유저에 따라 점수를 저장하는 방식으로)
css를 좀 더 익숙하게 다룰 수 있게 공부를 해야겠다.
모듈이나 컴포넌트에 대해 공부하기!