从 ArrayList 生成敌人
Spawning Enemies From ArrayList
我在 ArrayList
中有 12 个敌人,我想为每个敌人延迟 batch.draw
。我在 render
方法中尝试了以下代码,但它只会使精灵闪烁。我正在使用 libgdx
。请帮忙;(
for (int i = 0; i < list.size(); i++)
{
fireDelay -= Gdx.graphics.getDeltaTime();
if (fireDelay <= 0)
{
batch.draw(list.get(i)//..etc)
fireDelay += 0.2;
}
}
请记住,在游戏中,您的 render
方法会将所有绘图命令排队。然后他们被吸引到屏幕上。然后在下一次调用 render()
时,它会清除屏幕并重新开始。您的代码有许多没有意义的问题,例如在 for 循环中倒计时增量时间。
有一百万种方法可以做到这一点。这是一个简单的。它所做的是在每次调用 render()
时更新经过的时间并使用它来重新计算现在应该显示的项目数。然后 for 循环将它们全部绘制到该数字。
private static final float APPEARANCE_RATE = 5f; // 5 per second
private float elapsedTime = 0;
// in render():
elapsedTime += Gdx.graphics.getDeltaTime();
int itemCount = Math.min(list.size(), (int)(elapsedTime * APPEARANCE_RATE));
for (int i = 0; i < itemCount; i++)
{
batch.draw(list.get(i), /*..etc*/);
}
下面的代码一定可以工作:
boolean spawnTime=0;
void spawnEnemy(){
Rectangle rect = new Rectangle();
rect.x = Gdx.graphics.getWidth()/2;
rect.y = Gdx.graphics.getHeight();
rect.setSize(50,50);
myList.add(rect);
}
spawnTime+=Gdx.graphics.getDeltaTime();
//call spawnEnemy function every second
if(spawnTime>=1){
spawnEnemy();
spawnTime=0;
}
//draw all the rectangles to the batch you added in the list
for(Rectangle rect: myList){
batch.draw(rect,rect.x,rect.y,rect.w,rect.h);
}
注意:全局声明spawnTime。
您可以尝试我使用 ModelBatch 编写的这段代码,但该方法也适用于 spriteBatch。
private int idx = 1;
private float elapsedTime = 0;
private int everySec = 1;
private Array<ModelInstance> storedInstance = new Array<>(); //extra array added each model every second to render in model batch.
并且在 render( ) 方法中
modelBatch.begin(cam);
elapsedTime += Gdx.graphics.getDeltaTime();
int time = (int) Math.floor(elapsedTime);
if (idx <= instance.size) {
if (time == idx * everySec) {
storedInstance.add(instance.get(idx - 1));
idx++;
}
}
modelBatch.render(storedInstance);
modelBatch.end();
idx 分别检查是否每秒钟都渲染了所有模型。如果你想改变模型出现的时间跨度,你应该将 "everySec" 更改为例如 5 延迟 5 秒。另外 "instance" 是我要渲染的模型列表(在你的例子中,是敌人)。
我在 ArrayList
中有 12 个敌人,我想为每个敌人延迟 batch.draw
。我在 render
方法中尝试了以下代码,但它只会使精灵闪烁。我正在使用 libgdx
。请帮忙;(
for (int i = 0; i < list.size(); i++)
{
fireDelay -= Gdx.graphics.getDeltaTime();
if (fireDelay <= 0)
{
batch.draw(list.get(i)//..etc)
fireDelay += 0.2;
}
}
请记住,在游戏中,您的 render
方法会将所有绘图命令排队。然后他们被吸引到屏幕上。然后在下一次调用 render()
时,它会清除屏幕并重新开始。您的代码有许多没有意义的问题,例如在 for 循环中倒计时增量时间。
有一百万种方法可以做到这一点。这是一个简单的。它所做的是在每次调用 render()
时更新经过的时间并使用它来重新计算现在应该显示的项目数。然后 for 循环将它们全部绘制到该数字。
private static final float APPEARANCE_RATE = 5f; // 5 per second
private float elapsedTime = 0;
// in render():
elapsedTime += Gdx.graphics.getDeltaTime();
int itemCount = Math.min(list.size(), (int)(elapsedTime * APPEARANCE_RATE));
for (int i = 0; i < itemCount; i++)
{
batch.draw(list.get(i), /*..etc*/);
}
下面的代码一定可以工作:
boolean spawnTime=0;
void spawnEnemy(){
Rectangle rect = new Rectangle();
rect.x = Gdx.graphics.getWidth()/2;
rect.y = Gdx.graphics.getHeight();
rect.setSize(50,50);
myList.add(rect);
}
spawnTime+=Gdx.graphics.getDeltaTime();
//call spawnEnemy function every second
if(spawnTime>=1){
spawnEnemy();
spawnTime=0;
}
//draw all the rectangles to the batch you added in the list
for(Rectangle rect: myList){
batch.draw(rect,rect.x,rect.y,rect.w,rect.h);
}
注意:全局声明spawnTime。
您可以尝试我使用 ModelBatch 编写的这段代码,但该方法也适用于 spriteBatch。
private int idx = 1;
private float elapsedTime = 0;
private int everySec = 1;
private Array<ModelInstance> storedInstance = new Array<>(); //extra array added each model every second to render in model batch.
并且在 render( ) 方法中
modelBatch.begin(cam);
elapsedTime += Gdx.graphics.getDeltaTime();
int time = (int) Math.floor(elapsedTime);
if (idx <= instance.size) {
if (time == idx * everySec) {
storedInstance.add(instance.get(idx - 1));
idx++;
}
}
modelBatch.render(storedInstance);
modelBatch.end();
idx 分别检查是否每秒钟都渲染了所有模型。如果你想改变模型出现的时间跨度,你应该将 "everySec" 更改为例如 5 延迟 5 秒。另外 "instance" 是我要渲染的模型列表(在你的例子中,是敌人)。