loading请求处理中...

游戏编程框架设计

2021-12-02 17:39:12 阅读 8387次 标签: 游戏程序 作者: 陈先生12121

  游戏开发的世界太大了。本文仅对程序实现的抽象逻辑作了浅显的阐述。

  当我去设计一个游戏的时候,一种玩法,包括规则,游戏对象和一系列的游戏系统,纸可以写下来,可以用嘴说出来,但是当我想用程序来实现这堆东西的时候,有一些困难。

  例如,我们都玩五子棋,五子棋有一个明确的规则:“一个人,一个字交替放置棋子,前五个连赢。”在现实世界中,我们不需要考虑五子棋的硬件配置,拿一张白纸,画一个水平和垂直的网格,两个人就可以完成一场五子棋游戏,或者使用普通的棋盘和棋子。不管你玩什么,都很容易。

  但是当我们制作五子棋游戏时,我们需要使用软件来实现这些东西,例如“棋子”和“棋盘”。

  此外,作为一个抽象概念,“游戏规则”和“成败判断”也需要软件来实现,这就要求更多的是“用计算机思考”。

  所以我花了一些时间,依靠有限的本科计算机基础和一些自学的零碎知识,总结出了一个总体的游戏框架设计。

  一、随机开个头

  首先,我将阐述大的抽象概念。没有必要被“抽象”这个词吓倒。什么是抽象是结论的总结。就像自行车一样,飞机和汽车都被抽象为“车辆”。在这里,我将总结这些事物的共性,从而产生了“车”的抽象概念。

  视频游戏程序框架,我认为她是一个循环(循环)过程,“启动游戏——杀死敌人/解密/突破/……”游戏胜利/失败-开始游戏,对,关键词,循环,过程。

  这一概念的进一步完善导致了GameState和GameController的出现。至于为什么会有这两个概念,我参考了UE4提供的GameState和GameMode类,以及Flash中前辈编写的游戏逻辑。到目前为止,我将它们总结为GS和GC。至于更先进的学术论述,我的知识有限。这一水平仍未达到最新水平。

  二.GameState

  GameState是对游戏状态的描述。最基本的两个是游戏玩法(开始游戏)和游戏结束(结束游戏)。游戏结束不能被理解为游戏结束,玩家通常看到。游戏结束,玩家通常看到的意味着游戏失败。在这里,概念仅仅意味着游戏的结束,因为不管你是赢是输,游戏都结束了.

  在此基础上,可以对其进行扩展,如现在的游戏会有主菜单、暂停、或多人模式、游戏设置等,所以我们可以在游戏庄园中添加主菜单、游戏顶层、多人游戏、游戏选项等。

  在游戏状态管理中GameState的用途是什么?最重要的是让你清楚地知道如何编写游戏,或者给你一个起点。对于管理游戏过程的便利性,便于后续游戏程序的功能扩展,减少游戏系统的耦合等方面,存在着太多的问题。

  至于如何使用GameState,它是用来切换的,作为一个标志来识别游戏的当前状态。

  在此之前,我阅读了《游戏AI编程案例的本质》一书,该书详细介绍了FSM在游戏AI中的应用和扩展。因此,使用FSM进行游戏处理是不合适的。《Lua游戏开发实践指南》中提到了“对于Singleton,只要方便就可以使用它们”。虽然这句话太过充实,但也不符合中国人的思维,也不符合辩证法(笑声),但在一定程度上也显示了单例的实用性和普遍性。此外,使用Singleton的FSM来处理GameState对我来说非常棒。

  当然,以上是对抽象概念的阐述。最终,当涉及到游戏编程时,它必须根据一些编程语言的语法和特征来实现。在这里,我还给出了一个Unity c#的原型代码,它可以看作是伪代码。

  Unity的C#的原型代码:

  publicclassS_GameState : MonoBehaviour {

  publicenumGameState

  {

  GamePlay,

  GamePause,

  GameOver,

  GameReady,

  GameInit

  }

  publicstaticS_GameState Instance;

  privateGameState m_GameState;

  void Awake()

  {

  Instance = this;

  }

  publicGameState GetGameState()

  {

  returnm_GameState;

  }

  publicvoid ToGamePlay()

  {

  m_GameState = GameState.GamePlay;

  }

  publicvoid ToGamePause()

  {

  m_GameState = GameState.GamePause;

  }

  publicvoid ToGameOver()

  {

  m_GameState = GameState.GameOver;

  }

  publicvoid ToGameInit()

  {

  m_GameState = GameState.GameInit;

  }

  }

  补记:

  对于FSM和Singleton,最好咨询谷歌老师。但是,这里我将详细介绍FSM的一些应用。FSM在早期的游戏AI的构建中使用过。毕竟,在科研领域,游戏AI与AI是不同的。游戏AI不是为了让玩家无法打败而建立的。基本上游戏AI是一套规则,比如《黑暗之魂3》中的第一个BOSS。古达,其中一条规则是,混血之后,一切都会改变。当它改变时,会有动画,不会攻击。玩家可以轻易地砍下一块体力,然后全身撤退。这条规则几百次也不会改变。

  回到最初的话题,FSM在AI游戏中广泛使用的地位已经基本被行为树所取代。然后FSM一直从事角色动画的管理,如第三人称玩家角色的动画切换,UE4和Unity使用FSM来管理动画状态切换。

  GameController

  在GameState之后,是时候谈谈GameController了。

  游戏管理员用来管理游戏的规则,如启动游戏,创建玩家的角色、敌人、地图等。玩家按ESC暂停游戏,玩家通关,精彩,游戏结束;

  GameController比GameState更具体。GameController基本上是在GameState switch之后处理一系列的任务。游戏产业仍然是五子棋。例如,游戏产业从主菜单切换到游戏玩法。GameController将加载一个加载画面,加载后取消加载画面,并显示一个棋盘等待。当然,OnLoading也可以用作游戏状态。不管你是否想要游戏的OnLoading状态,它都在灵活性选项中(笑声)。

  有必要对游戏状态进行检测,如果游戏在某一时刻改变了状态,那么作为GameController,你就得做点什么,这么快!快!辛苦!

  所以在一个单独的线程中,整个while (true)会不断迭代,以确定游戏状态是否已被切换。

  当然,GameController也可以使用Singleton。我认为这很好。它既能异步执行,又能快速、全面地满足快速、准确的要求。它还分离了渲染线程和游戏逻辑线程。并行优化/降级似乎非常好(笑声)。对于小型游戏,多线程可能会用牛刀杀死鸡,但却会恶化游戏。的性能。

  但是现在游戏引擎有一个函数叫per frame,所以把游戏状态检测放在里面也很好。在这里,我们提供了一个c#统一代码作为参考。

  Unity的C#的原型代码:

  void Awake()

  {

  Instance = this;

  }

  void Start()

  {

  m_StartWait = newWaitForSeconds(m_StartDelay);

  m_EndWait = newWaitForSeconds(m_EndDelay);

  StartCoroutine(GameStateOperator());

  }

  IEnumeratorGameStateOperator()

  {

  while(true)

  {

  switch(S_GameState.Instance.GetGameState())

  {

  caseS_GameState.GameState.GameInit:

  GameInit();

  break;

  caseS_GameState.GameState.GameReady:

  GameReady();

  break;

  caseS_GameState.GameState.GamePlay:

  GamePlay();

  break;

  caseS_GameState.GameState.GamePause:

  GamePause();

  break;

  caseS_GameState.GameState.GameOver:

  GameOver();

  break;

  }

  yieldreturnnull;

  }

  }

  补记:

  这里使用Unity的伪线程(co-threading)来促进多线程的引用,同时也使代码结构更加清晰。

  四、状态切换

  GameState提供了游戏状态切换,GameController提供了状态切换后的工作处理,所以问题来了,什么是切换GameState?

  自然,GameObejct, player roles, Npc, a bullet, some trigger,键盘操作等等。回到上面,查看GameState的切换函数使用的是public。这就是为什么,不管怎样,它都是静态的,有点裸露。我认为它很好(笑)。

  例如,回到最初的主题,玩家角色可能具有HP属性。当HP==0时,GameOver调用GameState的状态切换函数并调用GameOver。此时,GameController检测到游戏状态切换并开始完美响应。

  当然,GameController也可以使用状态切换。例如,一些倒计时计算,如检查点,需要在GameController中编写。当倒计时为0时,游戏结束,这时GameController需要调用切换函数。同样,在GameController中玩家角色的HP检测并不是不可避免的,但这显然不符合OOP的设计原则,所以明显增加了耦合,软件工程教师会很生气。但我只是想惹他生气(笑)。

  补充说明:

  对于游戏对象的分析和设计,我认为有必要综合OOP的思想和设计原则。虽然大多数主流游戏类型都有原型,比如非常人性化的UE4,但是提供了各种类型的游戏原型,UML和其他工具也非常好用。当然,我们不能忘记UI的设计。UI适用于游戏程序。有效利用游戏地产是一个很好的切入点。下一篇文章我将讨论UI设计。

                 网络游戏程序开发的流程步骤有哪些

Tag: 框架

开发公司推荐

成为一品威客服务商,百万订单等您来有奖注册中

留言( 展开评论

快速发任务

价格是多少?怎样找到合适的人才?

官方顾问免费为您解答

 
相关任务
DESIGN TASK 更多
桌面应用程序开发

¥50000 已有0人投标

自助打印小程序开发

¥3000 已有7人投标

游戏公司取名

¥200 已有97人投标

驾校公众号/小程序开发

¥50000 已有1人投标

游戏二次开发

¥100 已有0人投标