2017-09-25 6 views
0

20 개의 스피리트가 있습니다. 버튼을 클릭하면 애니메이션이 활성화되기를 원합니다. 두 가지 유형의 애니메이션 1) 위치 2) 회전.Libgdx에서 애니메이션 배치 및 회전

이렇게하는 것이 좋습니다. 내가 생각할 수있는 유일한 방법은 원하는 위치와 각도에 도달 할 때까지 Render 메서드에서 델타 값으로 재귀 적으로 setposition 및 angle을 호출하는 것입니다.

답변

1

시작 상태와 끝 상태가 있고 중간 상태를 채우려면 '트위닝 (inbetween)'이라고합니다. 그것은 만화 애니메이션에서 비롯되었지만보다 일반적으로 사용하게되었습니다.

LibGDX는 Universal Tween Engine을 사용합니다. here을 원하는대로 애니메이트하는 여행을 시작할 수 있습니다. 그러나 그것이 작동하는 방법에 대해 좀 더 자세하게 설명하기 위해, 여기에 내 자신의 물건의 예가 있습니다. 스프라이트에 관해서도 비슷한 사용법이지만, 제 스프라이트는 좀 더 일반적인 클래스 인 JJRenderNode에 싸여 있습니다. 수업을 열어서 트위닝하는 방법은 다음과 같습니다.

먼저 트위닝하려는 클래스에 대해 TweenAccessor가 필요합니다.

public class RenderNodeTweenAccessor implements TweenAccessor<JJRenderNode> { 


public static final int WIDTH = 1; 
public static final int HEIGHT = 2; 
public static final int WIDTH_HEIGHT = 3; 
public static final int ALPHA = 4; 
public static final int ALPHA_WIDTH_HEIGHT=5; 

@Override 
public int getValues(JJRenderNode target, int tweenType, float[] returnValues) { 
    switch (tweenType) { 
     case WIDTH: 
      returnValues[0] = target.getWidth(); 
      return 1; 
     case HEIGHT: 
      returnValues[0] = target.getHeight(); 
      return 1; 
     case WIDTH_HEIGHT: 
      returnValues[0] = target.getWidth(); 
      returnValues[1] = target.getHeight(); 
      return 2; 
     case ALPHA: 
      returnValues[0] = target.getColour().a; 
      return 1; 
     case ALPHA_WIDTH_HEIGHT: 
      returnValues[0] = target.getColour().a; 
      returnValues[1] = target.getWidth(); 
      returnValues[2] = target.getHeight(); 
      return 3; 
     default: 
      assert false; 
      return -1; 
    } 
} 

@Override 
public void setValues(JJRenderNode target, int tweenType, float[] newValues) { 
    switch (tweenType) { 
     case WIDTH: 
      target.setWidth(newValues[0]); 
      break; 
     case HEIGHT: 
      target.setHeight(newValues[0]); 
      break; 
     case WIDTH_HEIGHT: 
      target.setWidth(newValues[0]); 
      target.setHeight(newValues[1]); 
      break; 
     case ALPHA: 
      target.getColour().a=newValues[0]; 
      break; 
     case ALPHA_WIDTH_HEIGHT: 
      target.getColour().a=newValues[0]; 
      target.setWidth(newValues[1]); 
      target.setHeight(newValues[2]); 
     default: 
      break; 
    } 
} 
} 

상수의 int와 각각의 'tweenType'get 및 set 메소드는 필드의 두 개 이상의 조합을 트위닝 할 수 있습니다. 이 경우에는 JJRenderNode의 폭, 높이 및 알파 값의 조합이 다릅니다.

당신은 다음과 같이 TweenAccessor을 등록 할 수 있습니다

Tween.registerAccessor(JJRenderNode.class, new RenderNodeTweenAccessor()); 

을 그리고 당신은 예를 들어, 클래스를 트위닝 무료입니다 :

Timeline.createSequence() 
       .push(Tween.set(node, RenderNodeTweenAccessor.WIDTH_HEIGHT).target(START_WIDTH, START_WIDTH)) 
       .push(Tween.to(node, RenderNodeTweenAccessor.WIDTH_HEIGHT, 0.4f).target(PuzzleBlockCore.MAX_RENDER_WIDTH, PuzzleBlockCore.MAX_RENDER_WIDTH)) 
       .start(JJ.tweenManager); 

PS. TweenManger의 인스턴스가 필요합니다.이 작업은 각 gameloop에 대해 델타로 업데이트해야합니다. 나는 어디에서나 사용할 수있는 '싱글 톤'글로벌 인스턴스를 가지고있다. (JJ.TweenManager).

+0

답장을 보내 주셔서 감사합니다. 스프라이트를 화면의 위에서 아래로 옮기고 싶다고합시다. – pats

+0

@pats 예제를 추가하여 자신의 케이스에 맞는 지 확인할 수 있습니다. – BinaryMonkL

1

애니메이션에 척추 2d를 사용할 수도 있습니다. 비용은 들지만 가치가 있습니다. $ 60 정도면, 당신은 libgdx를 완벽하게 지원하고 뼈대 장비와 애니메이션을 얻을 수 있습니다. 당신이 그러나 단지 libgdx와 애니메이션을 적용 할 경우

http://esotericsoftware.com/

, 당신은 모든 스프라이트 애니메이션 프레임을 통해 루프 목록을 작성하고, 애니메이션의 다음 프레임으로 스프라이트 질감을 전환 할 수 있습니다.

private void render() { 
    sprite.set(aninationframes.get(currentFrame) 
    currentFrame = currentFrame + 1} 

프레임 당 지연을 추가 할 수 있습니다.

If(current time - time > some value) { 
    sprite.set(animationframes.get(currrntFrame) 
    currentFrame = currentFrame + 1 
    time = get current time here 
} 
+0

그건 내 아이디어이기도합니다. 더 나은 접근 방법이 필요했습니다. 감사 – pats