๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/HandTris

[HandTris] #7. ์ƒ๋Œ€ ํ™”๋ฉด์— ๋ธ”๋Ÿญ ์ž”์ƒ์ด ๋‚จ๋Š” ์ด์Šˆ ํ•ด๊ฒฐ - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)

seungineer = seungwoo + engineer 2024. 7. 12. 04:54

์›น์บ ์„ ์ด์šฉํ•œ ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ์„ ๋•Œ Phaser.js์™€ ๊ฐ™์€ 2D ๊ฒŒ์ž„ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ƒ ํ˜น์€ HTML5์˜ Canvas๋ฅผ ์ด์šฉํ•ด์„œ Javascript๋กœ ๊ตฌํ˜„์„ ํ•  ๊ฒƒ์ด๋ƒ ๊ฒฐ์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ HTML5์˜ Canvas๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Canvas๋กœ ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•˜๊ณ , 2D ๊ฒŒ์ž„ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ž๋ฃŒ๊ฐ€ ๋งค์šฐ ์ ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ตœ๊ทผ์—๋Š” ์›น์—์„œ ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ HTML5๊ฐ€ ์•„๋‹Œ Unity๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ํƒ๋˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

Canvas์— ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋‹ˆ ์ด์ค‘ for๋ฌธ์œผ๋กœ ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ ํ…ŒํŠธ๋ฆฌ์Šค ๋ณด๋“œ๋ฅผ ๊ทธ๋ฆฌ๊ณ , '์ƒ‰์„ ์น ํ–ˆ๋‹ค, ์•ˆ ์น ํ–ˆ๋‹ค' ํ•˜๋Š” ๋“ฑ์˜ ๋ฐ˜๋ณต ์ž‘์—…์„ ์›น์— ์ž์ฃผ ์‹œ์ผœ์•ผ ํ–ˆ๋‹ค. ์ƒํ™ฉ์ด ์ด๋ ‡๋‹ค๋ณด๋‹ˆ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋„ ๋งŽ๊ณ , ์ฝ”๋“œ๋„ ์ ์  ๋ณต์žกํ•ด์กŒ๋‹ค.

 

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ƒ๋Œ€ ํ™”๋ฉด์— ์ž”์ƒ์ด ๋‚จ๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

1. ์ƒํ™ฉ ํŒŒ์•… ๐Ÿค”

์šฐ์ธก์˜ ๋‚ด๋ ค์˜ค๋Š” ๋ธ”๋Ÿญ ์ค‘ ์ž”์ƒ์ด ๋‚จ๋Š” ๋ธ”๋Ÿญ์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Œ

๊ฒŒ์ž„์ด๋‹ค๋ณด๋‹ˆ ๋™์ผํ•œ ๋ฒ„๊ทธ ์ƒํ™ฉ์„ ์žฌํ˜„ํ•˜๋Š” ๊ฒŒ ์–ด๋ ค์› ๋‹ค. ํ™”๋ฉด ๋…นํ™”๋ฅผ ํ•˜์—ฌ ์˜์ƒ์„ ๋Œ๋ ค๋ณด๋ฉด์„œ ์ž”์ƒ์ด ์ƒ๊ธฐ๋Š” ์ด์Šˆ์— ๋Œ€ํ•ด์„œ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค.

2. ์›์ธ ํŒŒ์•…

์ž”์ƒ์˜ ํ˜•ํƒœ๊ฐ€ ๋ฒ„๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค. ์œ„์˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์ž”์ƒ์€ '์ขŒ'์—์„œ '์šฐ'๋กœ, '์œ„'์—์„œ '์•„๋ž˜'๋กœ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž”์ƒ์„ ๊ทธ๋ฆฐ ๋ธ”๋Ÿญ์ด๋“ , ๋‹ค๋ฅธ ๋ธ”๋Ÿญ์ด๋“  ๊ทธ ์ž๋ฆฌ๋ฅผ ์ง€๋‚˜๋ฉด์„œ ์ž”์ƒ์„ ์ง€์šด๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•œ ๊ฐ€์ง€ ํŠน์ง•์€ ๊ณต๊ฒฉ์„ ๋ฐ›์€ ํ›„์— ์ž”์ƒ์ด ๊ทธ๋ ค์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

3. ์›์ธ

  addBlockRow = () => {
    const newRow = new Array(this.COL).fill("grey");
    const randomIndex = Math.floor(Math.random() * this.COL);
    newRow[randomIndex] = this.VACANT;

    this.board.push(newRow);
    this.board.shift();
    this.drawBoard();
    this.board_forsend.push(newRow);
    this.board_forsend.shift();
  };

 

newRow ๋ฐฐ์—ด์— "grey" color๋กœ fill ํ•˜์—ฌ ๊ณต๊ฒฉ์„ ๋ฐ›์Œ์œผ๋กœ์„œ ์ถ”๊ฐ€๋˜๋Š” ๋ธ”๋Ÿญ์„ ๋งŒ๋“ค๊ณ , ๋žœ๋คํ•˜๊ฒŒ ํ•œ ์นธ์„ ๊ณต๋ฐฑ ์ƒ‰์ƒ์œผ๋กœ ์น ํ•˜์—ฌ ํ•œ ์ค„์ด ์™„์„ฑ๋˜์–ด ์ž๋™์œผ๋กœ clear๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ ์•„๋ž˜์— board ๋ฐฐ์—ด ๋ฐ board_forsend ๋ฐฐ์—ด๋กœ  push ๋ฐ shift ํ•˜์—ฌ ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

์ฆ‰, addBlockRow() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด board_forsend ๋ฐฐ์—ด์— ๊ณต๊ฒฉ ๋ธ”๋Ÿญ์ด ์ถ”๊ฐ€๋œ๋‹ค.

