Skip to content

pjb6510/pong-game

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž…๋ฌธ ๋„์ค‘ ์ง„ํ–‰ํ–ˆ๋˜ ํ† ์ดํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ปจ๋ฒค์…˜์ด ์ง€์ผœ์ง€์ง€ ์•Š์•˜๊ณ , ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ณธ ํ”„๋กœ์ ํŠธ๋Š”, ์ด๋ก ๋ณด๋‹ค๋Š” ์‹ค์Šต์œผ๋กœ ๋ฐฐ์šฐ๊ธธ ์ข‹์•„ํ•˜๋Š” ์ž…๋ฌธ์ž์˜ ์ž์Šต ๊ณผ์ • ์ •๋„๋กœ ๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

https://pjb6510.github.io/pong-game/pongGame.html

pong-game

main

ํด๋ž˜์‹ ํ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ํ ๊ฒŒ์ž„ ๊ณต์€ ์›๋ž˜ ๋„ค๋ชจ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ ˆํŠธ๋กœ ๊ฐ์„ฑ์ด๋‹ˆ๊นŒ.(๋„๋•)

์กฐ์ž‘

  • left player : W, S
  • right player : (๋ฐฉํ–ฅํ‚ค) โ†‘ โ†“

๊ทœ์น™

  • ์ƒ๋Œ€ ์ง„์˜์œผ๋กœ ๊ณต์„ ๋„˜๊ฒจ, ์ƒ๋Œ€๊ฐ€ ๊ณต์„ ๋ฐ›์•„๋‚ด์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋ฉด ์ ์ˆ˜๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต์€ ํŒจ๋“ค, ๋ฒฝ ๋“ฑ์— ๋ถ€๋”ช์น˜๋ฉด ์ ์  ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ๊ณต์€ ํŒจ๋“ค์— ๋ถ€๋”ช์น  ๋•Œ, ๋ถ€๋”ชํžˆ๋Š” ํŒจ๋“ค์˜ ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ค์Œ ๊ฐ๋„๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ๊ณต์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ ์  ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ์–ด๋Š ํ”Œ๋ ˆ์ด์–ด๋“  2์ , 5์ , 8์ ์ด ๋˜๋ฉด 2๊ฐœ, 3๊ฐœ, 4๊ฐœ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์Šคํฐ ๋œ ๊ณต์€ ์ ์ˆ˜๋ฅผ ์–ป์€ ํ”Œ๋ ˆ์ด์–ด ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
  • ์ด 12์ ์„ ์–ป์œผ๋ฉด ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด์Šˆ ๊ธฐ๋ก

1. this ๋ฐ”์ธ๋”ฉ

requestAnimationFrame์— this๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

//1. use bind
requestAnimationFrame(this.renderLoop.bind(this));
//2. use new function
var self = this;
requestAnimationFrame(function () {
  self.renderLoop();
});
//3. use ES6
requestAnimationFrame(() => {
  this.renderLoop();
});

//4. bind function in constructor
function FFT() {
  //...
  this.renderLoop = this.renderLoop.bind(this);
}

์ถœ์ฒ˜ : https://www.html5gamedevs.com/topic/20251-using-a-non-global-function-as-requestanimationframe-callback/

2. ์‚ผ๊ฐํ•จ์ˆ˜

getPosWidthAngle(angle) {
  // angle ๊ณ„์‚ฐ ๋ฐฉํ–ฅ์ด ์—ญ๋ฐฉํ–ฅ์ด๋ผ ๋งˆ์ด๋„ˆ์Šค ์ฒ˜๋ฆฌ.
  const xcos = Math.cos((Math.PI / 180) * -angle);
  const ysin = Math.sin((Math.PI / 180) * -angle);

  return {
    xcos,
    ysin,
  };
}

Math.cos์™€ Math.sin์— ๋„ฃ์–ด์ฃผ๋Š” ๊ฐ’์€ ๋ผ๋””์•ˆ ๋‹จ์œ„(1PI = 180๋„)์ž„์„ ๋ช…์‹ฌํ•  ๊ฒƒ.

