gpt4 book ai didi

android - 在切换到另一个动画之前等待动画完成?

转载 作者:行者123 更新时间:2023-11-29 01:17:40 25 4
gpt4 key购买 nike

我正在使用 keyupkeyDown 在游戏 Sprite 的不同动画之间切换。在 keyDown 上, Sprite 根据按下的键切换动画,在 keyUp 上, Sprite 切换回空闲动画。它适用于像走路这样的较小动画,但是当我松开按键时动画有点长时, Sprite 会回到空闲动画而不会完成上一个动画。我该如何实现?我尝试阅读 libgdx 的动画文档,但方法 isAnimationFinished 不是我需要的。

package com.mygdx.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TiledMapRenderer;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;

public class MyGdxGame extends ApplicationAdapter implements InputProcessor {
private SpriteBatch batch;
private TextureAtlas textureAtlas;
private Animation animation;
private Animation animation2;
private Animation animation3;
private Animation currentAnimation;
private float elapsedTime = 0;
TiledMap tiledMap;
OrthographicCamera camera;
TiledMapRenderer tiledMapRenderer;


int[] pos = {30,30};
int acc = 0;
int acc_cam = 0;

@Override
public void create() {
batch = new SpriteBatch();
textureAtlas = new TextureAtlas(Gdx.files.internal("Wolverine.txt"));
// textureAtlas = new TextureAtlas(Gdx.files.internal("spritesheet.atlas"));
// textureAtlas2 = new TextureAtlas(Gdx.files.internal("spritesheet(copy).atlas"));
// animation = new Animation(1/7f, textureAtlas.getRegions());
// animation2 = new Animation(1/7f, textureAtlas2.getRegions());
animation = new Animation(1/7f, textureAtlas.findRegions("Standing"));
animation2 = new Animation(1/7f, textureAtlas.findRegions("Walking"));
animation3 = new Animation(1/15f, textureAtlas.findRegions("Attcak_Stand"));
currentAnimation = animation;

camera = new OrthographicCamera();
camera.setToOrtho(false, 640, 480);


tiledMap = new TmxMapLoader().load("Tiled_tilesheet2.tmx");
tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap);


Gdx.input.setInputProcessor(this);
}

@Override
public void dispose() {
batch.dispose();
tiledMap.dispose();
textureAtlas.dispose();
}

@Override
public void render() {

pos[0] += acc;
camera.translate(acc_cam,0);

Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

camera.update();
tiledMapRenderer.setView(camera);
tiledMapRenderer.render();
batch.begin();

//sprite.draw(batch);
elapsedTime += Gdx.graphics.getDeltaTime();
batch.draw(currentAnimation.getKeyFrame(elapsedTime, true), pos[0],pos[1]);
batch.end();
}

@Override
public void resize(int width, int height) {
}

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public boolean keyDown(int keycode) {
if (keycode == Input.Keys.RIGHT) {
currentAnimation = animation2;
if(pos[0]>320){acc_cam+=2;}
else{acc += 2;}

}
else if(keycode == Input.Keys.Z){
currentAnimation = animation3;

}
return true;

}

@Override
public boolean keyUp(int keycode) {
currentAnimation = animation;
acc_cam=0;
acc = 0;

return false;
}

@Override
public boolean keyTyped(char character) {
return false;
}

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
return false;
}

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
return false;
}

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
return false;
}

@Override
public boolean mouseMoved(int screenX, int screenY) {
return false;
}

@Override
public boolean scrolled(int amount) {
return false;
}
}

最佳答案

Animation 类无法在当前动画完成时通知您(如回调)。 isAnimationFinished() 会告诉您动画是否在播放模式#NORMAL 下完成,我相信您的动画设置为因为您的构造函数没有指示它们循环。

您的渲染代码总是绘制一个动画,该动画是根据按键输入设置的。所以这就是为什么任何当前动画突然停止,因为你告诉它立即切换。

我不知道您对各种动画(长度、调用时间等)的计划是什么。您可能需要重构您的代码,以确定您想要播放哪些动画,以及它如何与您的其他动画或按键输入策略联系起来,等等。一个简单的解决方案可能是根据某些关键输入设置“下一个动画”,并让您的代码检查当前动画以查看它是否完成(使用 isAnimationeFinished - 您必须在每一帧执行此操作)。如果完成,将下一个动画换成当前动画。如果您循环播放动画,您也必须将其考虑到您的逻辑中。

另一种选择是编写您自己的回调/监听器代码来告诉您动画何时结束。向下滚动(几乎在末尾)这篇文章以获得一些想法:http://www.rengelbert.com/tutorial.php?id=179

可能还有其他几个选项,但都取决于您希望如何在动画之间转换,而且只有您知道,因为有些动画很短,有些很长,并且它们会根据您的输入而变化在你的游戏中创造。

关于android - 在切换到另一个动画之前等待动画完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38583587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com