스프라이트 애니메이션 모범 사례


18

실제 사람들이 애니메이션을 처리하는 방식을 더 잘 처리하고 싶습니다.

하나의 큰 이미지를로드 한 다음 애니메이션 프레임을 기준으로 다른 사각형을 그리나요?

X 이미지 파일을 배열에로드하고 애니메이션 프레임을 기준으로 배열에 항목을 그리나요?

다양한 스프라이트에 대해 다른 길이의 애니메이션을 처리하는 방법은 무엇입니까?

캐릭터 걷기에 4-8 프레임이 걸리고 해변의 파도는 2-3 프레임 만 걸립니다. 그 상황을 어떻게 처리하겠습니까? 아래 참조

Dim Waves(1) as Sprite
Dim Char(5) as Sprite

Sub Animate()
     Frame += 1
     Draw Char(Frame)
     Draw Waves(Frame)
     If Frame = 5 Then Frame = 0
End Sub

분명히 Waves는 범위를 벗어난 오류로 끝날 것입니다.

또는 스프라이트가 자체 애니메이션에 대해 걱정하고 프레임에 전혀 신경 쓰지 않습니까? 각 스프라이트가 자체 애니메이션 루프를 알고 있습니까?

답변:


23

내가 과거에 한 방법은 애니메이션 데이터애니메이션 재생 에서 분리하는 것 입니다. 그러면 Animation기본적으로 배열이 될 수 있습니다Frames 애니메이션의 동작 방식 (루프 등)을 설명하는 몇 가지 속성 .

나는 일반적으로 하나의 이미지를로드하고 조각을 그립니다.

Frame애니메이션은 기본적으로 직사각형과 시간입니다. 이를 통해 일부 프레임이 다른 프레임보다 더 오래 표시 될 수 있으며, 원하는 프레임 일 수도 있고 아닐 수도 있습니다. 애니메이션의 모든 프레임을 같은 시간 동안 표시하려면 Animation개체 에 해당 프레임을 저장하십시오 .

애니메이션을 재생하는 데 필요한 것은 무엇이든을 AnimationPlayer가리킬 수 있습니다 Animation. 플레이어 객체는 애니메이션 재생을 담당하고 "현재 프레임"을 사용할 수있게합니다.

이것의 장점 Animation은 많은 객체가 동시에 다른 부분을 가리키고 재생할 수 있는 단일 인스턴스를 가질 수 있다는 것 입니다. 단순히 AnimationPlayer다른 Animation객체 를 가리키고 재생을 재설정하여 애니메이션을 쉽게 변경할 수있었습니다.

편집 : 여기 위에서 설명한 시스템의 상당히 기본적인 JavaScript 구현이 있습니다. 나는 이것을 데모 로 몇 분 안에 함께 던졌다 . "실제"코드에는 더 많은 기능이 있습니다. 그래도 작동하려면 Canvas와 Data URI를 모두 지원하는 최신 브라우저가 필요합니다.


1
그가 말한 것. 또한 스프라이트 이미지를 경계 상자에 단단히 포장 한 다음 애니메이션에서 원하는 위치에 배치 할 수 있도록 애니메이션의 각 프레임에 대해 x / y 오프셋을 갖는 것이 편리합니다. 또한 단일 이미지를 사용하여 흔들림과 같은 기본적인 작업을 수행 할 수 있습니다.
munificent

예, 전적으로 동의합니다. 사실, 내가 사용하고있는 애니메이션 시스템이이를 가능하게합니다. 이미지 데이터를 편집하지 않고도 프레임의 위치를 ​​훨씬 쉽게 변경할 수 있습니다.
Zack The Human

좋은 작업 예, WOW Thumbs up. 그것을 추천 할 것입니다.
DFectuoso

애니메이션 종류의 중요한 제한 사항은 그림을 다른 각도에서 볼 수 없다는 것입니다. 뷰어에서 멀어 지거나 뷰어를 향해 걷는 등입니다. 아니면 내가 틀렸습니까?
Majid Fouladpour

@MajidFouladpour 나는이 기술을 사용하여 어떤 종류의 제한이 있다고 생각하지 않습니다. 각 "시야각"마다 다른 AnimationData 객체가 있습니다.
잭 인간

1

프레임 수를 알고있는 애니메이션을 만들었습니다. 성능 문제를 제외하고는 저장 위치와 방법은 상대적으로 관련이 없습니다 (같은 질감에서 원하는 것처럼). 프레임 수에 1을 추가하지 않고 deltaTime * animSpeed를 추가하고 표시 할 때 해당 값을 정수로 변환합니다. 이렇게하면 애니메이션 속도를 늦추거나 빠르게 할 수 있으며 프레임 속도에 독립적입니다.

스프라이트에는 자체적으로 업데이트되는 애니메이션이 있습니다.


0

각 객체에 대해 여러 개의 프레임이 저장된 이유는 무엇입니까? 개인적으로 애니메이션의 프레임 수를 생성자의 객체에 전달한 다음 애니메이션의 프레임 수를 취하는 표준 Animate () 함수가 있습니다.


0

구현에 따라 다릅니다. 내 엔진에서는 Direct3D와 DirectDraw 모두에서 애니메이션을 수행합니다.

DirectDraw에서 하나의 큰 이미지를 만듭니다. 어쨌든 모두 시스템 메모리에 저장되어 결국 1 차원 데이터 블록이됩니다.

장점 :

  • 프레임 간 이동이 쉽습니다. 시작 포인터를 변경하고 y마다 피치 (총 이미지 너비)를 추가하면 황금색입니다.

단점 :

  • 한 프레임 만 화면에 복사 할 수 없으며 수동으로 수행해야합니다.

  • 거대한 메모리 블록. 허슬 프레임은 페널티를받습니다.

Direct3D에서는 별도의 텍스처를 사용합니다. 장치의 텍스처 제한에 대해 전혀 모르기 때문에 전체 이미지 크기의 텍스처를 지원하는지 여부를 알 수 없기 때문입니다.

장점 :

  • 프레임은 모두 별개의 요소이므로 화면에 바로 복사 할 수 있습니다.

단점 :

  • 메모리 정렬 부족

0

에서 내 게임 , 내 스프 기본 클래스 자체를 그리는 방법에 대한 지식을 준, 모든 애니메이션 요소는 지식 상속 : 메인 게임 루프 그냥 모두를 반복 등 번호와 애니메이션 프레임의 지속 시간, 화면의 위치를, 각 스프라이트가 적절하다고 생각되면 스스로 그리도록 요청합니다. 상당히 잘 작동하는 것으로 보이며 부팅하기에는 좀 더 모듈 식입니다. 다른 애니메이션 루프 (또는 더 복잡한 : 여러 애니메이션 상태)가있는 새 스프라이트를 추가하면 다시 돌아와서 Animate를 다시 작성할 필요가 없습니다. 추가 복잡성을 수용하는 () 루틴 :

Dim Waves as Sprite
Dim Char as Sprite

Sub Animate()
     Char.update()
     Waves.update()
End Sub

스프라이트의 update () 메소드가 호출 될 때마다 마지막 시간과 동일한 프레임을 다시 그리거나 현재 애니메이션의 다음 프레임으로 이동하거나 새 애니메이션으로 변경해야하는지 여부를 알고 있습니다.

Animate ()를 호출하는 빈도 만 변경되므로 다른 클럭 / 플랫폼 렌더링 속도를 수용 할 수 있도록 프레임 속도를 훨씬 쉽게 조정할 수 있다는 이점이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.