如何在一个循环里面加入一个延迟的功能?


我给方块设置了一个特性,但是这个特性同时作用的对象过多时,会导致游戏崩溃,怎么样在一个循环里面加入一个延迟的功能,使得有关特性的循环执行得慢一些?我用了try…catch语句,结果导致了循环中的功能不起作用了,也就是方块的“特性”消失了。这个是我的代码:

private boolean absorb(World worldIn, BlockPos pos) {
    Queue<Tuple<BlockPos, Integer>> queue = Lists.newLinkedList();
    queue.add(new Tuple<>(pos, 0));
    int i = 0;

    while(!queue.isEmpty()) {
        Tuple<BlockPos, Integer> tuple = queue.poll();
        BlockPos blockpos = tuple.getA();
        int j = tuple.getB();

        for(Direction direction : Direction.values()) {
            BlockPos blockpos1 = blockpos.offset(direction);
            BlockState blockstate = worldIn.getBlockState(blockpos1);

            if (blockstate.getBlock() == Blocks.OBSIDIAN) {
                TileEntity tileentity = blockstate.getBlock().hasTileEntity() ? worldIn.getTileEntity(blockpos1) : null;
                spawnDrops(blockstate, worldIn, blockpos1, tileentity);
                worldIn.setBlockState(blockpos1, BlockHelper.obsidianRemover.getDefaultState(), 3);
                ++i;
                if (j < 6) {
                    queue.add(new Tuple<>(blockpos1, j + 1));
                }
            }

            try{
                Thread.currentThread().sleep(100);
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }

        }

        if (i > 1) {
            break;
        }
    }

    return i > 0;
}

}


FledgeXu


我不认为在循环里加入一个延时是一个好主意,你可以试试用事件机制来代替循环。


FledgeXu


你可以试着监听 net.minecraftforge.fml.common.gameevent.TickEvent



如何进行监听的操作?


FledgeXu


就是正常的注册事件处理器啊。


FledgeXu


我在解决其他问题的时候发现一个可能对你有所帮助的函数。
worldIn.getPendingBlockTicks().scheduleTick();



可以直接放进那个方法里面吗?


FledgeXu


这我就不知道了。


Snownee


MC是个单线程游戏。