앞선 스프라이트 시트 설명 글에 이어서, 이번 글에서는 Vue.js를 사용해 스프라이트 시트를 재생하는 코드를 구현하는 방법을 알아보겠습니다.
yarn create vue
yarn
yarn format
yarn dev
<template>
<!-- spriteStyle을 사용하여 div 요소를 렌더링, 이 div는 애니메이션 스프라이트 시트가 표시될 영역입니다. -->
<div :style="spriteStyle"></div>
</template>
<script>
export default {
// 컴포넌트의 속성(props)을 정의
props: {
frameWidth: {
type: Number,
required: true // 각 프레임의 너비
},
frameHeight: {
type: Number,
required: true // 각 프레임의 높이
},
totalFrames: {
type: Number,
required: true // 스프라이트 시트에서의 전체 프레임 수
},
animationSpeed: {
type: Number,
default: 100 // 애니메이션의 속도(밀리초 단위)이며, 기본값은 100ms입니다.
},
spriteSheet: {
type: String,
required: true // 스프라이트 시트 이미지
},
scale: {
type: Number,
default: 1 // 이미지 확대/축소 배율로, 기본값은 1(원본 크기)입니다.
}
},
data() {
// 컴포넌트의 반응형 데이터를 정의합니다.
return {
currentFrame: 0 // 현재 애니메이션에서 보여지는 프레임의 인덱스
}
},
computed: {
// 계산된 속성으로, div의 스타일을 동적으로 설정합니다.
spriteStyle() {
return {
width: `${this.frameWidth}px`, // div의 너비를 프레임 너비로 설정
height: `${this.frameHeight}px`, // div의 높이를 프레임 높이로 설정
backgroundImage: `url(${this.spriteSheet})`, // 스프라이트 시트 이미지를 배경으로 설정
backgroundPosition: `-${this.currentFrame * this.frameWidth}px 0px`, // 현재 프레임에 따라 배경 이미지의 위치를 조정
backgroundRepeat: 'no-repeat', // 배경 이미지가 반복되지 않도록 설정
transform: `scale(${this.scale})`, // 이미지의 크기를 설정된 scale 값으로 조정
transformOrigin: 'top left' // 변환의 기준점을 왼쪽 상단으로 설정
}
}
},
mounted() {
// 컴포넌트가 DOM에 마운트된 후 애니메이션을 시작합니다.
this.startAnimation()
},
beforeUnmount() {
// 컴포넌트가 DOM에서 제거되기 전에 애니메이션을 중지합니다.
this.stopAnimation()
},
methods: {
// 애니메이션을 시작하는 메소드
startAnimation() {
// 일정 시간 간격마다 currentFrame을 증가시킴으로써 애니메이션 효과를 구현
this.animationInterval = setInterval(() => {
this.currentFrame = (this.currentFrame + 1) % this.totalFrames
// currentFrame이 totalFrames를 넘지 않도록 모듈러 연산 사용
}, this.animationSpeed)
},
// 애니메이션을 중지하는 메소드
stopAnimation() {
// 애니메이션을 중지하기 위해 setInterval을 해제
clearInterval(this.animationInterval)
}
}
}
</script>
<style scoped>
/* div의 스타일을 정의하며, 오버플로우된 콘텐츠가 보이지 않도록 숨깁니다. */
div {
overflow: hidden;
}
</style>
<template>
<!-- 최상위 div 요소로, 애플리케이션의 루트 요소입니다. -->
<div id="app">
<!-- SpriteAnimator 컴포넌트를 호출, 애니메이션 속성들을 전달합니다. -->
<SpriteAnimator
:frameWidth="24"
:frameHeight="24"
:totalFrames="48"
:animationSpeed="150"
:spriteSheet="spriteSheetPath"
:scale="2"
/>
</div>
</template>
<script>
// SpriteAnimator 컴포넌트를 불러옵니다.
import SpriteAnimator from './components/SpriteAnimator.vue'
// 애니메이션에 사용할 스프라이트 시트 이미지를 불러옵니다.
import girlSheet from '@/assets/Girl-Sheet.png'
export default {
name: 'App', // 이 컴포넌트의 이름을 'App'으로 설정합니다.
components: {
// SpriteAnimator 컴포넌트를 등록하여 이 컴포넌트 내에서 사용 가능하게 합니다.
SpriteAnimator
},
data() {
// 컴포넌트의 데이터 속성으로, 스프라이트 시트의 경로를 저장합니다.
return {
spriteSheetPath: girlSheet // 스프라이트 시트 이미지 경로를 지정
}
}
}
</script>
흥미롭네요.. 한번해봐야지