You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX中Sprite与Animation整合问题:闲置动画无显示且无报错

解决LibGDX中Sprite与Animation整合的闲置动画不显示问题

我帮你排查了代码里的几个关键问题,这应该就是闲置动画不显示的原因,下面是具体的修复方案:

问题分析

  1. Sprite未初始化核心属性:你创建player对象时,没有给它设置初始的TextureRegion,也没指定位置和尺寸。即使后续调用setRegion,Sprite的默认位置可能在屏幕外,或者因为没有尺寸导致无法渲染。
  2. 动画时间更新顺序错误:你先获取闲置动画的关键帧,再更新elapsedTime,这会导致动画时间进度滞后,初始帧的计算也会出错。
  3. 状态未统一管理:移动时直接绘制动画帧,没有同步更新Sprite的状态,导致Sprite的位置和实际显示的角色位置不一致(不过这是次要问题,主要影响闲置状态)。

修改后的完整代码

package com.mygdx.game;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Array;

public class Game extends ApplicationAdapter {
 SpriteBatch batch;
 private TextureAtlas runAtlas;
 private Animation<TextureRegion> runAnimation;
 private TextureAtlas idleAtlas;
 private Animation<TextureRegion> idleAnimation;
 private Sprite player;
 private float elapsedTime = 0;

 @SuppressWarnings({ "unchecked", "rawtypes" })
 @Override
 public void create () {
 batch = new SpriteBatch();
 runAtlas = new TextureAtlas(Gdx.files.internal("runSpritesheet.atlas"));
 runAnimation = new Animation<TextureRegion>(1/12f, runAtlas.getRegions());
 idleAtlas = new TextureAtlas(Gdx.files.internal("idleSpritesheet.atlas"));
 idleAnimation = new Animation<TextureRegion>(1/3f, idleAtlas.getRegions());
 
 // 初始化Sprite:给初始区域,设置位置和尺寸
 TextureRegion initialIdleFrame = idleAnimation.getKeyFrame(0);
 player = new Sprite(initialIdleFrame);
 player.setPosition(10, 10); // 初始位置
 }

 @Override
 public void render () {
 // 先更新时间,再获取关键帧
 elapsedTime += Gdx.graphics.getDeltaTime();
 Gdx.gl.glClearColor(0, 0, 0, 1);
 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
 batch.begin();
 
 if(Gdx.input.isKeyPressed(Keys.DPAD_RIGHT)) {
 // 移动时更新Sprite的区域和位置
 TextureRegion currentRunFrame = runAnimation.getKeyFrame(elapsedTime, true);
 player.setRegion(currentRunFrame);
 player.translateX(100 * Gdx.graphics.getDeltaTime()); // 帧率无关的移动速度
 player.draw(batch);
 } else if (Gdx.input.isKeyPressed(Keys.DPAD_LEFT)) {
 TextureRegion currentRunFrame = runAnimation.getKeyFrame(elapsedTime, true);
 player.setRegion(currentRunFrame);
 player.translateX(-100 * Gdx.graphics.getDeltaTime());
 player.draw(batch);
 } else {
 // 闲置时更新Sprite的区域
 TextureRegion currentIdleFrame = idleAnimation.getKeyFrame(elapsedTime, true);
 player.setRegion(currentIdleFrame);
 player.draw(batch);
 }
 batch.end();
 }

 @Override
 public void dispose () {
 batch.dispose();
 runAtlas.dispose();
 idleAtlas.dispose();
 }
}

关键修改点说明

  • Sprite初始化优化:在create方法中,直接用闲置动画的初始帧创建Sprite,并设置初始位置,这样Sprite从一开始就有有效的渲染属性。
  • 调整elapsedTime更新顺序:先更新时间再获取关键帧,保证动画时间进度的准确性,避免帧滞后问题。
  • 统一用Sprite管理状态:无论是移动还是闲置状态,都通过更新Sprite的region和位置来实现,不再直接绘制TextureRegion,让Sprite的状态始终和显示内容一致。
  • 帧率无关的移动:使用translateX结合deltaTime实现移动,确保不同帧率下角色移动速度保持一致。

这样修改后,闲置动画应该就能正常显示了,同时移动状态下的角色位置也会和Sprite同步。

内容的提问来源于stack exchange,提问作者Zein Al-bahrani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:49:39