์ €๋ ‡๊ฒŒ ๋‚˜์˜จ xcos๋ž‘ ysin์„ speed์™€ ๊ณฑํ•ด์ค€ ํ›„ ๊ธฐ์กด ์ขŒํ‘œ์— ๋”ํ•ด์ค„ ๊ฒƒ.

3. ์ž”์ƒ

issue3-1

๋ถ„๋ช…ํžˆ clearRect๋ฅผ ์ •ํ™•ํ•œ ์ˆ˜์น˜๋กœ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ๋„ ๋Œ€๊ฐ์„  ์›€์ง์ž„์—์„œ๋Š” ์ด์ „ ํ”„๋ ˆ์ž„์—์„œ ๊ทธ๋ ค์ง„ ์‚ฌ๊ฐํ˜•์ด ์ œ๋Œ€๋กœ ์ง€์›Œ์ง€์ง€ ์•Š์•˜๋‹ค. (0๋„ 90๋„ ๋“ฑ์€ ๊ดœ์ฐฎ์•˜๋Š”๋ฐ...)

ctx.clearRect(this.xPos - 1, this.yPos - 1, this.width + 2, this.height + 2);

์ด๋ ‡๊ฒŒ ์ƒํ•˜์ขŒ์šฐ๋กœ 1์”ฉ ์—ฌ์œ ๋กญ๊ฒŒ clearRect๋ฅผ ํ•ด์ฃผ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

์ € clearRect๋Š” ๊ณต์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์บ”๋ฒ„์Šค ์œ„ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๋„ ์ง€์›Œ๋ฒ„๋ฆฌ๋‹ˆ ์ถฉ๋Œ์ฒ˜๋ฆฌ๋„ ์ € ์—ฌ์œ ๊ณต๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด, ๊ณต๊ณผ ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ๊ฒน์น  ๋•Œ, ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ๊ณต์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” clearRect๋•Œ๋ฌธ์— ์ง€์›Œ์งˆ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

issue3-2

๊ณต์„ ๋ฐ›์•„๋ณด๋‹ˆ ๊ณต์„ ๋ฐ›์„๋•Œ๋งˆ๋‹ค ํŒจ๋“ค์ด ์ง€์›Œ์ง„๋‹ค.

ํŠน์ • ์š”์†Œ๋งŒ ์ง€์šฐ๋ ค๋ฉด ์บ”๋ฒ„์Šค๋ฅผ ๋‘ ๊ฒน ์ด์ƒ์œผ๋กœ ๊ฒน์นœ ๋‹ค์Œ, ๋ ˆ์ด์–ด์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ƒฅ ๋งˆ์Œ ํŽธํ•˜๊ฒŒ ๊ณต๊ณผ paddle ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ๋ถ„ํ–ˆ๋‹ค.

4. ๊ณต์˜ ์ถฉ๋Œ์ฒ˜๋ฆฌ

4-1. ์ถฉ๋Œ ์‹œ์  ํ”„๋ ˆ์ž„ ์ฒ˜๋ฆฌ

//in ball calss
horizontalBounce() {
  this.angle *= -1;
}

verticalBounce() {
  this.angle = 180 - this.angle;
}

if (this.yPos <= 0 || this.yPos + this.height >= CVS_HEIGHT) {
  this.horizontalBounce();
}

if (this.xPos <= leftPaddle.thickness || this.xPos + this.widt >= CVS_WIDTH - leftPaddle.thickness) {
  this.verticalBounce();
}

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

ํŒจ๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งจ ์œ„๋ž‘ ์•„๋ž˜๋ฅผ ์ œ๋Œ€๋กœ ๋ง‰์•„์ฃผ๋ ค๋ฉด, ๋‹ค์Œ ํ‘œ์‹œ๋  ์ขŒํ‘œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์บ”๋ฒ„์Šค ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋„˜์–ด๊ฐ€๋ฉด ๊ฐ€์žฅ์ž๋ฆฌ ๋์— ๋”ฑ ๋ถ™์–ด์žˆ๋Š” ํ”„๋ ˆ์ž„ ํ‘œ์‹œ๋ฅผ ์ •ํ™•ํžˆ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

