[SFML] 애니메이션
에니메이션 헤더파일
#pragma once
#include <SFML\Graphics.hpp>
class Anim
{
public:
Anim(sf::Texture* texture, sf::Vector2u imageCount, float switchTime);
// texture, imageCount, switchTime을 인자로 받는 Anim 클래스 생성자
~Anim();
// Anim 클래스 소멸자
void Update(int row, float deltaTime);
// 현재 애니메이션 row와 deltaTime을 인자로 받아 애니메이션 업데이트를 수행하는 함수
public:
sf::IntRect uvRect;
// 애니메이션에서 현재 보여주는 이미지의 좌표를 담고 있는 IntRect 객체
private:
sf::Vector2u imageCount;
// 애니메이션에서 이미지들의 개수를 담고 있는 Vector2u 객체
sf::Vector2u currentIamge;
// 애니메이션에서 현재 보여주는 이미지의 인덱스를 담고 있는 Vector2u 객체
float totalTime;
// 현재 애니메이션에서 경과한 총 시간을 담고 있는 float 값
float switchTime;
// 이미지 전환 주기를 담고 있는 float 값
};
위 코드는 SFML 라이브러리를 이용하여 애니메이션을 구현할 때 사용되는 Anim 클래스입니다. 클래스는 다음과 같은 멤버 변수를 가집니다: imageCount: 애니메이션에서 이미지들의 개수를 담고 있는 sf::Vector2u 객체 currentImage: 애니메이션에서 현재 보여주는 이미지의 인덱스를 담고 있는 sf::Vector2u 객체 totalTime: 현재 애니메이션에서 경과한 총 시간을 담고 있는 float 값 switchTime: 이미지 전환 주기를 담고 있는 float 값 uvRect: 애니메이션에서 현재 보여주는 이미지의 좌표를 담고 있는 sf::IntRect 객체 또한 Anim 클래스는 Anim(sf::Texture* texture, sf::Vector2u imageCount, float switchTime) 생성자와 Update(int row, float deltaTime) 함수로 구성되어 있습니다. 생성자는 애니메이션을 구성하는 이미지들의 개수와 이미지 전환 주기 등을 설정하며, Update 함수는 현재 애니메이션 상태에 따라 보여줘야 할 이미지를 계산하는 역할을 수행합니다.
애니메이션.cpp
#include "Anim.h"
// 애니메이션 클래스 생성자
// texture : 애니메이션에 사용될 텍스처 포인터
// imageCount : 텍스처 이미지 개수를 담은 2D 벡터
// switchTime : 애니메이션 갱신 간격 시간(초)
Anim::Anim(sf::Texture* texture, sf::Vector2u imageCount, float switchTime)
{
// 이미지 개수와 갱신 간격 시간을 멤버 변수에 저장
this->imageCount = imageCount;
this->switchTime = switchTime;
// 현재 이미지의 x좌표를 0으로 초기화
currentIamge.x = 0;
// 텍스처의 크기를 기반으로 애니메이션 영역의 크기 계산
uvRect.width = texture->getSize().x / float(imageCount.x);
uvRect.height = texture->getSize().y / float(imageCount.y);
}
// 애니메이션 클래스 소멸자
Anim::~Anim()
{
}
// 애니메이션 프레임 갱신 함수
// row : 애니메이션의 y축 방향 위치
// deltaTime : 갱신 간격 시간(초)
void Anim::Update(int row, float deltaTime)
{
// 현재 애니메이션의 y축 방향 위치 저장
currentIamge.y = row;
// 갱신 시간 누적
totalTime += deltaTime;
// 갱신 간격 시간을 넘어서면 애니메이션 프레임 갱신
if (totalTime >= switchTime)
{
totalTime -= switchTime;
currentIamge.x++;
// 마지막 이미지에 도달하면 처음 이미지부터 다시 시작
if (currentIamge.x >= imageCount.x)
{
currentIamge.x = 0;
}
}
// 애니메이션 영역 계산
uvRect.left = currentIamge.x * uvRect.width;
uvRect.top = currentIamge.y * uvRect.height;
}
애니메이션을 처리하기 위한 클래스인 Anim 클래스의 소스 코드입니다. 해당 클래스는 애니메이션에 필요한 텍스처, 이미지 개수, 갱신 간격 시간 등의 정보를 저장하고, 애니메이션 프레임을 갱신하여 반환하는 기능을 가지고 있습니다. 코드에서는 생성자에서 texture 포인터와 imageCount 정보, switchTime 간격 시간을 저장하고, Update() 함수에서 현재 애니메이션의 y축 방향 위치를 지정하고, 갱신 간격 시간을 누적하여 갱신 간격 시간을 넘어서면 애니메이션 프레임을 갱신합니다. 마지막 이미지에 도달하면 처음 이미지부터 다시 시작하도록 되어 있습니다.
main.cpp
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Anim.h"
int main()
{
// 윈도우 생성
sf::RenderWindow window(sf::VideoMode(1280,720), "SFML TUTORIAL", sf::Style::Close | sf::Style::Resize);
// 캐릭터 생성
sf::RectangleShape player(sf::Vector2f(100.0f, 150.0f));
player.setOrigin(50.0f, 50.0f); // 중심점 설정
// 캐릭터 텍스쳐 설정
sf::Texture playerTexture;
playerTexture.loadFromFile("tux.png");
player.setTexture(&playerTexture);
// 애니메이션 객체 생성
Anim Anim(&playerTexture, sf::Vector2u(3, 9), 0.3f);
// 델타 타임 초기화
float deltaTime = 0.0f;
// 시계 객체 생성
sf::Clock clock;
while (window.isOpen())
{
// 델타 타임 계산
deltaTime = clock.restart().asSeconds();
// 이벤트 처리
sf::Event evnt;
while (window.pollEvent(evnt))
{
switch (evnt.type)
{
case sf::Event::Closed:
window.close(); // 창 닫기 버튼 누를 때
break;
}
if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) // 마우스 왼쪽 버튼이 눌렸을 때
{
sf::Vector2i mousePos = sf::Mouse::getPosition(window); // 마우스 위치 가져오기
player.setPosition((float)mousePos.x, (float)mousePos.y); // 캐릭터 위치 변경
}
}
Anim.Update(0, deltaTime); // 애니메이션 업데이트
player.setTextureRect(Anim.uvRect); // 캐릭터 텍스쳐 위치 설정
window.clear(sf::Color::White); // 창 배경색 설정
window.draw(player); // 캐릭터 그리기
window.display(); // 화면에 그리기
}
return 0;
}
위 코드는 SFML을 사용하여 캐릭터를 마우스로 이동시키면서 캐릭터의 애니메이션을 재생하는 예제 코드입니다.
Anim 객체는 캐릭터의 애니메이션을 담당하는 클래스입니다.
playerTexture는 캐릭터 텍스쳐를 담은 객체입니다.
deltaTime는 프레임 간 시간 간격을 저장하는 변수입니다. 이 값을 사용하여 애니메이션 속도를 조절합니다.
clock 객체는 SFML에서 제공하는 시계 객체로, deltaTime을 계산하는 데 사용됩니다.
while 루프 안에서 Anim 객체의 Update 메서드를 호출하여 애니메이션을 업데이트하고, setTextureRect 메서드를 사용하여 캐릭터의 텍스쳐 위치를 정합니다.
사용한 텍스쳐입니다.
y=9 x=3이기에 update에 9,3을 전달했습니다.
Leave a comment