Java 在游戏更新循环中以3秒的时间延迟调用函数

Java 在游戏更新循环中以3秒的时间延迟调用函数,java,time,delay,slick2d,Java,Time,Delay,Slick2d,我最近开始学习如何使用Slick编写java游戏。 我看过一些教程(Bucky在Youtube上的),在Slick的论坛上读了很多。我目前正在努力解决一个让我完全陷入困境的问题。我试图每3秒钟左右在游戏循环中创建一个新对象。 有几个人试图在Slick论坛上帮助我,但我仍然无法让它发挥作用。 我也想过在这里问stackoverflow 一点背景: 也许你还记得那场老掉牙的DOS游戏,伞兵从天而降,当他们到达地面时,他们向大炮移动。当10进入时,它会爆炸。 作为佳能的拥有者,你想在地面前射杀所有伞兵

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

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

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

比如说,我试着每3秒从一个随机的X点上放下伞兵

有一个保存queuedobject的ArrayList。每次更新,对象都会使用一个函数,该函数根据从update()函数派生的增量决定是否部署。如果是,则该对象将被传输到另一个在渲染函数中调用的ArrayList。因此,每次将对象传输到renderList时,它都会被渲染。 问题是,更新方法运行得非常快。所以我在最后得到的是,所有的物体瞬间呈现到屏幕上,而不是像这样每3秒一次呈现一个

我尝试了实现Thread.sleep()技术。但它对Slick没有很好的效果。 我也尝试过使用TimerTaks和schedualer,但我不知道如何使用它。。。 有人能给我指一下正确的方向吗?谢谢

伞兵目标:

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;
}
包javagame;
导入java.util.ArrayList;
导入org.newdawn.slick.GameContainer;
导入org.newdawn.slick.Graphics;
导入org.newdawn.slick.Image;
导入org.newdawn.slick.Input;
导入org.newdawn.slick.SlickException;
导入org.newdawn.slick.state.BasicGameState;
导入org.newdawn.slick.state.StateBasedGame;
进口元素。伞兵1;
公共类播放扩展了BasicGameState{
伞兵;
私有图像光标;
私有int mousePosX=0;
私有int mousePosY=0;
私有字符串mouseLocationString=“”;
个人智力得分;
私人ArrayList renderParatroopers;
私人阵列列表队列骑警;
私人整数时间;
公共游戏(国际国家){
}
public void init(GameContainer gc,StateBasedGame sbg)引发异常{
得分=0;
时间=0;
RenderParatropers=新ArrayList();
//用伞兵填充arraylist
QueuedParatropers=新ArrayList();
对于(int i=0;ipastTime是一个局部变量,它应该是一个实例变量。请改用此版本:

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 passtime=0;
公共布尔值isReadyToDeploy(长增量){
如果(pastTime<3*1000){//乘以1000得到毫秒
过去时间+=增量;
返回false;
}否则{
过去时间=0;
返回true;
}
}

long previousTime=0;
公共无效更新(GameContainer gc、StateBasedGame sbg、int delta)引发异常{
long tmp=System.currentTimeMillis();
long customDelta=tmp—以前的时间;
前一时间=tmp;
Input=gc.getInput();
mousePosX=input.getMouseX();
mousePosY=input.getMouseY();
mouseLocationString=“指针位置--X:+mousePosX+”Y:+mousePosY;
对于(int i=0;ipastTime是一个局部变量,它应该是一个实例变量。请改用此版本:

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 passtime=0;
公共布尔值isReadyToDeploy(长增量){
如果(pastTime<3*1000){//乘以1000得到毫秒
过去时间+=增量;
返回false;
}否则{
过去时间=0;
返回true;
}
}

long previousTime=0;
公共无效更新(GameContainer gc、StateBasedGame sbg、int delta)引发异常{
long tmp=System.currentTimeMillis();
long customDelta=tmp—以前的时间;
前一时间=tmp;
Input=gc.getInput();
mousePosX=input.getMouseX();
mousePosY=input.getMouseY();
mouseLocationString=“指针位置--X:+mousePosX+”Y:+mousePosY;

对于(int i=0;iIs)可以用一个较短的版本来描述这个问题吗?lol。是的,对此很抱歉。我正在尝试每3秒创建一个伞兵对象。我希望它从屏幕顶部掉下来。我无法创建计数器,甚至无法找到放置它的位置。请从你们那里查找信息。您可以使用Thread.sleep(3000)函数在try-catch块中。是的,这就是为什么我添加了很长的解释。似乎在光滑的环境中使用Thread.sleep()会导致很多问题。除非我做错了什么。关于在哪里实现Thread.sleep()有什么具体建议吗呼叫?如何初始化它可能?有可能用一个较短的版本来描述这个问题吗?哈哈。是的,对此很抱歉。我正在尝试每3秒创建一个伞兵对象。我希望它从屏幕顶部掉下来。我无法创建计数器,也无法找到放置它的位置。从你们那里寻找信息。你们可以使用线程try-catch块中的.sleep(3000)函数。是的,这就是为什么我添加了冗长的解释。似乎在光滑的环境中使用Thread.sleep()会导致很多问题。除非我做错了什么。关于在何处实现Thread.sleep()有何具体建议调用?如何初始化它?好的。有进展。我使用了这个方法。尝试将它放在Play类中(更新方法()之外),并尝试通过Paratro使用它