在过去的几周里,我一直在创造一种基于文本的冒险游戏,它完全围绕玩家的动作而旋转。总体思路是,有一个Simulation类维护世界的状态,这是SimulationController(即玩家)保持动作进行的职责。在大多数情况下,可以说控制器正在告诉仿真器该做什么(即,向前仿真1个时间步长),但有时仿真器需要询问控制器的某些内容。因此,我创建了一个像这样的接口:
/**
* An interface to a GUI, command line, etc;
* a way to interact with the Simulation class
* @author dduckworth
*
*/
public interface SimulationController {
/**
* Returns the index of a choice from a list
*
* @param message: prompt for the player
* @param choices: options, in order
* @return: the index of the choice chosen
*/
public int chooseItem(String message, List<String> choices);
/**
* Returns some text the player must type in manually.
*
* @param message
* @return
*/
public String enterChoice(String message);
/**
* Give the user a message. This could be notification
* of a failed action, some response to some random event,
* anything.
*
* @param message
*/
public void giveMessage(String message);
/**
* The simulation this controller is controlling
* @return
*/
public Simulation getSimulation();
/**
* The primary loop for this controller. General flow
* should be something like this:
* 1) Prompt the player to choose a tool and target
* from getAvailableTools() and getAvailableTargets()
* 2) Prompt the player to choose an action from
* getAvailableActions()
* 3) call Simuluation.simulate() with the tool, target,
* action chosen, the time taken to make that decision,
* and this
* 4) while Simulation.isFinished() == false, continue onward
*/
public void run();
}
所有这一切的主控制循环都必须在
SimulationController.run()
中实现,但是模拟也可以调用其他方法来向播放器请求一些信息。我目前正在将Adobe Flex与BlazeDS一起使用,以创建一个非常简单的用户界面,该界面将通过实现或持有实现
SimulationController
界面的内容与Simulation进行通信。这里有“长时间轮询”的概念,但是我不承认非常了解如何将其与诸如此类的远程对象一起使用。我的问题是,有什么好的设计模式可以将信息推送到播放器,以使所有
Simulation
请求直接进入Flash客户端,并且所有控制循环逻辑都可以停留在Java端?谢谢!
最佳答案
在Wiki上阅读有关Push technology的信息,以了解主要概念。之后,请阅读BlazeDS开发人员指南中的消息传递部分。
我假设您对BlazeDS有一定的经验(至少已将其安装在某些应用程序服务器中)。看一下samples文件夹,您会发现两个有趣的示例(一个聊天应用程序,另一个称为datapush)。它们很容易理解。