2014-06-18 4 views
2

스프라이트 시트의 문자에 대해 5 프레임 실행 애니메이션이 있습니다. 이 캐릭터에 선글라스, 모자 등의 여러 가지 "업그레이드"를 제공하고 싶습니다.이 작업을 수행하는 "올바른 방법"을 알지 못하므로 여기에 내가 한 작업이 있습니다.Cocos2dx에서 여러 스프라이트 애니메이션 조정

스프라이트 그 자체를 추가하고 캐릭터를 먼저 추가 한 다음 모자를 맨 위에 추가했습니다. 모자이크가 스프라이트 시트의 해당 문자 머리에있을 수있는 위치에 대한 5 프레임 애니메이션이 있으며 주인공과 동일한 매개 변수로 애니메이션을 적용 할 수 있습니다.

문제는 두 스프라이트를 동시에 (문자 스프라이트와 모자 스프라이트)에 애니메이션을 적용하려고하면 동기화되지 않는 것입니다. 때로는 위대한 작품이지만, 때로는 타이밍이 약간 모자라는데, 머리가 모자 꼭대기를 지나갈 정도로 모자라거나, 모자가 매 단계마다 튀어 나오게됩니다.

현재의 솔루션은 업데이트 틱이 있어야하며 몇 밀리 초가 지나면 수동으로 프레임을 순환해야합니다. 그러나 수동으로 프레임을 설정하고 있기 때문에 프레임 시간을 늘리는 것이 좋습니다. 필요합니다.

그래서 스프라이트 시트에 모자이크 스프라이트 시리즈를 사용하지 않고 모자를 스프라이트에 추가하고 함께 애니메이션을 유지하는 것이 올바른 방법 일 수 있습니다.

편집 : 죄송합니다.이 태그는 잘못되었습니다. 분명히 cocos2dx 질문이라는 사실에도 불구하고이 "cocos2dx"에 태그를다는 데 충분한 평판이 없습니다.

+0

은'hat' 스프라이트'문자'의 자식입니다. – GameDeveloper

+0

아니요, 문자 스프라이트와 모자 스프라이트가 모두 내 .h 파일에 선언 된 빈 "클래스 MovingObjects : public Layer {}"에 추가됩니다. 그 다음 장면에 추가되었습니다. 각 스프라이트에서 2 개의 동시 애니메이션을 트리거 할 때 동기식으로 나오지 않으므로 지금은 변수 "_timeToTriggerNextFrame"을 설정하고 getTimeTick()이이를 초과하면 수동으로 각각의 프레임을 설정합니다. "_currentRunFrame ++"변수를 사용하고 setSpriteFrame을 사용하여 각각에 대해 다음 프레임을 수동으로 설정합니다. 그것의 기능적이지만 아마도 더 좋은 방법이 있습니다. – redux

답변

1

글쎄 만약 내가 같은 상황이 다른 캐릭터에 대한 다른 애니메이션을 다른 spritesheets 복용으로 이동합니다, 그런 식으로 두 개의 다른 애니메이션 pluse 필요가 없습니다 최고의 효과를 위해 스프라이트를 조정할 수 있습니다 그리고 그것은 ' 다른 애니메이션과의 인터페이싱, 문제는 업그레이드에 따라 다른 스프라이트를 만들어야한다는 것입니다.

+0

바이퍼, 제안에 감사드립니다! 만약 우리가 좋은 해결책이 될만한 선형 업그레이드가 1 ~ 2 개라면 10 개의 장갑, 10 개의 장갑, 10 개의 바지, 10 개의 장갑, 10 개의 부츠를 말하면 10 만개의 스프라이트 시트를 말하고, 캐릭터 머리카락의 색깔을 바꾸고 싶다면 100,000 스프라이트 시트를 다시해야합니다. 여러 부분으로 구성된 문자를 애니메이트하고 동기를 유지하는 방법이 있어야합니다. – redux

+0

Spine (Paid)을 사용하여 스켈레톤 애니메이션으로 이동하는 것보다 너무 많은 스프라이트가있는 경우 척추를 사용하여 애니메이션을 생성하고 프로젝트에서 사용하기 위해 내 보내면 .png 파일, .json 파일 및 .atlas 파일을 사용하게됩니다 캐릭터 애니메이션의 경우 가장 좋은 점은 하나의 애니메이션 파일에 여러 개의 애니메이션을 포함 할 수 있으며 이름으로 호출 할 수 있으며 애니메이션은 스프라이트 애니메이션보다 훨씬 부드럽습니다. 내가 걷는 것을 수행하고 애니메이션을 공격해야하는 나의 게임에서이 게임을 사용하고 있습니다. 그럴 가치가 있습니다. testCpp에서 예제를 볼 수 있습니다. 그게 너를 위해서 일하는 지 알려줘. – Viper

