오브젝트 시각 구성 및 애니메이션 구조
개요
이 문서는 CSpriteComponent와 CVFXComponent를 통해 오브젝트의 시각적 요소와 애니메이션 동작 구조를 설명합니다. 리소스 관리, 얕은 복사 기반 애니메이션 독립성, 시각 효과 제어를 통해 오브젝트의 시각 요소가 일관되고 유연하게 동작하는 과정을 다룹니다.
오브젝트와 시각적 컴포넌트의 리소스 관계도
/Block-References/01_Game-Projcets/Self-Made-Game-Framework/Source/Object-Visual-Components--and--Animation-Structure_Kor.png)
여러 오브젝트가 같은 애니메이션을 공유하면 동작이 동기화되어 동시에 실행되므로 개별 제어를 위해 얕은 복사 방식을 사용하며, 텍스처는 std::shared_ptr를 사용해 여러 컴포넌트에서 공유합니다.
클래스 목록 및 설명
1. CAnimationManager & CTextureManager 클래스
- 역할:
CAnimationManager와CTextureManager는 각각 애니메이션과 텍스처 리소스를 키 기반으로 로드하고 저장하며, 요청 시 해당 리소스를 제공하고 수명을 관리하는 리소스 매니저입니다.
2. CAnimation 클래스 | 저장소 보기
class CAnimation { friend class CAnimationManager; friend class CSpriteComponent; friend class CVFXComponent; public: CAnimation(); ~CAnimation(); protected: std::unordered_map<EAnimationState, std::shared_ptr<FAnimationData>> mAnimationStates; EAnimationState mCurrentState; // for EAnimationType::MOVE CTransform* mTransform; FVector2D mPrevPos; // for EAnimationType::MOVE & EAnimationType::TIME float mFrameInterval; int mCurrIdx; bool mLooped; private: void Update(float deltaTime); void Release(); CAnimation* Clone() const; public: const SDL_Rect& GetFrame(); bool IsPlayedOnce() const; void ResetPlayedOnce(); EAnimationState GetState() const; void SetState(EAnimationState state); void AddState(EAnimationState state, std::shared_ptr<FAnimationData> data); };
- 역할:
- 애니메이션 상태와 프레임 데이터를 관리하며,
EAnimationType::TIME은 시간 경과에 따라,EAnimationType::MOVE은 이동 거리에 따라 프레임을 전환합니다. - 얕은 복사를 통해 개별 객체를 생성해, 각 오브젝트가 독립적으로 애니메이션을 재생합니다.
- 애니메이션 상태와 프레임 데이터를 관리하며,
- 핵심 변수:
mAnimationStates:- 각 애니메이션 상태 키(EAnimationState)에 대응하는 데이터(FAnimationData)를 저장하는 컨테이너입니다.
- 핵심 함수들:
- void Update(float deltaTime):
- 현재 상태의 타입(
TIME또는MOVE)에 맞춰 애니메이션 로직을 수행합니다.
- 현재 상태의 타입(
- CAnimation* Clone():
- 얕은 복사로 애니메이션 객체를 복제합니다.
- void SetState(EAnimationState state):
- 애니메이션 상태 전환 및 프레임 인덱스를 초기화합니다.
- void Update(float deltaTime):
3. CSpriteComponent 클래스 | 저장소 보기
class CSpriteComponent : public CComponent { public: CSpriteComponent(); virtual ~CSpriteComponent(); private: std::shared_ptr<CTexture> mTexture; CAnimation* mAnimation; SDL_Rect mFrame; SDL_RendererFlip mFlip; private: virtual void Update(float deltaTime) final; virtual void Render(SDL_Renderer* renderer) final; virtual void Release() final; public: std::shared_ptr<CTexture> GetTexture() const { return mTexture; } CAnimation* GetAnimation() const { return mAnimation; } void SetTexture(const std::string& key); void SetAnimation(const std::string& key); void SetFrame(const std::string& key); void SetFlip(SDL_RendererFlip flip) { mFlip = flip; } private: const SDL_Rect& GetFrame() const; SDL_Rect GetDest() const; bool IsVisibleToCamera() const; SDL_Rect GetCameraSpaceRect() const; };
- 역할:
- 오브젝트의 스프라이트를 렌더하는 컴포넌트입니다.
- 렌더링 시 카메라 컬링을 수행하여 화면에 보이는 경우에만 렌더합니다.
- 단일 프레임과 CAnimation을 통한 애니메이션 프레임을 모두 지원합니다.
- 핵심 변수들:
mTexture:std::shared_ptr로 관리되는 텍스처 리소스입니다.
mAnimation:- 오브젝트마다 클론된 애니메이션 객체입니다.
- 핵심 함수들:
- void Update(float deltaTime):
- 애니메이션이 있을 경우, 애니메이션을 업데이트합니다.
- void Render(SDL_Renderer* renderer):
- 카메라 컬링을 통과한 경우, 단일 프레임 또는 애니메이션 프레임을 가져와 카메라 좌표로 변환된 영역에 렌더합니다.
- void SetTexture(const std::string& key):
CTextureManager에서 지정된 키에 해당하는 텍스처를 컴포넌트에 저장합니다.
- void SetFrame(const std::string& key):
CSpriteManager에서 지정된 키에 해당하는 단일 프레임을mFrame에 저장합니다.
- void SetAnimation(const std::string& key):
CAnimationManager에서 지정된 키에 해당하는 애니메이션을 가져와 Clone()으로 복제한 뒤mAnimation에 저장합니다.
- void Update(float deltaTime):
4. CVFXComponent 클래스 | 저장소 보기
class CVFXComponent : public CComponent { public: CVFXComponent(); virtual ~CVFXComponent(); private: std::shared_ptr<CTexture> mTexture; CAnimation* mAnimation; bool mPlayVFX; private: virtual void Update(float deltaTime) final; virtual void Render(SDL_Renderer* renderer) final; virtual void Release() final; public: std::shared_ptr<CTexture> GetTexture() const { return mTexture; } CAnimation* GetAnimation() const { return mAnimation; } void SetTexture(const std::string& key); void SetAnimation(const std::string& key); void PlayVFX(const FVector2D& pos); private: SDL_Rect GetDest() const; bool IsVisibleToCamera() const; SDL_Rect GetCameraSpaceRect() const; };
- 역할:
- 오브젝트의 시각 효과 애니메이션을 재생하는 컴포넌트입니다.
- 렌더링 시 카메라 컬링을 수행하여 화면에 보이는 경우에만 렌더합니다.
- 시각적 효과는 재생 중에만 렌더되며, 완료될 때까지 다음 효과는 시작되지 않습니다.
- 핵심 변수들:
mTexture:std::shared_ptr로 관리되는 텍스처 리소스입니다.
mAnimation:- 오브젝트마다 클론된 애니메이션 객체입니다.
mPlayVFX:- 현재 VFX 재생 여부 플래그입니다.
- 핵심 함수들:
- void Update(float deltaTime):
- VFX가 재생 중이 아닐 때, 애니메이션이 있을 경우, 애니메이션을 업데이트합니다.
- void Render(SDL_Renderer* renderer):
- VFX가 재생 중이 아닐 때, 카메라 컬링을 통과한 경우, 애니메이션 프레임을 가져와 카메라 좌표로 변환된 영역에 렌더합니다.
- void SetTexture(const std::string& key):
CTextureManager에서 지정된 키에 해당하는 텍스처를 컴포넌트에 저장합니다.
- void SetAnimation(const std::string& key):
CAnimationManager에서 지정된 키에 해당하는 애니메이션을 가져와 Clone()으로 복제한 뒤mAnimation에 저장합니다.
- void PlayVFX(const FVector2D& pos):
- VFX가 재생 중이 아닐 때, 매개변수
pos위치에 시각 효과를 재생합니다.
- VFX가 재생 중이 아닐 때, 매개변수
- void Update(float deltaTime):
맺는 말
스프라이트 컴포넌트(CSpriteComponent)와 시각 효과 컴포넌트(CVFXComponent)를 사용하면 오브젝트의 시각적 요소를 효율적이고 유연하게 관리합니다.
std::shared_ptr로 관리되는 텍스처 구조는 리소스를 최적화하고 얕은 복사로 클론된 애니메이션은 오브젝트 단위로 독립 제어가 가능합니다.