Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于文本的游戏中的处理时间(Java)_Java_Text Based_System Clock - Fatal编程技术网

基于文本的游戏中的处理时间(Java)

基于文本的游戏中的处理时间(Java),java,text-based,system-clock,Java,Text Based,System Clock,在学习Java的同时,我正在尝试制作一个基本的基于文本的游戏。我希望能够在游戏中计算回合数,以此来管理某些事件的节奏。例如,更衣室可以限制为每轮一次(在测试代码中为每秒一次)。小生物可能以更高的速率攻击或更换房间,而较大的可能更麻烦。到目前为止还好吗?太好了 所以,我做了这件事,并立即意识到,每次while循环等待玩家输入命令时,我都会击中一个方块。代码: private void startPlaying() { //declare clock/round variables.

在学习Java的同时,我正在尝试制作一个基本的基于文本的游戏。我希望能够在游戏中计算回合数,以此来管理某些事件的节奏。例如,更衣室可以限制为每轮一次(在测试代码中为每秒一次)。小生物可能以更高的速率攻击或更换房间,而较大的可能更麻烦。到目前为止还好吗?太好了

所以,我做了这件事,并立即意识到,每次while循环等待玩家输入命令时,我都会击中一个方块。代码:

private void startPlaying() {
    //declare clock/round variables.
    int lastRound = 0;
    int currentRound = 0;
    long lastTime = System.currentTimeMillis();
    long currentTime;

    while (player.getIsPlaying()){
        //Clocking
        currentTime = System.currentTimeMillis();
        if ((lastTime + 1000) < currentTime) {
            lastTime = currentTime;
            lastRound = currentRound;
            currentRound++;
            System.out.println("Current round:\t" + currentRound + "\tCurrent time:\t" + currentTime); //EDIT:NOTE: This is just a test line to observe the loop.
        }//end if (Clocking)

        Command command = new Command();
        String[] commandString = command.setAll(); //Array gets parsed elsewhere.
        player.doCommand(commandString);  
        //Class Player extends Pawn extends Actor; Pawn has most command methods.
    }
    finishPlaying();
}//END STARTPLAYING()
private void startPlaying(){
//声明时钟/圆形变量。
int lasthround=0;
int currentRound=0;
long lastTime=System.currentTimeMillis();
长时间;
while(player.getIsPlaying()){
//计时
currentTime=System.currentTimeMillis();
如果((上次时间+1000)<当前时间){
lastTime=当前时间;
最后一轮=当前一轮;
currentRound++;
System.out.println(“当前轮:\t”+currentRound+“\t当前时间:\t”+currentTime);//编辑:注意:这只是观察循环的测试行。
}//如果结束(计时)
命令=新命令();
String[]commandString=command.setAll();//数组在别处被解析。
player.doCommand(commandString);
//类Player扩展Pawn扩展Actor;Pawn拥有大多数命令方法。
}
完成铺设();
}//结束开始播放()
所以,我的问题是:

有没有一种方法可以使用一个单独的方法来记录与while循环并发的时间/轮数,并向玩家提供一个命令提示符

如果没有,有没有其他方法可以让这成为我还没有看到/实践过的问题?

看一看。使用线程,您可以在不停止其他进程的情况下等待用户输入(并使这些其他进程同时执行-不是并行执行,而是分时执行)。

它被称为“游戏循环”,允许游戏在不考虑用户输入的情况下平稳运行

最简单的解决方案是创建2个线程,第一个线程将等待用户输入并将其放入容量为1的
ConcurrentLinkedQueue
。第二个线程将运行游戏循环,并在队列不为空时从队列中获取用户输入来处理它


您可以使用任何您想要在两个线程之间交换数据的数据结构,它甚至可以是可变的字符串变量。对该变量的读写访问权限的唯一要求应该以某种方式同步

实时文本冒险?听起来很有趣。我不建议尝试对这个特定的问题进行并发,有更简单的方法

通常情况下,您不会将输入阻塞与以秒为单位的时间混合在一起。除非你把心放在这个设计上,否则我也会建议你

1) 不要阻止用户输入。通过检查每一帧的按键,编写自己的输入处理代码。然后您可以计算迭代之间的时间差。例如,怪物每秒移动1个区块,因此如果当前循环迭代耗时100毫秒,则它移动0.1个区块。(在内部将这些值存储为
float
s,即使在文本网格上绘制


2) 根据用户输入以“滴答”为单位增加游戏时间。这将是NetHack/Roguelike风格。怪物可以在每滴答声中移动如此多的方块,而不是每秒。

是的,有一种方法。您需要将“轮计数”代码放在它自己的线程中,这样它就不会被等待输入数据的用户阻塞。
java.util.concurrency
包可以帮助实现这一点


查看scheduleAtFixedRate()方法将以固定的时间间隔执行runnable。“轮计数”代码将被移动到实现该接口的类中。这将在设定的时间间隔执行。不过,这是相当先进的。

我想Oracle的教程应该是一个更明智的起点。一旦我有了这个名声,我就开始投票了。太棒了,谢谢你简洁的解释。我可能需要花一点时间在文档中,但这听起来很可行。考虑过tick方法,但我看不出它会转移到多人游戏实现,这对未来来说是一个不错的项目。我还赞赏备选办法1中的替代办法,因为这本身就是一个启发性的项目。无论如何,我可能会使用线程来学习它们(最初的目标),然后在该线程中实现这个输入处理。