0

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

4

2 回答 2

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 之间有什么区别。但这就是我在游戏中展示简单动画的方式。

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

于 2013-10-25T09:08:25.867 回答
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);

                                                }
                                            });
于 2013-11-30T05:53:27.923 回答