在程序中运行程序逻辑

时间:2015-02-15 14:18:03

标签: java multithreading parallel-processing libgdx

注意:此线程不是从另一个程序中启动已编译的程序。而是与主程序并行运行另一个程序逻辑。


在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步调用。

还有其他解决方案吗?很难找到相似内容的文档或其他实现,因为大多数应用程序都不像电子游戏那样是实时的。

0 个答案:

没有答案