游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10545|回复: 41

现在的很多游戏开发,完全反过来了

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-10-2 11:05:00 | 显示全部楼层 |阅读模式
理想,方便,轻松,稳定的方式应该是:

大框架(状态机):过程式(多任务)
细节(运行规律):函数式


但是现在的程序员,和数理学家,走的都是“事倍功半”的路,分析如下:


现在的游戏开发是(注意:完全反过来了!):

大框架(状态机):函数式
细节(运行规律):过程式(多任务)

现在的一部分软件是:

大框架(状态机):过程式(多任务)
细节(运行规律):过程式(多任务)

数学物理是:

大框架(状态机):函数式
细节(运行规律):函数式


这些东西都不方便!!


理由:

1 状态机的实现:
  为什么要用 函数式 去实现状态机!? ---- DOS的控制台程序员会嘲笑我们。
2 运行规律的实现:
  为什么要用复杂的,bug满天飞的 过程式!? ---- 数理学家会嘲笑我们。

总结:

>> 状态机用 if ... then ... else ... 写, 而不是 interface IStateMachine, 或 switch(m_State)
  
>> 运行规律用 y = g(f(x)) 写,而不是 x = x + a;  x = x + b;

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-10-2 11:10:00 | 显示全部楼层

Re:现在的很多游戏开发,完全反过来了

我在举一个人人都知道的例子:

编程序的时候,难度在于: 怎样    轻    松    实现如 x = 2y 这样的恒等式,而不出bug
做物理的时候,难度在于: 怎样    轻    松    处理如 一个物体的 2 个运动阶段(状态)

把程序(过程式语言) 的    优    点 (状态转换)
和物理(函数型语言) 的    优    点 (等式,关系,规律)

结 合 起 来,

就是最最轻松,稳定,理想的----软件/游戏开发

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-1-4 22:08:00 | 显示全部楼层

Re:现在的很多游戏开发,完全反过来了

http://bbs.gameres.com/showthread.asp?page=end&threadid=121850

7

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2009-1-5 01:16:00 | 显示全部楼层

Re:现在的很多游戏开发,完全反过来了

状态机用 if ... then ... else ... 写和 switch(m_State)的区别在于...?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-1-5 03:16:00 | 显示全部楼层

Re: Re:现在的很多游戏开发,完全反过来了

polarboy: Re:现在的很多游戏开发,完全反过来了

状态机用 if ... then ... else ... 写和 switch(m_State)的区别在于...?


区别在于: 前者是自动,后者是手动。

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2009-1-5 08:51:00 | 显示全部楼层

Re:现在的很多游戏开发,完全反过来了

switch case可以有个优化的

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-1-5 16:15:00 | 显示全部楼层

Re: 现在的很多游戏开发,完全反过来了

状态机用 if ... then ... else ... 写, 而不是 interface IStateMachine, 或 switch(m_State)


晕,不要出来误导别人了
if..else..或者switch只适用于最简单的状态机
稍微复杂一点的都应该封装成对象,利用多态实现

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-1-5 16:18:00 | 显示全部楼层

Re: Re:现在的很多游戏开发,完全反过来了

小小C: Re:现在的很多游戏开发,完全反过来了

switch case可以有个优化的


你没明白我说的是什么

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-1-5 16:48:00 | 显示全部楼层

Re: Re: 现在的很多游戏开发,完全反过来了

clayman: Re: 现在的很多游戏开发,完全反过来了



晕,不要出来误导别人了
if..else..或者switch只适用于最简单的状态机
稍微复杂一点的都应该封装成对象,利用多态实现


稍微复杂一点的都应该封装成对象,利用多态实现
---- 这和 switch(m_State) 不是一样的吗?(这点文中也提到了)
本贴以简洁的一句话概括而已(我认为有经验的程序员应该知道这些不用说的东西)

如果还不太清楚,那么我再提示一下:
注意,不是 switch 而是 switch(m_State) 而 “if...else...”是没有“m_State”的

20

主题

136

帖子

172

积分

注册会员

Rank: 2

积分
172
发表于 2009-1-5 17:04:00 | 显示全部楼层

Re: 现在的很多游戏开发,完全反过来了




  1. class Bullet
  2.         : public FiniteStateMachine
  3. {
  4. private:
  5.         float speed, distance;

  6. public:
  7.         enum _ValFlg
  8.         {
  9.                 fSpeed,
  10.                 fDistance
  11.         };

  12.         enum _ActFlg
  13.         {
  14.                 actQueryState,
  15.                 actRun,
  16.                 actDie
  17.         };

  18.         enum _StateFlg
  19.         {
  20.                 stateStand,
  21.                 stateDie
  22.         };

  23.         Bullet()
  24.                 : speed(), distance()
  25.         {}

  26.         float SetFloatValue(uint flag, float val)
  27.         {
  28.                 switch (flag)
  29.                 {
  30.                 case fSpeed:
  31.                         return _SetVal(speed, val);
  32.                 case fDistance:
  33.                         return _SetVal(distance, val);
  34.                 }

  35.                 return FiniteStateMachine::SetFloatValue(flag, val);
  36.         }

  37.         float GetFloatValue(uint flag)
  38.         {
  39.                 switch (flag)
  40.                 {
  41.                 case fSpeed:
  42.                         return _GetVal(speed);
  43.                 case fDistance:
  44.                         return _GetVal(distance);
  45.                 }

  46.                 return FiniteStateMachine::GetFloatValue(flag);
  47.         }

  48.         int Action(uint flag)
  49.         {
  50.                 Object3D& refBullet = *object;

  51.                 if (flag == actQueryState)
  52.                 {
  53.                         if (refBullet.GetCatalogue() == Object3D::catNone)
  54.                                 return stateDie;
  55.                         return stateStand;
  56.                 }

  57.                 if (flag == actRun)
  58.                 {
  59.                         refBullet.Move(Vector3(0, 0, speed));

  60.                         if (distance + speed > 1000.0f)
  61.                                 refBullet.SetCatalogue(Object3D::catNone);

  62.                         else distance += speed;
  63.                 }

  64.                 if (flag == actDie)
  65.                         refBullet.SetCatalogue(Object3D::catNone);

  66.                 return FiniteStateMachine::Action(flag);
  67.         }
  68. };

  69. ...

  70.         Object3D& refBullet = scene.mapDynamicObject[iBullet << 16 | catBullet];
  71.         refBullet.AttachModel(mod2);
  72.         refBullet.AttachFiniteStateMachine(new Bullet);
  73.         refBullet.SetPosition(plane.GetPosition());
  74.         refBullet.SetAxis(plane.GetAxis());
  75.         refBullet.SetFloatValue(Bullet::fSpeed, 20.0f);
  76.         refBullet.SetFloatValue(Bullet::fDistance, 0);
  77.         refBullet.SetCatalogue(catBullet);

复制代码


希望对你有帮助
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 12:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表