LibGDX - 缩放动画
LibGDX - scaling animations
改天,又一个问题。
我正在尝试从 TextureRegions 制作动画,但我需要按某个值缩放它。我对缩放静止图像(由纹理区域制作的精灵)没有任何问题,但是,我不知道为什么,它不适用于动画帧。
对于静止图像,我会这样做:
darknessActive = new Sprite(AssetLoaderUI.darknessActive);
darknessActive.setPosition(50, 20);
darknessActive.setScale(scaler);
然后我在渲染器中渲染它就好了。
对于动画,我尝试做这样的事情:
Frame1 = new TextureRegion(texture, 764, 75, 141, -74);
Frame2 = new TextureRegion(texture, 907, 75, 133, -75);
Frame1S = new Sprite(Frame1);
Frame1S.setScale(scaler);
Frame2S = new Sprite(Frame2);
Frame2S.setScale(scaler);
Sprite[] Frames = { Frame1S, Frame2S };
myAnimation = new Animation(0.06f, Frames);
myAnimation.setPlayMode(Animation.PlayMode.LOOP);
但是图片还是原来的大小,"scaler"没有任何区别。
2018 编辑: 在 LibGDX 的较新版本中,动画 class 不限于 TextureRegions。它可以为任何通用对象数组设置动画,因此您可以创建一个 Animation<Sprite>
,但您需要确保每次获得关键帧精灵时都应用了适当的比例。就个人而言,我认为应该避免使用 Sprite class,因为它将资源(图像)与游戏状态混为一谈。
你没有说你是如何绘制动画的,但大概你正在使用一种不知道精灵比例的方法。
由于 Animation class 存储了 TextureRegions,如果你从动画中获取帧来绘制这样:
spriteBatch.draw(animation.getKeyFrame(time), x, y);
然后 sprite 批处理不知道它是 Sprite 的实例,只知道它是 TextureRegion 的实例,不包括缩放信息。
一种快速而肮脏的方法是这样的:
Sprite sprite = (Sprite)animation.getKeyFrame(time));
spriteBatch.draw(sprite, x, y, 0, 0, sprite.width, sprite.height, sprite.scaleX, sprite.scaleY, 0);
但是如果你想要一个表现得有点像精灵的动画,你可以子class它来存储缩放数据(如果你愿意,还可以存储旋转和位置)和绘制本身。然后你根本不用担心 Sprite 实例。
例如:
public class SpriteAnimation extends Animation {
float scaleX = 1;
float scaleY = 1;
/*...duplicate and call through to super constructors here...*/
public void setScaling(float scale){
scaleX = scale;
scaleY = scale;
}
public void draw (float stateTime, Batch batch, float x, float y) {
TextureRegion region = getKeyFrame(stateTime);
batch.draw(region, x, y, region.width*scaleX, region.height*scaleY);
}
}
您可以根据自己的喜好对其进行自定义,如果您愿意,可以像精灵一样存储 x 和 y、旋转、原点等。创建它时,您根本不会使用 Sprite class。你会做这样的事情。
frame1 = new TextureRegion(texture, 764, 75, 141, -74);
frame2 = new TextureRegion(texture, 907, 75, 133, -75);
TextureRegion[] frames = { frame1, frame2 };
mySpriteAnimation = new SpriteAnimation(0.06f, frames);
mySpriteAnimation.setScaling(scaler);
mySpriteAnimation.setPlayMode(Animation.PlayMode.LOOP);
改天,又一个问题。
我正在尝试从 TextureRegions 制作动画,但我需要按某个值缩放它。我对缩放静止图像(由纹理区域制作的精灵)没有任何问题,但是,我不知道为什么,它不适用于动画帧。
对于静止图像,我会这样做:
darknessActive = new Sprite(AssetLoaderUI.darknessActive);
darknessActive.setPosition(50, 20);
darknessActive.setScale(scaler);
然后我在渲染器中渲染它就好了。
对于动画,我尝试做这样的事情:
Frame1 = new TextureRegion(texture, 764, 75, 141, -74);
Frame2 = new TextureRegion(texture, 907, 75, 133, -75);
Frame1S = new Sprite(Frame1);
Frame1S.setScale(scaler);
Frame2S = new Sprite(Frame2);
Frame2S.setScale(scaler);
Sprite[] Frames = { Frame1S, Frame2S };
myAnimation = new Animation(0.06f, Frames);
myAnimation.setPlayMode(Animation.PlayMode.LOOP);
但是图片还是原来的大小,"scaler"没有任何区别。
2018 编辑: 在 LibGDX 的较新版本中,动画 class 不限于 TextureRegions。它可以为任何通用对象数组设置动画,因此您可以创建一个 Animation<Sprite>
,但您需要确保每次获得关键帧精灵时都应用了适当的比例。就个人而言,我认为应该避免使用 Sprite class,因为它将资源(图像)与游戏状态混为一谈。
你没有说你是如何绘制动画的,但大概你正在使用一种不知道精灵比例的方法。
由于 Animation class 存储了 TextureRegions,如果你从动画中获取帧来绘制这样:
spriteBatch.draw(animation.getKeyFrame(time), x, y);
然后 sprite 批处理不知道它是 Sprite 的实例,只知道它是 TextureRegion 的实例,不包括缩放信息。
一种快速而肮脏的方法是这样的:
Sprite sprite = (Sprite)animation.getKeyFrame(time));
spriteBatch.draw(sprite, x, y, 0, 0, sprite.width, sprite.height, sprite.scaleX, sprite.scaleY, 0);
但是如果你想要一个表现得有点像精灵的动画,你可以子class它来存储缩放数据(如果你愿意,还可以存储旋转和位置)和绘制本身。然后你根本不用担心 Sprite 实例。
例如:
public class SpriteAnimation extends Animation {
float scaleX = 1;
float scaleY = 1;
/*...duplicate and call through to super constructors here...*/
public void setScaling(float scale){
scaleX = scale;
scaleY = scale;
}
public void draw (float stateTime, Batch batch, float x, float y) {
TextureRegion region = getKeyFrame(stateTime);
batch.draw(region, x, y, region.width*scaleX, region.height*scaleY);
}
}
您可以根据自己的喜好对其进行自定义,如果您愿意,可以像精灵一样存储 x 和 y、旋转、原点等。创建它时,您根本不会使用 Sprite class。你会做这样的事情。
frame1 = new TextureRegion(texture, 764, 75, 141, -74);
frame2 = new TextureRegion(texture, 907, 75, 133, -75);
TextureRegion[] frames = { frame1, frame2 };
mySpriteAnimation = new SpriteAnimation(0.06f, frames);
mySpriteAnimation.setScaling(scaler);
mySpriteAnimation.setPlayMode(Animation.PlayMode.LOOP);