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

时间:2013-03-20 16:55:51

标签: java text-based system-clock

我正在尝试编写一个基于文本的基本游戏,因为我正在学习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()

所以,这是我的问题:

有没有办法我可以使用一个单独的方法来记录时间/轮次与while循环同时向玩家提供命令提示符?

如果没有,是否有不同的方法可以使这个问题成为我尚未看到/实践过的问题呢?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

它被称为“游戏循环”,它允许游戏无论用户的输入如何都能平稳地运行。

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

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

答案 2 :(得分:1)

实时文字冒险?听起来不错。我不建议尝试为这个特定问题做并发,有更简单的方法。

通常情况下,您不会在输入时混合阻塞时间(以秒为单位)。除非你对这个设计有所了解,否则我建议。

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

2)根据用户输入增加'ticks'的游戏时间。这将是NetHack / Roguelike风格。怪物每蜱可以移动这么多块,而不是每秒。

答案 3 :(得分:1)

是的,有办法。您需要将“Round Counting”代码放在其自己的Thread中,因此它不会被等待输入数据的用户阻止。 java.util.concurrency包可以帮助解决这个问题。

查看Java Doc scheduleAtFixedRate()方法将以固定间隔执行runnable。 “循环计数”代码将被移动到实现runnable接口的类。这将在设定的时间间隔执行。这虽然合理地推进了。