shawind
发表于 2007-9-28 00:25:32
100行实现像mvc这么复杂的模式.....反正就我这水平铁定写不出来。
这个不是像rails那样的mvc,mvc到底应该怎么写,还在学习中。
interface view
{
void loop(list GameObjList);
private void sendEvent(Event e);
private Event getEvent();
}
class Game : view
{
void this()
{
initDevice();
}
void this()
{
releaseDevice();
}
void loop(list GameObjList)
{
Event e;
loadResource(GameObjList);
show(GameObjList);
if (getEvent(Event e) != null)
{
sendEvent(Event,e);
}
}
private void sendEvent(list EventList,Event e);
private Event getEvent();
private void show(){
switch (GameObj.type)
{
case 0: showPic(GameObj);
case 1: playSound(GameObj);
default: break;
}
}
private void showPic(list GameObjList)
{
从GameObj.state显示图片
}
private void playSound(list GameObjList)
{
从GameObj.se播放音效
}
private void loadResource(list GameObjList)
{
从GameObj.resource载入资源
}
private void initDevice(){}
private void releaseDevice(){}
}
interface module
{
private void add(list GameObj);
private void del(list GameObj);
void changeState();
}
classGameObj : module
{
private int type;
private int state;//x,y,w,h
private int] resource;
private char[] se;
void getType();
void setType(int i);
void int getState();
void setState(int i);
void int] getResource();
void setResource(int] r);
void char[] getSE();
void setSE(char[] c);
private void add(list GameObj);
private void del(list GameObj);
void changeState(delegate d){
}
}
interface controller
{
private void parse(list EventList);
}
class System : controller
{
this()
{
parse(list EventList);
}
}
class character : GameObj
{
char[] name;
int[] action;
....
}
对于这个构架,还很多东西还没有想清楚,特别是controller那一块,一团糟,本来发这个贴子就找个现成的抄一下,也没想过要自己去实现一个。
那个两个list,方便起见,全局了。代码虽然是d的,还是当作伪代码看的为好,像这种头脑不清楚的时候写出来的东西其实是没法看的。
rednaxela
发表于 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
shawind
发表于 2007-9-28 11:08:55
代码后面,我就说了我自己都还没有理清思路呢。这样写出来的东西,别人看了还能理清楚,那才是怪事
用记事本仓促打的,什么都不说,首先命名就不符合习惯,就别说其他东西了。
还是别太深究这个垃圾东西才是
你说的那些要点我都记下了。正式实现的时候我会注意的。
嗯,如果刷新放在controller,那就可以把Game这个对象放在model中。这样一来,就更像是真正的mvc了。不错的思路,YY中.....
也不是我想过度使用设计模式,其实我只是看中了分Model,View,Controller的设计办法。而这三块之间到底是什么关系,内部又是怎么组织,我还没有真正的想清楚。
脚本的问题也不我先提出来的.... ,还以为是用脚本的办法来分离各个抽象,到后面那就说得晕头转向了。
至于不用vc来写,这个纯粹个人偏好...
rednaxela
发表于 2007-9-28 13:43:56
我是以前做作业的时候over-design了很吃了点苦头所以才有感触的...sigh
当时研究MVC用了好多精力.不过我那作业还是跟GUI相关,算是MVC的一种典型应用了,比LZ想在这里用的简单多了,概念上说的话...至少不会绕来绕去绕不清楚 XD
shawind
发表于 2007-9-28 14:13:31
我还是uml工具画图再画图,只是想想,总是感觉很模糊。
还得试试看逆向思维,先YY出利用这个引擎开发游戏的过程,然后反过来设计引擎。
lw
发表于 2007-9-28 19:41:20
逆转思维么? ………………
D的特性已经超出自己需要的范围了,不想看……所以先暂时当作C++来理解
托下慢慢看巴……
lw
发表于 2007-9-28 20:03:19
插话:不知道D中的list是不是类似于C++的stl的list,那个太庞大了……
而如果相对的,如果都要自己写也有点麻烦,不过偶还是倾向于后者……
lw
发表于 2007-9-28 20:30:15
看了一下,每个M V C都各自有一个接口定义,之后每个都被实例化到具体的类型:
Game 用来显示,包括加载资源、初始设备、调用渲染等
GameObj和Charactor是用于存放数据
最后System定义了分析事件列表的功能
随便问几个问题:
(1) 想问问,如果是DX实现,那类似于VertexBuffer应该放在哪里?
(2) 如果getEvent能够获得事件消息,消息是从哪里产生的,保存在什么地方?另外这里的消息是不是用户键盘等输入?还是有各类的消息?
(3) 主函数会怎么调用偶还不知道= =是哪个初始化,然后怎么调用的呢?凭感觉是调用CONTROL巴………………
shawind
发表于 2007-9-28 21:13:48
因为我想不清controller到底应该怎么弄,所以才想,是不是要反过来想一下。
D中可以比较方便的用模板写出来一个自己的list,想什么功能,就怎么写。(网上也有很多现成的。比如在dfl的那个网站上就有现成的下,功能上和stl的差不多。)这里只是为了说明一下那个意思,就没有具体写了。
dx也应该放在Game里面去实现吧。也就是所有图形,声音,资源处理,获取键盘事件,全部都是放在Game中。当时写的时候是想,要是能把Game类实例化后,就可以得到一个完整的客户端那多好。据说mvc除了作gui方便外,在作c/s的时候,也有优势。我是照葫芦画瓢,抄了rails那样的思路。 rails程序就是运行在服务器上,而view部分最终是表现在用户的ie上。如果能实现出来,引擎就可以兼顾单机游戏和网络游戏的开发,这个目标不是很YY么?
现在是想到,从game那里获得的event,是递给controller来保有和处理的。最后引擎的入口,似乎可能大概是在controller那里吧,老实说,对于controller这块,我脑子里还是一片混沌。大家一起帮我想想吧
lw
发表于 2007-9-28 23:27:18
SHA大打算CONTROL里面做点什么,大概的就行
是指令么?(不一定只有脚本才有指令)
list的话,D方法
不是很清楚,里面不需要考虑类型么?数据存放是直接存放的还是用一个什么指引?
所谓一个图形引擎个人理解是一套实现方法,像VERTEXBUFFER这种,个人认为是数据,即需要不同的GAMEOBJ持有不同的对象,或者至少分批分组保存,难道VIEW里面也有实例的概念?如果真的有,那么应该怎么保存呢?
CS传递主要是消息,输入等,对于客户机而言应该当作用户或者第三方的输入,直接影响到FRAMEMOVE这个部分,也可以被缓存……具体看实现了……
以上