gpt4 book ai didi

java - (Java)尝试使用(工作)动画类对硬币数组列表进行动画处理

转载 作者:行者123 更新时间:2023-12-02 04:50:56 24 4
gpt4 key购买 nike

我有一个硬币类,它接受一个整数numOfCoins和一个枚举LayoutType,它可以是线性的或弯曲的。线性布局将硬币一个接一个地显示在一条直线上 - 我们将使用这种方法,因为该方法很小且直接。

我的构造函数如下所示:

public Coin(float xPos, float yPos, int numOfCoins, LayoutType layout) {
setType(ObjectType.COIN);
coinList = new ArrayList<Coin>(); // arraylist of coins
setPos(xPos, yPos); // set starting position of coin(s)
if (layout == LayoutType.LINEAR)) {
linearLayout(); // display coins in a straight line
} else if (layout == LayoutType.CURVE{
curveLayout();
}

}

我的 linearLayout() 方法看起来像这样

public void linearLayout() {
//draw numOfCoins amount of coins in a straight line
for (int i = 0; i < numOfCoins; i++) {
Coin coin = new Coin(xPos, yPos);
coinList.add(coin);
xPos += 50; // place coins 50 pixels apart
}
}

我有一个工作动画类和一个硬币 Sprite 表 - 但是,我对硬币进行建模的方式是 1 个硬币对象可以包含 numOfCoins 数量的硬币,所以我不能直接在draw方法中调用动画。

该类的 draw() 方法位于一个继承自 Coin 的抽象类 GameObject 中。它看起来像这样:

public void draw(SpriteBatch batch) {
// if the object is a coin iterate through the list of coins
// and draw the sprites, if it isn't a coin, simply draw the objects sprite
if (type == ObjectType.COIN) {
for (Coin coin : getCoinList()) {
coin.getCoinList().draw(batch);
}
} else {
sprite.draw(batch);
}
}

这个draw()方法在World.render()中调用。

例如,如果我在一条直线上有 6 个硬币,我将如何为每个硬币创建动画?我似乎找不到办法。非常感谢您的帮助,谢谢。

最佳答案

我对你的类结构感到困惑(拥有硬币列表的硬币)。我会为硬币组创建一个单独的类。

public class Coin {
Vector2 position;

public Coin (float x, float y){
position = new Vector2(x, y);
}
}

public class CoinGroup extends GameObject {
// This would be very similar to your current Coin class, and contain a list of
// the new Coins.
}

为 CoinGroup 类提供一个对其所有项目共享的动画的引用,以及一个浮点变量来跟踪耗时。

Animation coinAnimation;
float elapsedTime;

public CoinGroup(float xPos, float yPos, int numOfCoins, LayoutType layout,
Animation coinAnimation) {
setType(ObjectType.COIN);
coinList = new ArrayList<Coin>(); // arraylist of coins
setPos(xPos, yPos); // set starting position of coin(s)
if (layout == LayoutType.LINEAR)) {
linearLayout(); // display coins in a straight line
} else if (layout == LayoutType.CURVE{
curveLayout();
}
this.coinAnimation = coinAnimation;
}

然后您需要更新每帧的耗时以用于动画。您可能已经有了某种可以将其插入的更新方法,但如果没有,它会是这样的:

public void update (float deltaTime){
elapsedTime += deltaTime;
}

游戏或屏幕类需要每帧对 CoinGroup 调用一次update

然后您可以通过引用相同的动画来绘制每个硬币。我不明白你的绘制方法中发生了什么(为什么硬币的绘制方法需要检查它是否是硬币?),但这是一般的想法。

public void draw(SpriteBatch batch) {
TextureRegion coinFrameRegion = coinAnimation.getKeyFrame(elapsedTime);
for (Coin coin : coinList){
Vector2 coinPosition = coin.position;
batch.draw(coinFrameRegion , coinPosition.x, coinPosition.y);
}
}

如果你想变得更奇特,你可以错开动画。

static final float ANIMATION_STAGGER = 0.15f;

public void draw(SpriteBatch batch) {
for (int i=0; i<coinList.size; i++){
Vector2 coinPosition = coin.position;
batch.draw(coinAnimation.getKeyFrame(elapsedTime + i*ANIMATION_STAGGER ), coinPosition.x, coinPosition.y);
}
}

关于java - (Java)尝试使用(工作)动画类对硬币数组列表进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29253914/

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