行走于手机游戏与APP之间的图形学人
参考文献:(原创不易,尊重原创产权,如需转载,请注明出处)
http://see.xidian.edu.cn/cpp/biancheng/view/244.html(C++虚函数、虚函数的作用和使用方法)
站在Cocos2d-x开发者角度分析template Classes
Comment | applicationDidFinishLaunching | createScene

1、深入阅读入口函数所在文件AppDelegate.cpp

applicationDidFinishLaunching:在我的另外一篇文章站在Android App开发者角度分析template project之proj.android已经提到了AppDelegate::applicationDidFinishLaunching()函数,在此函数之上的部分都是属于游戏引擎内部代码,从这个函数开始,开发者可以制作自己的代码

作用:

获取单例director,获取director对应的OpenGLView,设置是否显示FPS,设置默认的FPS,创建一个scene,并运行这个scene。

HelloWorld::createScene:刚才已经提到了创建一个scene,scene一般是由开发者自定义的,我这个template project叫做helloworld,所以这个函数用于创建一个默认scene。然而HelloWorld类本身是继承自cocos2d::layer,所以在这个函数中先创建一个scene,然后创建一个HelloWorld的layer,然后将layer加入scene即可

创建scene中的实例化scene已经在我的另外一篇文章站在Android App开发者角度分析template project之proj.android提到了,然后将scene进行init,并加入autopool,init函数就是得到director的size,使用这个size设置_contentSize和_anchorPointInPoints,并将_transformUpdated,_transformDirty,_inverseDirty,_contentSizeDirty设置为true。

HelloWorld::create创建HelloWorld的layer是在HelloWorldScene.h中使用宏定义实现的,具体实现是调用HelloWorld的实例化,并进行初始化和加入autorelease pool。初始化中先调用父类layer的init,父类的init是重复上一步的操作,得到director的size已经设置,下面开发者就可以自由发挥加入精灵等。

Cocos2dx包含两套坐标系:世界坐标系和本地坐标系,通过node的setPosition函数,将子结点的锚点设置到父节点的本地坐标系,如果父节点移动,父节点的本地坐标系也移动,子结点也跟着移动。全部设置好之后,在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。子结点的锚点是变量_anchorPoint,layer为(0,0),其他Node默认为(0.5,0.5),如果想要自定义锚点,需要先确认ignoreAnchorPointForPosition为false,如果ignoreAnchorPointForPosition为true,那么锚点固定为左下角,一般情况不会改变锚点,让锚点设置为物体中心位置,是因为后期如果让物体旋转,那么旋转是围绕锚点进行旋转的,如果锚点是中心,那么物体就绕着圆心旋转,如果锚点在左下角,那么物体就围绕左下角绕大圈。(layer的锚点特殊就是因为它把ignoreAnchorPointForPosition设置为true,如果把layer的ignoreAnchorPointForPosition设置为false,那么它的锚点也就是(0.5,0.5))。VerextZ是OpenGL坐标系中的Z值,PositionZ是Cocos2d-x坐标系中Z值,zOrder是Cocos2d-x本地坐标系中Z值。PositionZ的值即为opengl的z值VertexZ。PositionZ是全局渲染顺序即在根节点上的渲染顺序,而zOrder则是局部渲染顺序,即该节点在其父节点上的渲染顺序,与Node的层级有关。如果这两个值发生冲突,以PositionZ为准,大的在上面。触摸的时候得到的Touch position是屏幕坐标系中的点,需要通过getLocation()和getLocationInView()来进行相应坐标转换工作。getLocation()获取触摸点的GL坐标,而getLocation()内部实现是通过调用Director::getInstance()->convertToGL(_point);返回GL坐标。世界坐标系和本地坐标系的相互转换:Point convertToNodeSpace(const Point& worldPoint) const;// 把世界坐标转换到当前节点的本地坐标系中,如果本身是世界坐标系,那么位置不变;Point convertToWorldSpace(const Point& nodePoint) const;// 把基于当前节点的本地坐标系下的坐标转换到世界坐标系中,位置发生变化。Point convertToNodeSpaceAR(const Point& worldPoint) const;// 基于Anchor Point把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。Point convertToWorldSpaceAR(const Point& nodePoint) const;// 基于Anchor Point把世界坐标转换到当前节点的本地坐标系中。

CCNode的getContentSize方法用于获取CCNode的节点宽高,setContentSize方法用于设置节点宽高(不会缩放节点大小),设置节点旋转setRotation,设置缩放比例setScale,取出子结点数组,getChildren返回CCArray,取出子结点个数getChildrenCount,取得父节点getParent,设置节点显示setVisible,设置节点tag setTag,boudingBox返回CCRect的对象碰撞框,用这个矩形进行碰撞检测。

c++中的虚函数virtual function,假如父类有个函数fun1,子类可以重写fun1,如果重写的话,如果这样定义对象Parent t2= (Parent)t,那么调用t的方法的时候先调用子类的方法,然后调用父类的方法。如果只想调用子类或者父类的方法,需要实例化对应的类,比较麻烦,如果不想实例化那么多类,可以使用指针,但是如果使用指针,那么只能返回子类和父类相同的成员变量,如果想输出全部的成员变量,那么就要在父类使用virtual设置对应的函数

Copyright © 沪ICP备14044869号-1