幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: shawind

[问题]关于以MVC模式组织的游戏引擎

[复制链接]

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-9-28 00:25:32 | 显示全部楼层
100行实现像mvc这么复杂的模式.....反正就我这水平铁定写不出来。 [s:6]
这个不是像rails那样的mvc,mvc到底应该怎么写,还在学习中。
  1. interface view
  2. {
  3.     void loop(list GameObjList);
  4.     private void sendEvent(Event e);
  5.     private Event getEvent();
  6. }
  7. class Game : view
  8. {
  9.     void this()
  10.     {
  11.         initDevice();
  12.     }
  13.     void this()
  14.     {
  15.         releaseDevice();
  16.     }
  17.    
  18.     void loop(list GameObjList)
  19.     {   
  20.         Event e;
  21.         loadResource(GameObjList);
  22.         show(GameObjList);
  23.         if (getEvent(Event e) != null)
  24.         {
  25.             sendEvent(Event,e);
  26.         }
  27.     }
  28.    
  29.     private void sendEvent(list EventList,Event e);
  30.    
  31.     private Event getEvent();
  32.    
  33.     private void show(){
  34.         switch (GameObj.type)
  35.         {
  36.             case 0: showPic(GameObj);
  37.             case 1: playSound(GameObj);
  38.             default: break;
  39.         }
  40.     }
  41.    
  42.     private void showPic(list GameObjList)
  43.     {
  44.         从GameObj.state显示图片
  45.     }
  46.    
  47.     private void playSound(list GameObjList)
  48.     {
  49.         从GameObj.se播放音效
  50.     }
  51.    
  52.     private void loadResource(list GameObjList)
  53.     {
  54.         从GameObj.resource载入资源
  55.     }
  56.    
  57.     private void initDevice(){}
  58.    
  59.     private void releaseDevice(){}
  60. }
  61. interface module
  62. {
  63.     private void add(list GameObj);
  64.     private void del(list GameObj);
  65.     void changeState();
  66. }
  67. class  GameObj : module
  68. {
  69.     private int type;
  70.     private int[4] state;//x,y,w,h
  71.     private int[char[]] resource;
  72.     private char[] se;
  73.    
  74.     void getType();
  75.     void setType(int i);
  76.    
  77.     void int[4] getState();
  78.     void setState(int[4] i);
  79.     void int[char[]] getResource();
  80.     void setResource(int[char[]] r);
  81.     void char[] getSE();
  82.     void setSE(char[] c);
  83.     private void add(list GameObj);
  84.     private void del(list GameObj);
  85.    
  86.     void changeState(delegate d){
  87.     }
  88. }
  89. interface controller
  90. {
  91.     private void parse(list EventList);
  92. }
  93. class System : controller
  94. {
  95.     this()
  96.     {
  97.         parse(list EventList);
  98.     }
  99. }
  100. class character : GameObj
  101. {
  102.     char[] name;
  103.     int[] action;
  104.     ....
  105. }
复制代码

对于这个构架,还很多东西还没有想清楚,特别是controller那一块,一团糟,本来发这个贴子就找个现成的抄一下,也没想过要自己去实现一个。[s:5]
那个两个list,方便起见,全局了。代码虽然是d的,还是当作伪代码看的为好,像这种头脑不清楚的时候写出来的东西其实是没法看的。  [s:5]
え~え~お!!!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-9-28 09:46:14 | 显示全部楼层
哦嗯,看到最后原来是D,正想发问,到最后才看到.几种语言太像了也是个麻烦事.我居然把this()这特征给看漏了.

先是想说,MVC是Model-View-Controller,M不是module...
然后想说的是,所谓的MVC并不是真的只把M/V/C每部分组织成一个类,当然上面的代码为了简短没写全这点可以理解,只是想提醒下.为什么要提呢? 因为我看到"setSE"这类的东西了.我觉得model中应该只包含核心数据和业务逻辑,如果这里的SE是文件名的话那我觉得这"污染"了业务域,具体文件名完全可以在view的一层对下面的model再封装时设置;假如这里的SE只储存了SE的类型,例如说"SE_SHOCK""SE_BANG"之类的,那OK,问题不大.

前面我说之前的例子里observer存在于model内,是因为我觉得LZ对MVC期待的过多了,似乎有点过火的意思.并不是说模式不可以组合应用,只是over-design并不是件好事.
如果说需要按固定时间间隔来刷新view,发出"刷新"这个命令的可以是controller组件的一部分.做在view里也可以,看你如何定义自己的view的责任范围.

