我是第一次使用 AndEngine 创建一个应用程序。我的应用程序是面向动画的,即它有许多点击动画的图像。大多数这些动画都是逐帧动画。我使用 AndEngine 是因为我需要一些带有粒子系统、重力和其他东西的动画。有人可以帮助我在 AndEngine 中使用简单的 onclick 动画代码,或者可以为我指出一些好的教程,因为所有 AndEngine 教程都是没有逐帧动画的游戏教程。任何帮助,将不胜感激。
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 之间有什么区别。但这就是我在游戏中展示简单动画的方式。
我希望这就是你要找的。祝你好运
这是 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);
}
});