基于文本的游戏中的处理时间(Java)
在学习Java的同时,我正在尝试制作一个基本的基于文本的游戏。我希望能够在游戏中计算回合数,以此来管理某些事件的节奏。例如,更衣室可以限制为每轮一次(在测试代码中为每秒一次)。小生物可能以更高的速率攻击或更换房间,而较大的可能更麻烦。到目前为止还好吗?太好了 所以,我做了这件事,并立即意识到,每次while循环等待玩家输入命令时,我都会击中一个方块。代码:基于文本的游戏中的处理时间(Java),java,text-based,system-clock,Java,Text Based,System Clock,在学习Java的同时,我正在尝试制作一个基本的基于文本的游戏。我希望能够在游戏中计算回合数,以此来管理某些事件的节奏。例如,更衣室可以限制为每轮一次(在测试代码中为每秒一次)。小生物可能以更高的速率攻击或更换房间,而较大的可能更麻烦。到目前为止还好吗?太好了 所以,我做了这件事,并立即意识到,每次while循环等待玩家输入命令时,我都会击中一个方块。代码: private void startPlaying() { //declare clock/round variables.
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中的替代办法,因为这本身就是一个启发性的项目。无论如何,我可能会使用线程来学习它们(最初的目标),然后在该线程中实现这个输入处理。