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这个部分,也可以被缓存……具体看实现了……

以上
页: 1 2 3 [4] 5
查看完整版本: [问题]关于以MVC模式组织的游戏引擎