类的使用

来源:互联网 发布:索尼sbh52软件下载 编辑:程序博客网 时间:2024/05/29 09:32

---------------------------西昌.何雨锋 类的使用

1-mesh类,mesh是由scene建立出来的,所以要单独建立出一个类就要牵涉到scene,一般甚至都可以不用自己包括scene,要求是
先声明scene的实例,然后在class mesh中直接建立出来就可以了。
但是这种办法不利于.h类的建立,因为事先不知道该在哪个scene中建立,所以
class boat
{    ITVMesh boat_model;
     ITVScene scenex;
public: 
     void set_scene(ITVScene &sceney){scenex=sceney;}
      void load_model(char *name_it)
 {
         boat_model=scenex->CreateMeshBuilder(name_it);
 }
};

这样就可以通过接口传递不同的scene而把mesh建立出来了,通过这种手段,可以把mesh类集成到.h文件中。
但是这样建立有一个弊病,就是scenex仍然会占用跟sceney一样多的内存,最好的办法是声明ITVScene *scenex;指针,
后面赋值改为scenex=&sceney;这样第一个指针指向后者,就不会多占用内存了,
只在调用scenex的成员及函数时这样调用:(*scenex)->成员。
其完整的流程如下:
类中:
ITVScene *scenex;
void set_scene(ITVScene &sceney)
{scenex=&sceney;}
(*scenex)->...

 

2-input类,input类是一个可以独立的类,但是它涉及到了两个其他类的方法:
一个是时间的流逝,如engine1->timeescape();这个由于只是传输一个double型的变量,所以可以用函数传递到类中,如:
    void check_io(double timeleft)    //在调用时在循环中用input1.check_io(engine1->timeescape());
另一个看起来跟input类无关,那就是scene->setcamera(...);但是很多时候input控制的就是camera,所以就得使用它,但是如果不传递
scene就错了,可能认为可以在类中用引用或成员函数返回三维坐标,再在循环主程序中来setcamera,这被证明是错误的,由于时间上的
误差,所以返回的三维坐标跟不上鼠标的动作,所以必须把scene传进去,然后在input中渲染,才能跟得上动作速度。
void input::init_io(ITVScene scenex)
 {
  input1 = CreateTVInputEngine();
  sceney=scenex;
        }
然后再在类里,坐标一算出来就立刻setcamera.当然,如果你要用input来实时控制其他的东西,那么也同样要把其他东西传到input类里了控制比较好。注意别把scene的复制放在input构造函数里进行,而必须等到scene.Createscene()后,再用input.init_io来复制场景。


3-Engine,在TV3D中,唯一不能使用类的就是engine与gobal,当然,不能使用类还是可以使用函数来简化其初始化程序的。
void EngineInit(long winhand,HINSTANCE hin)//初始化engine
{
    engine1 = CreateTVEngine();
    engine1->SetDebugFile("debug.txt");
 engine1->ShowDriverDialog();
 engine1->Init3DWindowedMode (winhand, true);
 //打开显示FPS开关
 engine1->put_DisplayFPS(tvtrue);
 //使用角度而非幅度
 engine1->SetAngleSystem(TV_ANGLE_DEGREE);
 char path[256];
 char srchpath[256];

 HMODULE Module = (HMODULE)hin;
 GetModuleFileName(Module,path,255);
 AppPath(path,srchpath);
 
 //设置资源文件的路径
 engine1->SetSearchDirectory(srchpath);

}
其中两个参数实际就是窗口的句柄和程序的句柄,都从winmain处获得:
    EngineInit((long)WindowHandle,hInstance);

6-地图,这里的地图不包括敌人位置,只是一个和平宁静的地图环境,
包括天空盒的纹理文件的指向,天空中是否有太阳,云、雨、雾、白天还是黑夜等情况,如果有必要,还可以装入
陆地或BSP地图,可以采用块写文件的方法,将地图文件指向信息写入一个文件,在使用时类读就可以了。


7-没事别把engine作为参数东传西传的,否则保证你的FPS减低一办。