Create, Compete & Win at Redbrick Connect 2024! πŸŽ‰
ν…μŠ€νŠΈ μ½”λ”©λ‚΄μž₯ λͺ¨λ“ˆTWEENλ‹€μ–‘ν•œ 트윈 ν•¨μˆ˜ μ†Œκ°œ

λ‹€μ–‘ν•œ 트윈 ν•¨μˆ˜ μ†Œκ°œ

νŠΈμœˆμ„ μ‘°μž‘ν•  수 μžˆλŠ” μ—¬λŸ¬ ν•¨μˆ˜λ“€μ— λŒ€ν•΄ μ•ˆλ‚΄ν•©λ‹ˆλ‹€.

트윈 λͺ¨λ“ˆμ—λŠ” λ‹¨μˆœνžˆ νŠΈμœˆμ„ μƒμ„±ν•˜κ³  μ‹œμž‘ν•˜λŠ” 것 μ΄μ™Έμ˜ μ‘°μž‘μ„ ν•  수 μžˆλŠ” ν•¨μˆ˜λ“€μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.

.startFromCurrentValues()

νŠΈμœˆμ„ μ‹œμž‘ν•˜λŠ” λ‹€λ₯Έ 방법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. start와 달리 트윈의 λŒ€μƒμ΄ λ˜λŠ” 객체가 ν˜„μž¬ 가진 값을 μ‹œμž‘μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.

// startFromCurrentValues Example
 
let upTween;
 
function Start() {
  const startPosition = { x: 0, y: 0, z: 0 };
 
  upTween = new TWEEN.Tween(startPosition);
 
  upTween
    .to({ y: "+1" }, 1000)
 
    .onUpdate(() => {
      this.position.y = startPosition.y;
    });
}
 
// compare this two function in your project
 
function OnKeyDown(event) {
  if (event.code === "KeyM") {
    upTween.start();
  }
}
 
function OnKeyDown(event) {
  if (event.code === "KeyM") {
    upTween.startFromCurrentValues();
  }
}

.stop()

μ‹€ν–‰ν•œ νŠΈμœˆμ„ λ©ˆμΆ”κ³  싢은 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// stop Example
 
let upTween;
 
function Start() {
  const startPosition = { x: 0, y: 0, z: 0 };
 
  upTween = new TWEEN.Tween(startPosition);
 
  upTween
    .to({ y: "+5" }, 1000)
 
    .onUpdate(() => {
      this.position.y = startPosition.y;
    });
}
 
function OnKeyDown(event) {
  if (event.code === "KeyM") {
    upTween.start();
  }
 
  // if you press KeyN then this object`s tween stops.
 
  if (event.code === "KeyN") {
    upTween.stop();
  }
}

.repeat()

μ›ν•˜λŠ” 횟수만큼 νŠΈμœˆμ„ λ°˜λ³΅ν•˜κ³ μ‹Άμ€ 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// repeat Example
 
let upTween;
 
function Start() {
  const startPosition = { x: 0, y: 0, z: 0 };
 
  upTween = new TWEEN.Tween(startPosition);
 
  upTween
    .to({ y: startPosition.y + 1 }, 1000)
 
    .onUpdate(() => {
      this.position.y = startPosition.y;
    });
}
 
function OnKeyDown(event) {
  // The tween definded in Start function repeats 3 times and stops.
 
  if (event.code === "KeyM") {
    upTween.repeat(3).start();
  }
}

.chain()

μ—¬λŸ¬ 개의 νŠΈμœˆμ„ μ—°μ†μ μœΌλ‘œ μ‹€ν–‰ν•˜κ³ μ‹Άμ€ 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// chain Example
 
let upTween;
 
let downTween;
 
function Start() {
  const startPosition = { x: 0, y: 0, z: 0 };
 
  upTween = new TWEEN.Tween(startPosition);
 
  upTween
    .to({ y: "+3" }, 1000)
 
    .onUpdate(() => {
      this.position.y = startPosition.y;
    });
 
  downTween = new TWEEN.Tween(startPosition);
 
  downTween
    .to({ y: "-3" }, 1000)
 
    .onUpdate(() => {
      this.position.y = startPosition.y;
    });
}
 
function OnKeyDown(event) {
  // The downTween runs immediately after the upTween ends.
 
  if (event.code === "KeyM") {
    upTween.chain(downTween).start();
  }
}

.delay()

트윈의 싀행을 νŠΉμ •ν•œ μ‹œκ°„λ§ŒνΌ μœ μ˜ˆν•˜κ³  싢은 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// delay Example
 
let upTween;
 
let downTween;
 
function Start() {
  const startPosition = { x: 0, y: 0, z: 0 };
 
  upTween = new TWEEN.Tween(startPosition);
 
  upTween
    .to({ y: "+3" }, 1000)
 
    .onUpdate(() => {
      this.position.y = startPosition.y;
    });
 
  downTween = new TWEEN.Tween(startPosition);
 
  downTween
    .to({ y: "-3" }, 1000)
 
    .onUpdate(() => {
      this.position.y = startPosition.y;
    });
}
 
function OnKeyDown(event) {
  // The tween runs 1000 milliseconds after start is executed.
 
  if (event.code === "KeyM") {
    upTween.delay(1000).start();
  }
}