As3 OOP游戏结构(类架构)

时间:2009-09-28 08:51:18

标签: flash actionscript-3 oop architecture

游戏说明: 每个级别的不同级别和不同类型的视觉问题的测验 到目前为止的OOP:GameBoard(其中一个回答问题),Dialog,HighScore,Controller / LevelController?

我有一个名为Controller的文档类初始化游戏:

public function Controller() 
{
    initGame();
}    

function initGame() 
{
    xmlGameData = levels, questions xml
    highscore:HighScore = new HighScore();
    startGame();
}

function startGame() 
{
    levelController = new LevelController( this, xmlGameData );
}

然后我开始将对“Document class / main timeline”的引用传递给我的不同对象,该对象本身扩展了MovieClip或Sprite。

public function LevelController(docClass, xml)
{
   mainTimeLine = docClass;
   xmlGameData = xml;

   loadGameBoard(); 
   nextLevel();
} 

function loadGameBoard()
{
   gameBoard = new GameBoard(mainTimeLine, this);
   mainTimeLine.addChild(gameBoard);
}

经过一段时间后,这变得相当混乱,我想知道更好的方法来控制不同的对象(如GameBoard和HighScore)和状态(级别)和操作(AnswerQuestion,NextQuestion等),也许是一个单一的控制点。

4 个答案:

答案 0 :(得分:4)

我为控制游戏的“UI”和“支持”功能所做的工作(屏幕流程,分数提交,级别提升)是在主游戏控制器类中放置一系列静态函数来处理显示/隐藏游戏屏幕的所有逻辑,通过levelData数组推进迭代器并处理来自一个中心位置的所有服务器端提交。

它基本上是一个具有一系列静态函数的类,例如:

public static function LoadUserData() {}
public static function SaveUserData() {}
public static function PlayNextLevel() {}
public static function SubmitScore() {}
public static function ShowLevelPlayScreen() {}
public static function ShowLevelPauseScreen() {}
public static function ShowGameOverScreen() {}

等...

只有这些控制器中的一个,所以打包静态函数可以解决问题,从代码中的任何地方都可以轻松访问,并且在语法上更清晰,而不是将它变成Singleton。

答案 1 :(得分:1)

嗯......我假设你的问题是 “管理游戏比我在这里有什么更好的结构” 虽然没有明确说明我会尝试回答

我不认为多态性是你做什么的最佳解决方案。 OOP不仅仅是一系列对象。它将功能分组为有用的对象。

我希望将更多功能转移到Controller中

1.) a main object with all the following functionality that will be present 
    throuhout the game
    a.) go to level (next/previous)
    b.) keep track of score
    c.) controll the state of the game
    d.) anything else that exists throughout the game

2.) level objects that handle level specific information
    a.) interactivity of the questions such as buttons etc.
    b.) managing the correct answer and the impact it has on the score in main

答案 2 :(得分:1)

我是这样做的。

由于这是Flash,我让我的游戏设计师友好。这意味着我每帧实例化对象。我知道人们会对我进行投票,但我知道有很多设计师为此感谢我(他们在修改任何代码时都不需要修改代码)。

基本上,让每个可见对象(可以是“蒙皮”)都是MovieClip的子类。让它通过自定义事件进行通信,通常是在哪里 - 例如'board'(也是一个MovieClip)。

这是一个简单的Word搜索游戏的code example,可以帮助您更好地理解我在说什么。

答案 3 :(得分:0)

Fire Crow有正确的想法。你想要做的是将游戏中的变化与游戏本身区分开来。因此,您的Controller对象将包含适用于所有级别的游戏功能,例如分数,显示精灵,GUI信息以及引用当前级别的级别数组。你的游戏由一系列关卡组成,所以它们自然应该由Level对象表示。每个级别都知道如何绘制自己并处理来自玩家的输入。 level对象可以在Controller完成时通知Controller,然后Controller可以显示数组中的下一级。