//in paddle class
moveUp() {
  if (this.yPos <= 0) {
    return;
  }

  this.clearPaddle();

  const nextYpos = this.yPos - this.speed;
  if (nextYpos <= 0) {
    this.setPaddleLocation(0);
  } else {
    this.setPaddleLocation(nextYpos);
  }
  this.drawPaddle();
  this.movingId = requestAnimationFrame(this.moveUp.bind(this));
}
getTan(angle) {
  return Math.tan((Math.PI / 180) * angle);
}

hitHorizontalWall(nextXpos, nextYpos, topSideYpos, bottomSideYpos, leftSideXpos, rightSideXpos) {
  let restHeight;
  let restWidth;
  const tan = this.getTan(this.angle);

  // ๋ธ”๋ก ์•„๋žซ๋ฉด, ๊ณต ์œ—๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ.
  if (nextYpos <= bottomSideYpos) {
    restHeight = this.yPos - bottomSideYpos;
    this.setBallLocation(this.xPos + restHeight / tan, bottomSideYpos);
    // ๋ฐ‘๋ณ€(x) = ๋†’์ด / tan
    this.horizontalBounce();
    return true;
  }

  //๋ธ”๋ก ์œ—๋ฉด, ๊ณต ์•„๋žซ๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ.
  else if (nextYpos + this.height >= topSideYpos) {
    restHeight = topSideYpos - (this.yPos + this.height);
    this.setBallLocation(this.xPos + restHeight / -tan, topSideYpos - this.height);
    this.horizontalBounce();
    return true;
  }

  // ๋ธ”๋ก ์˜ค๋ฅธ์ชฝ๋ฉด, ๊ณต ์™ผ์ชฝ๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ.
  else if (nextXpos <= rightSideXpos) {
    restWidth = this.xPos - rightSideXpos;
    this.setBallLocation(rightSideXpos, this.yPos + restWidth * tan);
    // ๋†’์ด = ๋ฐ‘๋ณ€ * tan(angle)
    this.verticalBounce();
    return true;
  }

  // ๋ธ”๋ก ์™ผ์ชฝ๋ฉด, ๊ณต ์˜ค๋ฅธ์ชฝ๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ.
  else if (nextXpos + this.width >= leftSideXpos) {
    restWidth = leftSideXpos - (this.xPos + this.width);
    this.setBallLocation(leftSideXpos - this.width, this.yPos + restWidth * -tan);
    this.verticalBounce();
    return true;
  }

  return false;
}

๊ณต์˜ ๊ฒฝ์šฐ paddle๊ณผ ๊ฐ™์€ 1์ฐจ์› ์›€์ง์ž„์ด ์•„๋‹ˆ๋ผ 2์ฐจ์› ์›€์ง์ž„์ด๋ผ์„œ ๊ฐ๋„์— ๋”ฐ๋ฅธ ๊ฒฝ๊ณ„์— ๊ฑธ๋ฆฌ๋Š” ์ขŒํ‘œ๋ฅผ ํƒ„์  ํŠธ๋กœ ๊ณ„์‚ฐํ•ด์ค˜์•ผํ•œ๋‹ค.

4-2. ๋น ๋ฅธ ์†๋„๋กœ ์ธํ•ด ์˜ค๋ธŒ์ ํŠธ ๊ด€ํ†ต

์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ ๊ณต์ด ์žˆ์„ ์ขŒํ‘œ๊ฐ€ ํŠน์ • ์š”์†Œ(ํŒจ๋“ค์ด๋ผ๋˜๊ฐ€ ํ…Œ๋‘๋ฆฌ ๋ฒฝ์ด๋ผ๋˜๊ฐ€)์™€ ๋ถ€๋”ช์น  ์ƒํ™ฉ์ด ๋˜๋ฉด, ๊ทธ ๋ถ€๋”ช์น  ์ขŒํ‘œ๋ฅผ ํƒ„์  ํŠธ๋กœ ๊ณ„์‚ฐํ•ด์„œ ๊ณต์„ ๊ทธ ๋ถ€๋”ช์น  ์ขŒํ‘œ์— ์œ„์น˜์‹œํ‚จ ๋‹ค์Œ ๊ฐ๋„๋ฅผ ๋ฐ”๊พธ์–ด ์ง„ํ–‰์‹œํ‚ค๋Š” ์ฝ”๋“œ๋‹ค.

๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ ๊ณต์ด ์žˆ์„ ์ขŒํ‘œ๋Š” ์†๋„์™€ ๊ฐ๋„๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ณต์˜ ์†๋„๋Š” ๋‹ค๋ฆ„ ์•„๋‹ˆ๋ผ ๊ณต์˜ ํ”„๋ ˆ์ž„ ๊ฐ„ ์œ„์น˜ ๊ฐ„๊ฒฉ์ด๋‹ค. ๋งŒ์•ฝ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋นจ๋ผ์„œ ์ฆ‰ ํ”„๋ ˆ์ž„ ๊ฐ„ ์œ„์น˜๊ฐ„๊ฒฉ์ด ๋„ˆ๋ฌด ์ปค์„œ ๋ถ€๋”ช์น  ์š”์†Œ๋ฅผ ๋„˜์–ด์„ ๋‹ค๋ฉด? ๋šซ๊ณ  ์ง€๋‚˜๊ฐ„๋‹ค.

issue4-2-1

์ •์ƒ์ž‘๋™

issue4-2-2

๋„ˆ๋ฌด ๋นจ๋ผ์„œ ํ”„๋ ˆ์ž„๊ฐ„ ๊ณต์˜ ์œ„์น˜ ๊ฐ„๊ฒฉ์ด ๋„ˆ๋ฌด ํฌ๋ฉด? ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ์„œ ๊ด€ํ†ตํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ ํ”„๋ ˆ์ž„ ์ขŒํ‘œ๊นŒ์ง€์˜ ์‚ฌ์ด ์ขŒํ‘œ๋“ค์„ ์†๋„1์„ ๊ฐ€์ •ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์„œ ๊ณ„์‚ฐ๊ฐ’์œผ๋กœ ๊ฐ ๋ฉ”์†Œ๋“œ์— ๋„˜๊ฒจ์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค.

let hitBallTop = false;
let hitBallBottom = false;
let hitBallLeft = false;
let hitBallRight = false;
for (let i = 0; i < posListBetweenNextPos.length; i++) {
  hitBallTop =
    posListBetweenNextPos[i].y <= bottomSideYpos && bottomSideYpos !== null;
  hitBallBottom =
    posListBetweenNextPos[i].y + this.height >= topSideYpos &&
    topSideYpos !== null;
  hitBallLeft =
    posListBetweenNextPos[i].x <= rightSideXpos && rightSideXpos !== null;
  hitBallRight =
    posListBetweenNextPos[i].x + this.width >= leftSideXpos &&
    leftSideXpos !== null;

  if (hitBallTop || hitBallBottom || hitBallLeft || hitBallRight) {
    break;
  }
}

๋ฒฝ ์ถฉ๋Œ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์— ๋„ฃ์–ด์ค€ ์ฝ”๋“œ์ด๋‹ค. posListBetweenNextPos ๋ฆฌ์ŠคํŠธ๋Š” ํ˜„์žฌ ์ขŒํ‘œ๋ถ€ํ„ฐ ๋‹ค์Œ ์ด๋™ ์ขŒํ‘œ๊นŒ์ง€ ์‚ฌ์ด์˜ ์ขŒํ‘œ๋“ค์„ 1ํ”ฝ์…€ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๋‹ค. for๋ฌธ์„ ๋Œ๋ฉด์„œ ํ•˜๋‚˜๋ผ๋„ ์ถฉ์กฑ๋˜๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ–ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์ถฉ๋Œ์ฒ˜๋ฆฌ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

5. ํŒจ๋“ค ์•ž๋ฉด / ์˜†๋ฉด ์ฒ˜๋ฆฌ

์ด ๋ฌธ์ œ๋„ ์ถฉ๋Œ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ ์žˆ๋‹ค. ๊ณต๊ณผ ํŒจ๋“ค์˜ ์•ž๋ฉด๊ณผ ์˜†๋ฉด(๋ชจ์„œ๋ฆฌ)์˜ ์ถฉ๋Œ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ๋“  ๋”ฐ๋กœ ์ž˜ ๊ตฌํ˜„ํ•˜๊ณ ์‹ถ์—ˆ๋‹ค.

issue5

