gpt4 book ai didi

java - 在游戏更新循环中调用延迟 3 秒的函数

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:57 24 4
gpt4 key购买 nike

我最近开始学习如何使用 Slick 编写 Java 游戏。我看过一些教程(Bucky 来自 Youtube)并在 Slick 的论坛上阅读了很多内容。我目前正在努力解决一个让我完全陷入困境的问题。我试图在游戏循环中每 3 秒左右创建一个新对象。有些人试图在 Slick 论坛上帮助我,但我仍然无法让它工作。我也想在 stackoverflow 上问这里......

一些背景知识:也许你还记得那个古老的 DOS 游戏,伞兵从天而降,当他们到达地面时,他们向大炮移动。当10个进入时,它会爆炸。作为大炮的拥有者,你想在地面之前射杀所有伞兵。所以,我只在 java 中这样做:)

对于那些从未使用过 Slick 的人来说,有一个 init() 函数来初始化东西,一个 render() 函数负责将所有内容渲染到屏幕上,还有一个 update() 函数,它基本上是游戏循环本身。所有更新都在那里发生,然后渲染函数相应地进行渲染。

例如,我尝试每 3 秒从随机 X 处转换伞兵。

有一个 ArrayList 保存队列对象。每次更新时,对象都会使用一个函数,根据 update() 函数派生的增量来决定是否部署时间。如果是,该对象将被转移到渲染函数中调用的另一个 ArrayList。因此,每次将对象传输到 renderList 时,都会对其进行渲染。问题是,更新方法运行得非常快。所以我最后得到的是所有对象都立即渲染到屏幕上,而不是例如每 3 秒一次渲染 1 个对象。

我尝试实现 Thread.sleep() 技术。但它与 Slick 配合得并不好。我还尝试使用 TimerTaks 和调度程序,但我不知道如何使用它......有人可以指出我正确的方向吗?谢谢!!

伞兵对象:

package elements;

import java.awt.Rectangle;
import java.util.Random;

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

public class Paratrooper1 {

//private int strength = 100;
private float yd;
private float x;
private float y;
private int width;
private int height;
private boolean visible;
private Image paratrooperImage;

private int time;

private Random random;

public Paratrooper1() throws SlickException {
random = new Random();
paratrooperImage = new Image("/res/paratrooper1.png");
width = paratrooperImage.getWidth();
height = paratrooperImage.getHeight();
this.x = generateX();
this.y = 0;
visible = true;
time = 0;
}

public Image getParaImage(){
return paratrooperImage.getScaledCopy(0.2f);
}

public void Move(int delta){
yd += 0.1f * delta;
if(this.y+yd > 500){
this.x = generateX();
this.y = 0;
}else{
this.y += yd;
yd = 0;
}
}

public int getX(){
return (int) x;
}

public int getY(){
return (int) y;
}

public boolean isVisisble(){
return visible;
}

public void setVisible(boolean tof){
visible = tof;
}

public Rectangle getBound(){
return new Rectangle((int)x,(int)y,width,height);
}

private int generateX(){
return random.nextInt(940)+30;
}

public boolean isReadyToDeploy(int delta) {
float pastTime = 0;
pastTime += delta;

long test = System.currentTimeMillis();
if(test >= (pastTime + 3 * 1000)) { //multiply by 1000 to get milliseconds
return true;
}else{
return false;
}
}

}

以及游戏代码:

package javagame;

import java.util.ArrayList;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

import elements.Paratrooper1;

public class Play extends BasicGameState{

Paratrooper1 para1;

private Image cursor;
private int mousePosX = 0;
private int mousePosY = 0;
private String mouseLocationString = "";
private int score;
private ArrayList<Paratrooper1> renderParatroopers;
private ArrayList<Paratrooper1> queuedParatroopers;

private int time;


public Play(int state){
}

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{
score = 0;
time = 0;

renderParatroopers = new ArrayList<Paratrooper1>();

//populate arraylist with paratroopers
queuedParatroopers = new ArrayList<Paratrooper1>();
for (int i=0; i<5; i++){
queuedParatroopers.add(new Paratrooper1());
}

cursor = new Image("res/cursor.png");
cursor.setCenterOfRotation(cursor.getWidth()/2, cursor.getHeight()/2);
gc.setMouseCursor(cursor.getScaledCopy(0.1f), 0, 0);

para1 = new Paratrooper1();
}

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
g.drawString(mouseLocationString, 50, 30);
g.drawString("Paratrooper location: X:" +para1.getY()+ " Y:" +para1.getY(), 50, 45);
g.drawString("Current score: " +score, 800, 30);

//go through arraylist and render each paratrooper object to screen
if (renderParatroopers != null){
for (int i = 0; i < renderParatroopers.size(); i++) {
Paratrooper1 para1 = (Paratrooper1)renderParatroopers.get(i);
if(para1.isVisisble()){
g.drawImage(para1.getParaImage(),para1.getX(),para1.getY());
}
}
}
}

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException{
Input input = gc.getInput();
mousePosX = input.getMouseX();
mousePosY = input.getMouseY();
mouseLocationString = "Pointer location --- X:" +mousePosX+ " Y:" +mousePosY;


for (int i=0; i<queuedParatroopers.size(); i++){
if (queuedParatroopers.get(i).isReadyToDeploy(delta)){
renderParatroopers.add(queuedParatroopers.get(i));
}
}

//update the x and y of each paratrooper object.
//Move() method accepts the delta and is calculated in to
//create a new x and y. Render method will update accordingly.
if(renderParatroopers != null){
for (Paratrooper1 para : renderParatroopers){
para.Move(delta);
}
}
}

/*private boolean isItTimeToDeploy(int deltaVar) {
float pastTime = 0;
pastTime += deltaVar;

long test = System.currentTimeMillis();
if(test >= (pastTime + 3*1000)) { //multiply by 1000 to get milliseconds
return true;
}else{
return false;
}
}*/


public int getID(){
return 1;
}

}

最佳答案

pastTime 是一个局部变量,它应该是一个实例变量。试试这个版本:

long pastTime = 0;
public boolean isReadyToDeploy(long delta) {
if(pastTime < 3 * 1000) { //multiply by 1000 to get milliseconds
pastTime += delta;
return false;
}else{
pastTime = 0;
return true;
}
}
<小时/>
long previousTime = 0;

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException{
long tmp = System.currentTimeMillis();
long customDelta = tmp - previousTime;
previousTime = tmp;

Input input = gc.getInput();
mousePosX = input.getMouseX();
mousePosY = input.getMouseY();
mouseLocationString = "Pointer location --- X:" +mousePosX+ " Y:" +mousePosY;

for (int i=0; i<queuedParatroopers.size(); i++){
if (queuedParatroopers.get(i).isReadyToDeploy(customDelta)){
renderParatroopers.add(queuedParatroopers.get(i));
}
}

//update the x and y of each paratrooper object.
//Move() method accepts the delta and is calculated in to
//create a new x and y. Render method will update accordingly.
if(renderParatroopers != null){
for (Paratrooper1 para : renderParatroopers){
para.Move(delta);
}
}
}

关于java - 在游戏更新循环中调用延迟 3 秒的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12997265/

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