注意:此线程不是从另一个程序中启动已编译的程序。而是与主程序并行运行另一个程序逻辑。
在libGDX中,用屏幕处理游戏。屏幕具有特定类型的显示和输入。例如:菜单屏幕,游戏屏幕和选项屏幕。
在大多数基本游戏中切换游戏画面并不是真正的问题。你知道,从菜单中你可以去游戏或选项,你知道当你完成选项和游戏时,你会回到菜单。因此,你可以在这些课程中对目标屏幕进行硬编码,它就像一个"转到菜单屏幕"。
我的一个屏幕将由子屏幕组成,该屏幕与屏幕具有相同的逻辑,除了它在该屏幕处于活动状态时堆叠多个子屏幕。现在我正在尝试制作某种混合视频/棋盘游戏引擎。其中一个子屏幕可能是"从您的手中选择一张卡",现在在这种情况下,可能有多种情况可以从您的手牌中播放一张牌。这意味着当选择卡时,你实际上不知道下一步该去哪里。例如,让我们采用转向顺序:
现在,您想要重复使用"从您手中播放卡片的代码"确保你没有两次编码相同的东西。但是在这里,"从你的手牌里拿一张牌"不知道下一步是否应播放所选择的卡片或将所选卡片放入丢弃堆中。所以它不能使用" GoTo"方法
事实上,我需要有一些" Program"更改将映射游戏过程的屏幕。游戏将首先绘制一张牌,然后作为玩家选择一张牌,然后使用返回值并将该牌放入游戏中等。这在常规程序中效果很好,但这在Libgdx中似乎更难做,因为框架是实时的。因此,在每个执行的命令之后,我需要将程序的句柄返回到libgdx,以便他可以进行适当的动画和渲染。否则程序将冻结并等待用户输入,这将永远不会起作用。所以我需要和libgdx程序并行运行一个程序,告诉libgdx根据游戏逻辑显示哪个子屏幕。
到目前为止,我找到了2个解决方案,但我想知道是否还有其他我可以使用的解决方案。
第一个不优雅的解决方案是指令指针。就像处理器在汇编中一样,记住要运行的下一条指令的ID,有一个巨大的开关案例,列出所有可能的指令。每次调用render时,都会检查子屏幕是否完成,如果是,它将执行下一条指令。它可能看起来像这样:
注意:代码并不完美,只是为了说明。
static int IP = 1; // instruction pointer
if ( subscreen_finished == true )
switch ( IP )
{
case 1:
hand.draw_card();
IP = 2;
break;
case 2:
hand.chose_card();
IP = 3;
break;
case 3:
play_card ( hand.getcard());
IP = 4;
break;
case 4:
hand.chose_card();
IP=5;
break;
case 5:
hand.discard ( hand.getcard() );
IP=6
break;
case 6:
end_of_turn();
break;
}
每个函数调用都会将subscreen_finished设置为false。它基本上等待用户输入,或等待动画完成后再将其设置为true。
正如你所看到的,它实际上并不优雅,并且可能很难遵循该程序,特别是如果你想要像#34;做3个动作"。
第二种方法是运行一个可以像这样工作的并行线程
hand.draw_card();
hand.chose_card();
hand.play_card ( hand.getcard );
hand.chose_card();
hand.discard ( hand.getcard );
end_of_turn();
每个函数调用都会设置正确的子屏幕并进入等待循环,直到玩家选择了答案或动画完成。看起来更优雅,但我必须使用多线程。
在另一个帖子中,有人建议使用状态机和消息传递。
但状态机并不适合我。因为在我上面的例子中,如果游戏是在#34;从手中选择了一张牌" state,为了知道接下来要做哪个状态,它需要知道所有先前完成的步骤。或者知道我们在第4步,下一步是5因为"选择了卡"可以在第2步或第4步调用。
还有其他解决方案吗?很难找到相似内容的文档或其他实现,因为大多数应用程序都不像电子游戏那样是实时的。