上面这段代码说实在的...说不清楚 -_,
引用第26楼lw于2007-09-27 19:52发表的  :
看了以前前面所说的,感觉SHAWIND应该打算以C+代码为主体,实现的是一种结构,而不是想做一个倾向于XX游戏的EG,所以基本和脚本编程可以说没啥太大关系,非得和脚本混在一起有点偏离了巴?当然偶只是猜测意
是的,我也觉得LZ想写的代码跟脚本没什么关系,所以到后面推荐的那个正是一个以DLL模块为基础,以比较平的架构拼装起来的这么一个范例.只不过同样是YY,LZ想到的是MVC,我想到的是脚本而已.
那个范例(无源代码)可以在官网下到, http://wisdom.sakura.ne.jp/products/soft/cisqua.html
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-9-28 11:08:55 | 显示全部楼层
代码后面,我就说了我自己都还没有理清思路呢。这样写出来的东西,别人看了还能理清楚,那才是怪事 [s:2]  
用记事本仓促打的,什么都不说,首先命名就不符合习惯,就别说其他东西了。
还是别太深究这个垃圾东西才是[s:5]

你说的那些要点我都记下了。正式实现的时候我会注意的。

嗯,如果刷新放在controller,那就可以把Game这个对象放在model中。这样一来,就更像是真正的mvc了。不错的思路,YY中.....

也不是我想过度使用设计模式,其实我只是看中了分Model,View,Controller的设计办法。而这三块之间到底是什么关系,内部又是怎么组织,我还没有真正的想清楚。

脚本的问题也不我先提出来的.... [s:5],还以为是用脚本的办法来分离各个抽象,到后面那就说得晕头转向了。

至于不用vc来写,这个纯粹个人偏好...
え~え~お!!!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-9-28 13:43:56 | 显示全部楼层
我是以前做作业的时候over-design了很吃了点苦头所以才有感触的...sigh
当时研究MVC用了好多精力.不过我那作业还是跟GUI相关,算是MVC的一种典型应用了,比LZ想在这里用的简单多了,概念上说的话...至少不会绕来绕去绕不清楚 XD
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-9-28 14:13:31 | 显示全部楼层
我还是uml工具画图再画图,只是想想,总是感觉很模糊。
还得试试看逆向思维,先YY出利用这个引擎开发游戏的过程,然后反过来设计引擎。
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-9-28 19:41:20 | 显示全部楼层
逆转思维么? ………………

D的特性已经超出自己需要的范围了,不想看……所以先暂时当作C++来理解

托下慢慢看巴……
Style-C
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-9-28 20:03:19 | 显示全部楼层
插话:不知道D中的list是不是类似于C++的stl的list,那个太庞大了……
而如果相对的,如果都要自己写也有点麻烦,不过偶还是倾向于后者……
Style-C
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-9-28 20:30:15 | 显示全部楼层
看了一下,每个M V C都各自有一个接口定义,之后每个都被实例化到具体的类型:
Game 用来显示,包括加载资源、初始设备、调用渲染等
GameObj和Charactor是用于存放数据
最后System定义了分析事件列表的功能

随便问几个问题:
(1) 想问问,如果是DX实现,那类似于VertexBuffer应该放在哪里?
(2) 如果getEvent能够获得事件消息,消息是从哪里产生的,保存在什么地方?另外这里的消息是不是用户键盘等输入?还是有各类的消息?
(3) 主函数会怎么调用偶还不知道= =是哪个初始化,然后怎么调用的呢?凭感觉是调用CONTROL巴………………
Style-C
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2007-9-28 21:13:48 | 显示全部楼层
因为我想不清controller到底应该怎么弄,所以才想,是不是要反过来想一下。

D中可以比较方便的用模板写出来一个自己的list,想什么功能,就怎么写。(网上也有很多现成的。比如在dfl的那个网站上就有现成的下,功能上和stl的差不多。)这里只是为了说明一下那个意思,就没有具体写了。

dx也应该放在Game里面去实现吧。也就是所有图形,声音,资源处理,获取键盘事件,全部都是放在Game中。当时写的时候是想,要是能把Game类实例化后,就可以得到一个完整的客户端那多好。据说mvc除了作gui方便外,在作c/s的时候,也有优势。我是照葫芦画瓢,抄了rails那样的思路。 rails程序就是运行在服务器上,而view部分最终是表现在用户的ie上。如果能实现出来,引擎就可以兼顾单机游戏和网络游戏的开发,这个目标不是很YY么?[s:1]

现在是想到,从game那里获得的event,是递给controller来保有和处理的。最后引擎的入口,似乎可能大概是在controller那里吧,老实说,对于controller这块,我脑子里还是一片混沌。大家一起帮我想想吧 [s:6]
え~え~お!!!
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-9-28 23:27:18 | 显示全部楼层
SHA大打算CONTROL里面做点什么,大概的就行
是指令么?(不一定只有脚本才有指令)

list的话,D方法
不是很清楚,里面不需要考虑类型么?数据存放是直接存放的还是用一个什么指引?

所谓一个图形引擎个人理解是一套实现方法,像VERTEXBUFFER这种,个人认为是数据,即需要不同的GAMEOBJ持有不同的对象,或者至少分批分组保存,难道VIEW里面也有实例的概念?如果真的有,那么应该怎么保存呢?

CS传递主要是消息,输入等,对于客户机而言应该当作用户或者第三方的输入,直接影响到FRAMEMOVE这个部分,也可以被缓存……具体看实现了……

以上
Style-C
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-4 00:49 , Processed in 0.022734 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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