ํ•œ 3์ผ์„ ๊ณ ๋ฏผํ•ด๊ฐ€๋ฉฐ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์ˆ˜์ •ํ•œ ๊ฒฐ๊ณผ ์ตœ์ข…์ ์œผ๋กœ ์ด๋Ÿฐ ๋ชจ์–‘์„ ๋ ๊ฒŒ๋˜์—ˆ๋‹ค.

5-1. x์ขŒํ‘œ ์ถฉ๋Œ ๊ฒ€์‚ฌ

๊ณต์˜ ํ˜„์žฌ์ขŒํ‘œ๋ถ€ํ„ฐ ๋‹ค์Œ ์ด๋™์ขŒํ‘œ ์‚ฌ์ด์˜ ์ขŒํ‘œ๋“ค ์ค‘ ๊ณต์ด ํŒจ๋“ค์„ ๋ฐ”๋ผ๋ณด๋Š” x์ขŒํ‘œ(์™ผ์ชฝ ํŒจ๋“ค์ด๋ผ๋ฉด ๊ณต ์™ผ์ชฝ๋ฉด, ์˜ค๋ฅธ์ชฝ ํŒจ๋“ค์ด๋ผ๋ฉด ๊ณต ์˜ค๋ฅธ์ชฝ๋ฉด)๊ฐ€ ํŒจ๋“ค์˜ ์•ž๋ฉด x์ขŒํ‘œ๋ฅผ ๋„˜์–ด์„œ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋งŒ์•ฝ ๋„˜์–ด์„œ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ณต๊ณผ ํŒจ๋“ค์ด ์ถฉ๋Œํ•  ์—ฌ์ง€๊ฐ€ ์•„์˜ˆ ์—†๋‹ค.

5-2. y์ขŒํ‘œ ์ถฉ๋Œ ๊ฒ€์‚ฌ

๊ณต์˜ ํ˜„์žฌ์ขŒํ‘œ๋ถ€ํ„ฐ ๋‹ค์Œ ์ด๋™์ขŒํ‘œ ์‚ฌ์ด์˜ ์ขŒํ‘œ๋“ค ์ค‘ ๊ณต์˜ ์•„๋žซ๋ฉด์ด๋‚˜ ์œ—๋ฉด์ด ํŒจ๋“ค์˜ y์ขŒํ‘œ ๋ฒ”์œ„์— ๋“ค์–ด๊ฐ€๋Š” ์ขŒํ‘œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋งŒ์•ฝ ๋„˜์–ด์„œ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ณต๊ณผ ํŒจ๋“ค์ด ์ถฉ๋Œํ•  ์—ฌ์ง€๊ฐ€ ์•„์˜ˆ ์—†๋‹ค.

5-3. ์•ž๋ฉด ์ถฉ๋Œ ๊ฒ€์‚ฌ

issue5-3

x, y์ขŒํ‘œ ๊ฒ€์‚ฌ๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ–ˆ๋‹ค๋ฉด ํŒจ๋“ค์˜ ์•ž์ด๋“  ์˜†์ด๋“  ๋ถ€๋”ช์น˜๋Š”๊ฑด ํ™•์ •์ด๋‹ค. ์šฐ์„  ์•ž๋ฉด ๊ฒ€์‚ฌ๋ถ€ํ„ฐ ํ•œ๋‹ค. ํ˜„์žฌ ๊ณต์˜ ๊ฐ๋„์˜ ํƒ„์  ํŠธ ๊ฐ’์œผ๋กœ ํŒจ๋“ค์˜ ์•ž๋ฉด์— ๊ณต์ด ๋„๋‹ฌํ–ˆ์„ ๋•Œ์˜ y์ขŒํ‘œ๋ฅผ ๊ตฌํ•œ๋‹ค. (๊ฐ€์ƒ์ขŒํ‘œ) ๋งŒ์•ฝ y์ขŒํ‘œ๊ฐ€ ํŒจ๋“คy๋ฒ”์œ„์— ์žˆ์œผ๋ฉด ์•ž๋ฉด์ถฉ๋Œ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด ์˜†๋ฉด ์ถฉ๋Œ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

5-4. ์˜†๋ฉด ์ถฉ๋Œ ๊ฒ€์‚ฌ

