1

我的问题是 textureAtlas 动画在应用程序启动时运行。我只希望在 inputListner 获得正确输入时触发它,而不是在启动时触发。目前它被触发两次。错过了什么?这是我的代码。

 //show method 
animationTime=0;

 atlas= new TextureAtlas("Atlas/animation.atlas");
 regions= new Array<TextureAtlas.AtlasRegion>(Atlas.getRegions());
 animation= new Animation(1f/31f,regions);

//input listener:
animationTime = 0;
animation.setPlayMode(Animation.PlayMode.NORMAL);

//render method:
animationTime+=delta;    
decal.setTextureRegion(animation.getKeyFrame(animationTime));
4

2 回答 2

2

如果您希望通过输入触发动画,则不应一直调用此行:

animationTime+=delta;    

导致这行代码使您的动画移动,建议这样做:

// render
if(animationTrigger) {
animationTime+=delta; 
}

// input listener
if(input) {
animationTrigger = true;
}

当标志为 TRUE 时将触发动画

如果有什么问题可以留言

祝你好运

于 2016-01-05T14:05:02.987 回答
1

动画在应用程序启动时触发的原因是因为那是您启动动画的时间,如果您希望它在其他时间点启动,或者只是重置它,您可以随时更改变量或直接通过一个浮点数:

if(animationContinue) {
    animationTime+=delta; 
}
if(animationReset) {
    animationTime = 0; 
}

// Applying animation using the animation time variable.
decal.setTextureRegion(animation.getKeyFrame(animationTime));

// Will just return the first frame of the animation
decal.setTextureRegion(animation.getKeyFrame(0));
// Note that 1 won't necessarily return the next animation frame

如您所见,动画时间是完全动态的,与动画本身是分开的。

如果您打算为多个游戏对象使用一个动画,例如鸟儿飞翔,
请确保为每个游戏对象动画时间添加一些随机偏移,这将使每个游戏对象更加独特和可信。
否则,它们都将具有相同的确切动画时间和顺序,从而产生非常人工的外观。

请注意,动画时间变量是动态的,并且与动画本身完全分离,因此,您可以这样做:

// For each bird.
bird.setTextureRegion(animation.getKeyFrame(animationTime+randomOffset));

很乐意感谢您的支持,我在这里有点努力:)

于 2016-01-06T08:14:59.333 回答