+0

나는 돈을 버는 것에 반대하지 않는다. 그러나 이것이 산탄 총으로 모기를 쏘고있는 것처럼 느껴진다. 모든 종류의 게임에서 이런 종류의 일들을 보았을 때 간단한 해결책이 필요하다. 슈퍼 닌텐도 데이트. 캐릭터가 100 만개의 게임 중 칼 중 하나를 집어 들었을 때 어떻게 손에 붙였습니까? – redux

1

어떤 종류의 애니메이션을 사용하고 있습니까?

스켈레톤을 사용하여 애니메이트하는 것이 좋습니다. 이 방법은 다른 스프라이트로 바디 부분을 대체하는 것이 매우 쉽습니다. TestCpp에는 CocoStudio (무료) 또는 Spine (유료)를 사용하여 스켈레톤 애니메이션의 몇 가지 예가 있습니다. 무기가 교체되는 애니메이션의 예가 있습니다.

표준 프레임 애니메이션을 고수해야하는 경우, 아무것도 대체하지 않으면 두 프레임이 같은 프레임에서 시작해야합니다. 그렇지 않으면 0이 아닌 키 프레임에있을 때 모자를 교체하면 애니메이션이 동기화되지 않습니다. 한 가지 해결책은 두 애니메이션을 모두 다시 시작하는 것입니다. 다른 하나는 본문 애니메이션의 현재 프레임을 확인하고 그 프레임에서 모자 애니메이션을 시작하도록 강제하는 것입니다.

+0

나는 스켈레톤 애니메이션이 대부분 3D 작업이었고 조립하기가 훨씬 더 복잡하다는 인상을 받았다. 나는 손으로 그린 ​​스프라이트에 애니메이션을 적용하고 액세서리를 추가하려고합니다. – redux

+0

Terraria에 익숙한 사람이라면 추가 할 수 있습니다. 좋은 예입니다. 기본 2 프레임 스프라이트로 실행되지만 수십 가지의 파워 업과 무기가 있습니다. – redux

+0

2D 또는 3D가 동일하므로 1 차원이 작아서 더 간단합니다. 앞서 설명한 것처럼 골격 애니메이션의 가장 큰 장점 중 하나는 하나의 정적 스프라이트가 뼈를 통해 할당되고 애니메이션된다는 점입니다. 이를 통해 스프라이트를 쉽게 대체 할 수 있으며 게임의 메모리 (및 크기)를 줄일 수 있습니다. 전통적인 프레임 애니메이션을 고수한다면 추가하려는 모든 천 조각에 대해 동기화 된 애니메이션을 만들어야합니다. – GuillermoMP

1

좋아, 결국 큰 캐릭터 개체를 모으는 모든 스프라이트는 함께 float "_lastFrameUpdateTick"및 int "_lastFrameNumber"클래스에 넣어집니다. 내 업데이트 (dt)에서 _lastFrameNumber에 대해 각 스프라이트에 대한 전환 사례가 있으므로 현재 시간 틱이 _lastFrameUpdateTick + 프레임의 표시 시간을 지나면 다음 프레임 번호 (해당 클래스의 모든 스프라이트를 업데이트해야 함)를 알 수 있습니다. 예를 들어, 캐릭터가 말의 뒤쪽에서 위아래로 튀고있는 경우를 위해 수동으로 스프라이트 상대 위치를 수동으로 이동할 수 있습니다. 이것은 모든 애니메이션의 스프라이트 시트에 반복적으로 모자의 복사본을 넣어야합니다 (아마 plist로 가짜 일 수 있습니다).또한 특정 프레임을 다른 프레임보다 약간 길게 또는 더 짧게 표시하고 이벤트에 따라 애니메이션 시퀀스를 명시 적으로 건너 뛸 수있는 이점이 있습니다 (지진이 있고 문자가 뒤로 젖은 애니메이션의 뒤쪽 부분에있는 경우). 애니메이션의 앞쪽으로 기울어 진 프레임에 있으면 앞으로 떨어집니다), 애니메이션 중단이 쉬우면서 다른 것들이 계속 실행되도록합니다. 가장 중요한 것은 수동으로 수행하면 스프라이트가 어떤 프레임에 있는지 정확히 알 수 있기 때문에 딸꾹질없이 애니메이션 사이를 부드럽게 전환 할 수 있습니다 (나는 뒤로 젖히고 앞으로 달려 가고 싶으면 끝까지 갈 필요가 있습니다. 앞으로 기울어지는 애니메이션).

나는 이것을 할 수있는 더 좋은 방법이있을 것이라고 확신하지만 나는 C++ 개발자가 아니며 작동하기 때문에 계속 진행 중이다.

관련 문제