오브젝트 시각 구성 및 애니메이션 구조


개요

이 문서는 CSpriteComponentCVFXComponent를 통해 오브젝트의 시각적 요소와 애니메이션 동작 구조를 설명합니다. 리소스 관리, 얕은 복사 기반 애니메이션 독립성, 시각 효과 제어를 통해 오브젝트의 시각 요소가 일관되고 유연하게 동작하는 과정을 다룹니다.


오브젝트와 시각적 컴포넌트의 리소스 관계도

여러 오브젝트가 같은 애니메이션을 공유하면 동작이 동기화되어 동시에 실행되므로 개별 제어를 위해 얕은 복사 방식을 사용하며, 텍스처는 std::shared_ptr를 사용해 여러 컴포넌트에서 공유합니다.


클래스 목록 및 설명

1. CAnimationManager & CTextureManager 클래스

  • 역할:
    • CAnimationManagerCTextureManager는 각각 애니메이션과 텍스처 리소스를 키 기반으로 로드하고 저장하며, 요청 시 해당 리소스를 제공하고 수명을 관리하는 리소스 매니저입니다.

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:
  • 핵심 함수들:

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:
      • 오브젝트마다 클론된 애니메이션 객체입니다.
  • 핵심 함수들:

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 재생 여부 플래그입니다.
  • 핵심 함수들:

맺는 말

스프라이트 컴포넌트(CSpriteComponent)와 시각 효과 컴포넌트(CVFXComponent)를 사용하면 오브젝트의 시각적 요소를 효율적이고 유연하게 관리합니다. std::shared_ptr로 관리되는 텍스처 구조는 리소스를 최적화하고 얕은 복사로 클론된 애니메이션은 오브젝트 단위로 독립 제어가 가능합니다.