*board_forsend ๋ฐฐ์—ด์— ๊ณต๊ฒฉ ๋ธ”๋Ÿญ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ์ƒ๋Œ€ํŽธ์— ๋‚˜์˜ ํ…ŒํŠธ๋ฆฌ์Šค ๋ณด๋“œ๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ, ๊ณต๊ฒฉ ๋ฐ›์•˜์Œ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

        wsManagerRef.current?.subscribe(
          `/user/queue/tetris/${roomCode}`,
          (message: {
            board: TetrisBoard;
            isEnd: boolean;
            isAttack: boolean;
          }) => {
            if (tetrisGameRef.current) {
              if (message.isEnd) {
                tetrisGameRef.current.gameEnd = true;
                backgroundMusic.pause();
                playSoundEffect("/sounds/winner.wav");
                setGameResult("you WIN!");
              }
              if (message.isAttack) {
                tetrisGameRef.current.addBlockRow();
              }
              tetrisGameRef.current.drawBoard2(message.board);
            }

addBlockRow() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์€ ์œ„์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. WebSocket์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๊ธฐ์— call back ํ•จ์ˆ˜๋กœ message๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด, message ๋‚ด์˜ 'isAttack' ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜์—ฌ true์ธ ๊ฒฝ์šฐ ๊ณต๊ฒฉ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

 

  fill(color: string, isGhost: boolean = false) {
    for (let r = 0; r < this.activeTetromino.length; r++) {
      for (let c = 0; c < this.activeTetromino[r].length; c++) {
        if (this.activeTetromino[r][c]) {
          if (!isGhost) {
            if (this.y + r >= 0 && this.x + c >= 0) {
              this.game.board_forsend[this.y + r][this.x + c] = color;
            }
          }
          this.game.drawSquare(
            this.game.ctx,
            this.x + c,
            this.y + r,
            color,
            isGhost,
          );
        }
      }
    }
  }

๋งˆ์ง€๋ง‰์œผ๋กœ board_forsend ๋ฐฐ์—ด์— color ๋ฌธ์ž์—ด์„ ๋‹ด๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ์œ„์™€ ๊ฐ™๋‹ค. ๋กœ์ง์€ '๋‚˜์˜ ํ…ŒํŠธ๋ฆฌ์Šค ๋ณด๋“œ'์— ์ƒ‰์„ fill ํ•˜๋ฉด์„œ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ๋‚˜์˜ 'ํ…ŒํŠธ๋ฆฌ์Šค ๋ณด๋“œ' ์ƒํƒœ๋ผ๊ณ  ์•Œ๋ ค์ค„ ๋ณ€์ˆ˜์— ์ƒ‰์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

4. ์ •๋ฆฌ

๋„ค๋ชจ ๋ธ”๋Ÿญ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด 3ํ–‰์— ์žˆ๋˜ ๋ธ”๋Ÿญ ๋‘ ๊ฐœ๊ฐ€ newRow ๋ฐฐ์—ด์ด ์ถ”๊ฐ€๋˜๋ฉฐ 2ํ–‰์œผ๋กœ ๋‚ด๋ ค๊ฐ

3๋ฒˆ์˜ ์›์ธ์œผ๋กœ ๋ฏธ๋ฃจ์–ด ๋ณด์•„ fill ํ•จ์ˆ˜๋กœ board_forsend ๋ฐฐ์—ด์— color๋ฅผ ํ• ๋‹นํ•œ ํ›„ addBlockRow() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋ฉด, ํ˜ธ์ถœ ์‹œ ๋ถ€ํ„ฐ index๊ฐ€ 1์”ฉ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ 3ํ–‰์— ์žˆ๋˜ ๋ธ”๋Ÿญ์ด ๋–จ์–ด์ง€๋ฉด์„œ ๊ธฐ์กด 4ํ–‰์˜ ๋ธ”๋Ÿญ์„ ์ง€์šฐ๊ณ  ๋–จ์–ด์ง„๋‹ค.

5. ์šฐํšŒ(?)

์œ„ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•œ ๊ฒƒ์€ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ๋ฐœํ‘œ ์ „๋‚  ๋ฐค์ด์—ˆ๋‹ค. ์ƒ๋‹น ์ˆ˜ ๋กœ์ปฌ์—์„œ ํ˜ผ์ž ๊ฒŒ์ž„์„ ํ…Œ์ŠคํŠธํ•˜๋‹ค๋ณด๋‹ˆ ์ž”์ƒ์ด ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชป ํ•˜์˜€๋‹ค. ์‹œ๊ฐ„์ด ์–ผ๋งˆ ์—†์—ˆ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์•ˆ ์ค‘ ๊ทธ๋‚˜๋งˆ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋จผ์ € ์‹œ๋„ํ•˜์˜€๋‹ค.

'๐Ÿงญ KAIST JUNGLE > HandTris' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[HandTris] #9. ๊ฒŒ์ž„๋‹ต๊ฒŒ ์ดํŽ™ํŠธ๋ฅผ ๋„ฃ์–ด ๋ณด์ž! - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.07.28
[HandTris] #8. WebSocket์ด ์ค‘๋ณต ์—ฐ๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿค” - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (4) 2024.07.23
[HandTris] #6. Failed to send message to ExecutorSubscribableChannel[clientInboundChannel] - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.07.08
[HandTris] #5. .env ์ ์šฉ์ด ์•ˆ ๋  ๋•Œ.. - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.07.04
[HandTris] #4. ์›น์บ  ํ™”๋ฉด์„ ๊ฐ€๋ ค ๋ณด์ž - (์† ๋™์ž‘์œผ๋กœ ํ•˜๋Š” ์˜จ๋ผ์ธ ์›น ํ…ŒํŠธ๋ฆฌ์Šค ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ)  (0) 2024.06.30