2010-01-17 7 views
4

저는 2D 애니메이션 클래스를 작성 중이며 플레이어 애니메이션이 저장된 그림이 TGA입니다. 이 그림은 8x8 타일입니다 (각 행에 8 프레임의 움직이는 캐릭터가 있습니다).2D 애니메이션을 수행하는 가장 좋은 방법은 무엇입니까?

그러나 코드에서이를 움직이는 방법에 대한 단서가 없습니다.

각 프레임을 u-v 좌표로 이동하고 현재 프레임 만 반환하여 업데이트하는 방법을 생각했습니다. 어떻게해야합니까?

답변

3

위로

모든 애니메이션 상태를 포함하는 텍스처의 UV 좌표를 사용하는 것을 보면 픽셀 좌표를 UV 좌표로 변환해야합니다.

스프라이트의 너비가 32 픽셀이고 텍스처의 너비가 256 픽셀 (따라서 8 프레임 포함) 인 경우 스프라이트의 너비를 텍스처 너비로 나누어 원하는 간격으로 지정해야합니다. 0과 1! 이것은 당신의 상쇄입니다. 스트립에서 프레임을 가져 오려면 다음을 수행하십시오.

float step_size_x = (float)(width)/(float)(texture_width); 
float step_size_y = (float)(height)/(float)(texture_height); 

float begin_u = step_size_x * step_current_x; 
float begin_v = step_size_y * step_current_y; 
float end_u = begin_x + step_size_x; // basically, if you want sprite 0, you go from 0 to the x of sprite 1 
float end_v = begin_y + step_size_y; 

그리고 그게 전부입니다! 지금은 당신에게 전체 코드 샘플을 준 것을

glBindTexture(GL_TEXTURE_2D, texture_id); 
glBegin(GL_TRIANGLE_STRIP); 
    glTexCoord2f(begin_u, begin_v); glVertex3f(x - (width/2), y - (height/2), 0); 
    glTexCoord2f(end_u, begin_v);  glVertex3f(x + (width/2), y - (height/2), 0); 
    glTexCoord2f(begin_u, end_u);  glVertex3f(x - (width/2), y + (height/2), 0); 
    glTexCoord2f(end_u, end_u);  glVertex3f(x + (width/2), y + (height/2), 0); 
glEnd(); 

, 당신이 당신의 게임에 대해 날 귀찮게 중지하십시오 것입니다 : 이제 텍스처의 일부를 복사 할 경우, 즉, OpenGL을에서 다음과 같은 것입니까? : P

2

요즘 Windows를 사용하는 경우 Direct2D 가야합니다.

+0

나는 항상 창문을 사용하지 않는다. 결국 크로스 플랫폼 게임이어야합니다. – MrFronk

+1

:) 그러므로 내 자격. – Rick

0

설명하는 내용은 2D 애니메이션보다 비디오에 가까운 것으로 들리므로 일부 비디오 코덱을 살펴 보는 것이 좋습니다.

그러나 OpenGL을 시작하는 것이 좋습니다.

아무도 최적의 솔루션이 없다 :

2

당신은 너무 여기에 일반적인 충고, 환경, 계획된 게임 디자인, 그리고 어떤 특정을 제안하는 현재의 엔진 구조에 대한 충분한 정보를 제공하지 않았습니다. 무언가를 얻은 다음 끊어지기 전까지 사용하십시오. 이것은 게임 디자인과 관련된 매우 문제이며 게임 디자인은 반복을 전제로하므로 엔진 레벨로 이터 레이션을 가져 오는 것이 좋습니다 (게이트에서 "완벽한 솔루션"을 찾아 내고 시도하기보다는). 게임 플레이의 이러한 측면을 탐색하는 가장 좋은 방법입니다. 솔루션의 다양성에 대한 몇 가지 예 : "player entity"가 어떤 상태 (예 : 도보, 점프, 유휴 상태)에있는 동안 프레임을 순환하는 것을 전제로하는 애니메이션이있는 경우 프레임을 유지합니다 카운터를 증가시키고 게임의 타임 스텝을 증가시키고 카운터에 따라 프레임을 그립니다.

다른 페이싱으로 돌리거나 선반으로 잡아 당기는 것과 같이 제대로 표시하기 위해 문맥 정보가 많이 필요한 애님이있는 경우 프레임 카운터와 함께 상태 체크를 추가하고 상태의 충분한 형태는 매 프레임마다 실행되는 유한 상태 기계로 공식화하려는 것이 좋습니다. 회전, 깜박임, 크기 조절, 쉐이더와 같은 절차적인 효과를 가질 수도 있습니다 ...

애니메이션이 게임 플레이 이벤트 (예 : 펀치 던지기)를 트리거하는 경우 해당 정보를 넣을 지 여부를 결정해야합니다 애니메이션 코드에서 직접 또는 "이 이벤트를 발생시키고이 객체를 스폰하고이 충돌 볼륨을 켜십시오"라는 데이터 기반 메커니즘을 도입 할 수 있습니다.

그런 다음 원점, 이미지 크기 일부 애니메이션의 시간이 지남에 따라 변경됨), 가변 재생 속도 ....

앞에서 말했듯이 완벽한 솔루션을 시도하지 마십시오. 그것은 게임이 필요로하는 것에 달려 있습니다.

+0

음,이 게임은 다른 애니메이션 (달리기, 점프, 유휴 등)이있는 간단한 2D 플랫폼입니다. 현재 OpenGL을 사용하고 있지만 OpenGL에 대해 많이 알고 있습니다. 저는 단순히 애니메이션에 대한 책임이 있었기 때문에 적합한 알고리즘에 대해 생각했습니다. 그러나 저는 여러분이 말한 것처럼 framecounter를 사용하여 반복 해 보겠습니다. – MrFronk

3

귀하의 질문은, 그래서 여기에 다양한 응답 매우 광범위) Qt4.6 이후

(1 개월) 이전 애니메이션 프레임 워크가있다. 매우 흥미로 웠습니다 (아직 코드를 작성하지 않아도됩니다).

Qt는 멋진 API, 다중 형식, 훌륭한 설명서 및 훌륭한 성능을 제공합니다.물론

http://qt.nokia.com/products/appdev/add-on-products/catalog/4/Utilities/qtanimationframework

, 어쩌면 당신은 Qt는에 의존하고 싶지 않아요.

+1

와우, 음, 사실 QT를 사용하고 있습니다. 그래서 한번 살펴 보겠습니다. 나는 비록 이전 버전을 사용하고 있었다고 생각한다. – MrFronk

1

실제로 화면을 그리는 관점에서 질문 할 때 SDL을 사용하면 비교적 간단하고 사용하기 쉽고 강력한 부팅이 가능합니다.
또한 Lazy Foo's 자습서는 설명서 측면에서 매우 좋습니다.

관련 문제