issue5-4

x, y์ขŒํ‘œ ๊ฒ€์‚ฌ๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ–ˆ๋‹ค๋ฉด ํŒจ๋“ค์˜ ์•ž์ด๋“  ์˜†์ด๋“  ๋ถ€๋”ช์น˜๋Š”๊ฑด ํ™•์ •์ด๋‹ค. ์šฐ์„  ์•ž๋ฉด ๊ฒ€์‚ฌ๋ถ€ํ„ฐ ํ•œ๋‹ค. ํ˜„์žฌ ๊ณต์˜ ๊ฐ๋„์˜ ํƒ„์  ํŠธ ๊ฐ’์œผ๋กœ ํŒจ๋“ค์˜ ์•ž๋ฉด์— ๊ณต์ด ๋„๋‹ฌํ–ˆ์„ ๋•Œ์˜ y์ขŒํ‘œ๋ฅผ ๊ตฌํ•œ๋‹ค. (๊ฐ€์ƒ์ขŒํ‘œ) ๋งŒ์•ฝ y์ขŒํ‘œ๊ฐ€ ํŒจ๋“คy๋ฒ”์œ„์— ์žˆ์œผ๋ฉด ์•ž๋ฉด์ถฉ๋Œ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด ์˜†๋ฉด ์ถฉ๋Œ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

issue5-4-1

์˜†๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ ์ „

issue5-4-2

์˜†๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ ํ›„

6. ํŒจ๋“ค์ด ์›€์ง์ด๋ฉด์„œ ๊ณต๊ณผ ์ถฉ๋Œํ•˜๋ฉด ์ถฉ๋Œ์ฒ˜๋ฆฌ๊ฐ€ ๋‘ ํ”„๋ ˆ์ž„ ์—ฐ์†์œผ๋กœ ์ผ์–ด๋‚จ

๊ณต์€ ์–ด๋Š ์š”์†Œ์— ๋งž์•„๋„ ์š”์†Œ์˜ ๋ฐ”๊นฅ์œผ๋กœ ํŠ•๊ฒจ ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์†์œผ๋กœ ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ์— ์ถฉ๋Œํ•˜๋Š” ์ผ์€ ์ผ์–ด๋‚˜์„  ์•ˆ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณต ํด๋ž˜์Šค์— ๋งˆ์ง€๋ง‰ ํžˆํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ณ  ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ์— ์ค‘๋ณต์œผ๋กœ ์ถฉ๋Œ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ ค๊ณ  ํ•˜๋ฉด return false; ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

7. ์กฐ์ž‘๊ฐ

๋™์‹œ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ •๋ง ๋งŒ์ง€๊ธฐ ์‹ซ์€ ์กฐ์ž‘๊ฐ์ด ๋‚˜์™”๋‹ค.

๋ˆŒ๋ฆฐ ํ‚ค์— ์˜ํ•ด ๋ช…๋ น์„ ์ˆ˜ํ–‰ ๋ฐ›๋˜, ๋™์‹œ ์ž…๋ ฅ์ด ์žˆ๋‹ค๋ฉด ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž…๋ ฅ๋œ ํ‚ค์— ์˜ํ•œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค.

  • ํ‚ค ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
  • ํ‚ค๊ฐ€ ๋ˆŒ๋ฆด ๋•Œ, ํ‚ค ๋ฐฐ์—ด์— ์ž…๋ ฅํ•œ๋‹ค.
  • ํ‚ค๊ฐ€ ๋–ผ์–ด์งˆ ๋•Œ, ํ‚ค ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
  • ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ์•ก์…˜์€ ํ•ญ์ƒ ๋ฐฐ์—ด ๋งˆ์ง€๋ง‰ ํ‚ค(๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ž…๋ ฅ๋œ ํ‚ค)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉฐ, ๋™์‹œ์— ์—ฌ๋Ÿฌ ์•ก์…˜์ด ์‹คํ–‰๋˜์–ด์„  ์•ˆ ๋œ๋‹ค.

8. ๋น„๋™๊ธฐ

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

[Javascript] ๋น„๋™๊ธฐ ์Šค์ผ€์ค„๋ง๊ณผ Frame์˜ LifeCycle

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published