Java 暂停没有线程的程序
我正在制作一个视频游戏,游戏中有一群怪物在屏幕上跑来跑去。问题是怪物在某一点经过一个区域(在y坐标之上),并且必须一路返回到顶部。我收到一个建议,建议将此从底部到顶部的传输延迟随机时间(0、1、2或3秒)。现在,它只是上升到顶部,没有任何中断。我的问题是实施这个休息。我尝试了各种方法,如使用循环暂停,如下所示Java 暂停没有线程的程序,java,for-loop,sleep,thread-sleep,Java,For Loop,Sleep,Thread Sleep,我正在制作一个视频游戏,游戏中有一群怪物在屏幕上跑来跑去。问题是怪物在某一点经过一个区域(在y坐标之上),并且必须一路返回到顶部。我收到一个建议,建议将此从底部到顶部的传输延迟随机时间(0、1、2或3秒)。现在,它只是上升到顶部,没有任何中断。我的问题是实施这个休息。我尝试了各种方法,如使用循环暂停,如下所示 // if( monster is below 400 on y-axis if( sbgBackFootY[ i ] >= 400 ) {
// if( monster is below 400 on y-axis
if( sbgBackFootY[ i ] >= 400 ) {
// random number that determines how long it will take to go to top
int randCo = ( int ) ( Math.random() * 3 );
if( randCo == 0 ) {
//moves monster to top
sbgHeadX[ i ] = 200;
sbgHeadY[ i ] = 80;
sbgMouthX[ i ] = 206;
sbgMouthY[ i ] = 110;
sbgBackX[ i ] = 190;
sbgBackY[ i ] = 95;
sbgBackFootX[ i ] = 190;
sbgBackFootY[ i ] = 115;
sbgFrontFootX[ i ] = 197;
sbgFrontFootY[ i ] = 115;
sbgLeftEyeX[ i ] = 205;
sbgLeftEyeY[ i ] = 90;
sbgRightEyeX[ i ] = 215;
sbgRightEyeY[ i ] = 90;
sbgLeftEyebrowStartX[ i ] = 203;
sbgLeftEyebrowStartY[ i ] = 83;
sbgLeftEyebrowEndX[ i ] = 210;
sbgLeftEyebrowEndY[ i ] = 90;
sbgRightEyebrowStartX[ i ] = 220;
sbgRightEyebrowStartY[ i ] = 83;
sbgRightEyebrowEndX[ i ] = 215;
sbgRightEyebrowEndY[ i ] = 90;
}
if( randCo == 1 ) {
//loop is supposed to stall program
for( int w = 0; w <= 1000000000; w++ ){
SBGco[ i ]++;
}
if( SBGco[ i ] == 1000000000 ) {
//moves monster to top
sbgHeadX[ i ] = 200;
sbgHeadY[ i ] = 80;
sbgMouthX[ i ] = 206;
sbgMouthY[ i ] = 110;
sbgBackX[ i ] = 190;
sbgBackY[ i ] = 95;
sbgBackFootX[ i ] = 190;
sbgBackFootY[ i ] = 115;
sbgFrontFootX[ i ] = 197;
sbgFrontFootY[ i ] = 115;
sbgLeftEyeX[ i ] = 205;
sbgLeftEyeY[ i ] = 90;
sbgRightEyeX[ i ] = 215;
sbgRightEyeY[ i ] = 90;
sbgLeftEyebrowStartX[ i ] = 203;
sbgLeftEyebrowStartY[ i ] = 83;
sbgLeftEyebrowEndX[ i ] = 210;
sbgLeftEyebrowEndY[ i ] = 90;
sbgRightEyebrowStartX[ i ] = 220;
sbgRightEyebrowStartY[ i ] = 83;
sbgRightEyebrowEndX[ i ] = 215;
sbgRightEyebrowEndY[ i ] = 90;
}
}
//如果(怪物在y轴上低于400
if(sbgBackFootY[i]>=400){
//确定到达顶部所需时间的随机数
int randCo=(int)(Math.random()*3);
如果(randCo==0){
//将怪物移到顶部
sbgHeadX[i]=200;
sbgHeadY[i]=80;
sbgMouthX[i]=206;
sbgMouthY[i]=110;
sbgBackX[i]=190;
sbgBackY[i]=95;
sbgBackFootX[i]=190;
sbgBackFootY[i]=115;
sbgFrontFootX[i]=197;
sbgFrontFootY[i]=115;
sbgLeftEyeX[i]=205;
sbgLeftEyeY[i]=90;
sbgRightEyeX[i]=215;
sbgrighteyy[i]=90;
sbgLeftEyebrowStartX[i]=203;
sbgLeftEyebrowStartY[i]=83;
sbgLeftEyebrowEndX[i]=210;
sbgLeftEyebrowEndY[i]=90;
sbgRightEyebrowStartX[i]=220;
sbgRightEyebrowStartY[i]=83;
sbgRightEyebrowEndX[i]=215;
sbgRightEyebrowEndY[i]=90;
}
如果(randCo==1){
//循环应该暂停程序
对于(int w=0;w我认为Thread.sleep(..)是你最好的选择。如果你有一个线程,你把它放在睡眠状态并不意味着你有多线程。你可能最好为你的精灵预先计算一条路径,然后给它指定一个速度。然后,在你的“绘制”过程中步骤:根据精灵的路径、速度和时间计算位置。为什么不保留他离开屏幕的时间,然后在他回到屏幕时将其放回:
int initTime= 0;
int elapsedTimeOffScreen = 0
if( sbgBackFootY[ i ] >= 400 ) {
if(initTime!= 0)
initTime= DateTime.Now;
elapsedTimeOfScreen = DateTime.Now - initTime;
if(elapsedTimeOffscreen > 1000)
{
initTime = 0
elapsedTimeOffScreen = 0;
//go back on screen
}
每次重新设置字符时,initTime都会被重置
这将使用时间来检查角色离开屏幕的时间。这肯定比使用cpu周期可靠得多。不要认为他可以线程睡眠。如果我理解他是正确的,单线程渲染他的所有怪物,因此如果你线程睡眠,所有怪物都将停止(而不仅仅是那些穿越边界的怪物)@Michael在重新阅读问题时,我认为你是对的。他应该支持Andrew的解决方案。不要气馁,你的解决方案也很好。我使用了你建议使用系统时间的部分。谢谢。