Android AndEngine Ontouch动画

时间:2013-10-17 07:16:05

标签: android animation andengine

我是第一次使用AndEngine创建应用程序。我的应用程序是面向动画的,即它有许多点击动画的图像。大多数这些动画都是逐帧动画。我正在使用AndEngine,因为我需要一些带有粒子系统,重力和其他东西的动画。有人可以帮助我在AndEngine中使用简单的onclick动画代码,或者可能指向一些好的教程,因为所有AndEngine教程都是没有逐帧动画的游戏教程。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

  • 开始之前:请注意,此答案正在使用AndEngine的TexturePacker扩展名。

对于我的逐帧动画,我使用的是一个名为Texture Packer的程序,它由AndEngine支持。实际上,您只需将所有图像拖到那里,然后导出需要在项目中使用的3个文件。该文件是:.xml,.java,.png 通过这样做,我正在创建一个大位图(尝试保持低于或等于2048x2048)与其中的所有帧。

在假设您创建了这些文件后,您需要将它们复制到您的项目中。 .png和.xml进入同一目录,很可能是在assets / gfx / ...目录下,而.java文件应该与你的其余类一起位于src目录中。

现在让我们查看一些代码..

首先,我们需要从文件中加载所有纹理..我们将使用以下代码执行此操作:

这些是我们用来创建动画对象的变量。

private TexturePack dustTexturePack;
private TexturePackTextureRegionLibrary dustTexturePackLibrary;
public TiledTextureRegion dust;

以下代码实际上将位图中的单个纹理加载到变量

try {
        dustTexturePack = new TexturePackLoader(activity.getTextureManager(),"gfx/Animations/Dust Animation/").loadFromAsset(activity.getAssets(),"dust_anim.xml");

        dustTexturePack.loadTexture();
        dustTexturePackLibrary = dustTexturePack.getTexturePackTextureRegionLibrary();

} catch (TexturePackParseException e) {
    Debug.e(e);
}
TexturePackerTextureRegion[] obj = new TexturePackerTextureRegion[dustTexturePackLibrary.getIDMapping().size()];

for (int i = 0; i < dustTexturePackLibrary.getIDMapping().size(); i++) {
    obj[i] = dustTexturePackLibrary.get(i);
}

dust = new TiledTextureRegion(dustTexturePack.getTexture(), obj);

如您所见,我们正在使用TiledTextureRegion对象。到目前为止我们所做的实际上是加载纹理,并为我们的TiledTextureRegion对象提供有关位于我们的大位图中的较小图像区域所需的所有信息。

稍后,要在游戏的任何部分使用它,我们可以执行以下操作:(注意我的“dust”变量位于ResourceManager类中,因此它是公共的 - 这个信息是为下一个代码提供的)

AnimatedSprite dustAnimTiledSprite = new AnimatedSprite(500, 125, resourcesManager.dust, vbom);
myScene.attachChild(dustAnimTiledSprite);

最后,为了在特定的给定时间内对对象进行动画制作,我们只使用简单的animate方法,就像这样:

dustAnimTiledSprite.animate(40, 0);

(在这种情况下,每帧的持续时间为40,并且有0个循环 - 将动画一次)

**不太确定AnimatedSprite与TiledSprite之间的区别。但这就是我在游戏中展示简单动画的方式。

我希望这就是你要找的东西。祝你好运

答案 1 :(得分:0)

这是8帧的精灵表

Player.sprite.animate(
                                            new long[] { 100, 100 }, 7, 8,
                                            false, new IAnimationListener() {

                                                public void onAnimationStarted(
                                                        AnimatedSprite pAnimatedSprite,
                                                        int pInitialLoopCount) {

                                                }

                                                public void onAnimationLoopFinished(
                                                        AnimatedSprite pAnimatedSprite,
                                                        int pRemainingLoopCount,
                                                        int pInitialLoopCount) {

                                                }

                                                public void onAnimationFrameChanged(
                                                        AnimatedSprite pAnimatedSprite,
                                                        int pOldFrameIndex,
                                                        int pNewFrameIndex) {

                                                }

                                                public void onAnimationFinished(
                                                        AnimatedSprite pAnimatedSprite) {
                                                    Player.sprite.animate(
                                                            new long[] { 100,
                                                                    100, 100,
                                                                    100, 100,
                                                                    100, 100 },
                                                            0, 6, true);

                                                }
                                            });