2014-10-21 00:25:08 fanzhang1990 阅读数 6995
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

本文章特指使用C++作为编程语言,基于cocos2dx游戏引擎开发游戏。

 

在cocos2dx中,sprite作为精灵类是使用最为频繁的类,与其它类相比,如:Node, Layer或Scene,Sprite最大的不同是它包含一个纹理,通过OpenGL的渲染,在游戏中呈现出来。游戏中的主角,怪物,背景,或是精灵的血条等都是通过Sprite来实现的。

 

在cocos2dx中,关于创建Sprite的类,根据输入参数的不同有以下几个工厂函数,

      
staticSprite* create()
staticSprite* create(conststd::string& filename)
staticSprite* create(conststd::string& filename, constRect& rect)
staticSprite* createWithTexture(Texture2D *texture)
staticSprite* createWithTexture(Texture2D *texture, constRect& rect, bool rotated=false)
staticSprite* createWithSpriteFrame(SpriteFrame *spriteFrame)
staticSprite* createWithSpriteFrameName(conststd::string& spriteFrameName)


顺便提醒,工厂函数中Sprite的实例都调用了autorelease(),所以由工厂函数返回的实例一般立即通过addChild到加入到父节点中,这样它的引用计数加一,表示有人在使用这个实例,这个实例不能被释放。当然,如果你不想立即加入到父节点中,也可以调用retain()函数直接对其引用计数加1,不然在主循环的下一次,就会将其回收,这是cocos2dx内存自动回收的机制决定的。

 

在游戏的开发过程中,使用Sprite最频繁的编码就是三部曲 (1)创建Sprite (2)加入layer中 (3)设置精灵位置:

Sprite *sprite = Sprite::create(hero.png);
this->addChild(sprite);
sprite->setPosition(Point(100,200));


第一行创建Sprite的实例,也就是创建了一个类Sprite的对象,这个是在工厂函数中实现的,
Sprite *sprite = newSprite();
if(sprite && sprite->initWithFile(filename))
{
    sprite->autorelease();
    returnsprite;
}
CC_SAFE_DELETE(sprite);
returnnullptr;

我们重点关注第一句:
Sprite *sprite = newSprite();



它决定了工厂函数创建的实例是Sprite类型,所以当在编码中调用Sprite的虚函数时,调用的就是Sprite类中的相应函数。

可能你会有这样一个问题:如果我想重载一个虚函数,在这个函数中实现自己需要的一些特殊行为,该怎么做?

答案是:必须继承Sprite创建一个你自己精灵类,在类中重载这个虚函数,这样还不够,必须定义这个新的继承类的工厂函数,在这个工厂函数中创建这个类的对象,

classMySprite : publicSprite
{
    staticMySprite * create(constchar *pszFileName);
}
 
MySprite * MySprite ::create(constchar *filename)
{
    MySprite *sprite = newMySprite();
    if(sprite && sprite->initWithFile(filename))
    {
        sprite->autorelease();returnsprite;
    }
    CC_SAFE_DELETE(sprite);
    returnnullptr;
}

在程序中使用MySprite的代码与Sprite类似,

MySprite *sprite = MySprite::create(hero.png);
this->addChild(sprite);
sprite->setPosition(Point(100,200));

如果输入参数不同,可以参考Sprite类的实现,创建不同输入参数的工厂函数。
所以,按照目前cocos2dx的设计,在Sprite的继承类中,必须重新实现新类的工厂函数,在工厂函数中创建新类的实例,这样新类中重载的虚函数就会被调用到。


使用C++编程,经常需要继承Sprite来定制和封装游戏特定的精灵。有时候可能需要在Sprite的基础上进行多次继承,来达到类重用的目的。
本文下面提供两种方法,提供给读者参考。在这两种方法中,不需要在继承类中重新实现工厂函数。


在工厂函数中,实例作为输入参数传入

MySprite * MySprite ::create(Sprite* sprite, constchar *filename)
{
    if(sprite && sprite->initWithFile(filename))
    {
        sprite->autorelease();
        returnsprite;
    }
    CC_SAFE_DELETE(sprite);
    returnnullptr;
}

调用MySprite的代码:

MySprite *sprite = newMySprite();
MySprite::create(sprite, hero.png);
this->addChild(sprite);
sprite->setPosition(Point(100,200));

在MySprite的基础上再做继承时,就不需要实现工厂函数了。


例如:从MySprite继承新类MySprite2:

classMySprite2 : publicMySprite
{
    ...
}

调用MySprite2的代码:

MySprite2 *sprite = newMySprite2();
MySprite::create(sprite, hero.png);
this->addChild(sprite);
sprite->setPosition(Point(100,200));

2. 创建newInstance的虚函数

第二种方法,我们可以通过虚函数newInstance()来避免重复创建工厂函数。在newInstance中创建新类的对象。

classMySprite : publicSprite
{
    staticMySprite * create(constchar *filename);
    virtual Sprite* newInstance();
}
Sprite* MySprite::newInstance()
{
    returnnew MySprite();
}
 
MySprite * MySprite ::create(constchar *filename)
{
    MySprite *sprite = newInstance();
    if(sprite && sprite->initWithFile(filename))
    {
        sprite->autorelease();returnsprite;
    }
    CC_SAFE_DELETE(sprite);
    returnnullptr;
}

调用MySprite的代码:

MySprite::create(hero.png);
this->addChild(sprite);
sprite->setPosition(Point(100,200));

第二种方法的好处是在使用MySprite时与Sprite的完全相同,但需要在继承类中实现虚函数newInstance()。

本文抛砖引玉,在您的实现过程中也许会有更好的方法,欢迎讨论,共同进步。


2015-04-09 17:59:41 YongYu_IT 阅读数 2766
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

cocos2dx提供了一套易于使用的控件库来满足开发者的GUI需求。cocos2dx控件大致可分为两种,第一种是非继承自Widget类的早期控件库;第二类是新的继承自Widget类的控件库。

先介绍早期的非继承自Widget的控件库

1、标签(Label)


由于Label是SpriteBatchCode的子类,所以每个Label都具有精灵的特性,可以旋转、缩放、着色、改变锚点等等。

Label用于创建TTF、BMFont、SystemFount文本。

a、BMFont标签

BMFont是使用位图字体的标签类型。位图字体不可伸缩,每个字的每个特定尺寸需要一个单独图片资源。

创建一个BMFront标签需要两类资源:一个.fnt描述文件,每个字符对应的png格式图片集。

auto myLabel = Label::createWithBMFont("myFount.fnt","My Text"); //注意,第二个参数字符串内的所有字符必须在fnt文件中有说明,并能找到其对应的png图片,否则将不会被显示。

b、TTF标签

TTF标签是实际运用中使用得最多的标签。

使用TTF标签时需要提供字体库文件(.ttf文件)。TTF标签可以改变字体显示大小,无需提供单个字体(.png格式的图片文件)。

auto myLabel = Labe::createWithTTF("songti.ttf","My Text",16); //第三个参数是指定文字大小

虽然TTF标签比BMFount更加灵活,但是它的效率比较底下。

可以通过创建TTFConfig对象来管理和设置TTF标签的属性。

TTFConfig config;

config.fontFilePath="./songti.ttf";

config.fontSize=16;

auto myLanel = Label::createWithTTF(config,"My Text");

另外,TTF标签还可以显示中日韩字符

c、SystemFont标签

SystemFont是一一种系统默认的字体,字体属性不能随意改动。

2、菜单和菜单项(Menu、MenuItem)


a、Menu是游戏选项的导航,Menu不能单独起作用,Menu需包含至少一个菜单项,菜单项通常以可点击的按钮的形式显示。

MenuItem通常有一个被正常状态,一个被选中状态,一个点击回调组成。

auto item= MenuItemImage::create("Normal.png", "Selected.png", CC_CALLBACK_1(HelloWorld::menuCallback, this)); //注意HelloWorld::menuCallback实际上是函数指针
auto menu = Menu::create(Item, NULL);
this->addChild(menu, 1); //this指的是场景或者场景中的Layer或者其他容器

菜单还可以通过泛型容器来创建

Vector<MenuItem*> MenuItems;
auto Item = MenuItemImage::create("Normal.png", "Selected.png",CC_CALLBACK_1(HelloWorld::menuCallback, this));
MenuItems.pushBack(Item);
auto menu = Menu::createWithArray(MenuItems);
this->addChild(menu, 1);

b、使用Lambda函数作为菜单回调

Lambda是指可以在源代码中编写内联函数的函数。cocos2dx中可以直接使用Lambda函数,但是更常见的是将Lambda函数作为回调函数,比如菜单项的回调函数。

一个简单的Lambda函数

auto func = [] () { cout << "Hello world"; };

func(); // now call the function


使用lambda作为Action函数

auto action1 = CallFunc::create([&](){
    std::cout << "using a Lambda callback" << std::endl;
});


使用lambda创建一个std::function:
std::function<void()> myFunction = []()
{
    std::cout << "From myFunction()" << std::endl;
};
auto action2 = CallFunc::create(myFunction);


使用lambda作为MenuItem回调:
auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
[&](Ref* sender){
    // 回调代码
});


下面是新补充的控件库,这里的控件都是继承自widget。这些控件分为两类,第一类是容器类控件;第二类是非容器类的普通控件



3、布局(Layout,容器类控件)


Layout是众多容器类的父类,Layout及其子类主要用于陈列子控件和裁剪。

LayoutManager、LayoutParameter、Margin类用于陈列控件

HBox、VBox、RelativeBox可以很方便地将控件水平、垂直、相对地陈列

ScrollView、ListView和PageView是针对某些应用场景使用的指定容器

4、非容器类控件

a、Button(按钮)

Button用于捕捉触摸事件,点击按钮将会调用一个预定义的回调函数。Button类允许设置按钮的标题、图像及其他属性,每个按钮都有一个正常状态和选中状态。

b、CheckBox(复选框)

c、LoadingBar(进度条)

d、Slider(滑动条)

......








2015-10-16 10:59:39 u013479411 阅读数 2861
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

Cocos2dx 基于opengl es 实现跨平台功能,虽然android 已经支持native ,还是需要使用到android平台中的特性。

首先从程序的主入口 MainActivity MainActivity跟进java首先加载static函数,将libgame.so导入进来,

根据activity的生命周期,首先调用oncreate()方法,由于继承Cocos2dxActivity类将调用该类的oncreate(),Cocos2dxActivity的核心Init()函数如下:

public void init()

{

ViewGroup.LayoutParams framelayout_params = new   ViewGroup.LayoutParams(

ViewGroup.LayoutParams.FILL_PARENT,

ViewGroup.LayoutParams.FILL_PARENT);

FrameLayout framelayout = new FrameLayout(this);

framelayout.setLayoutParams(framelayout_params);

ViewGroup.LayoutParams edittext_layout_params = new ViewGroup.LayoutParams(

ViewGroup.LayoutParams.FILL_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

Cocos2dxEditText edittext = new Cocos2dxEditText(this);

edittext.setLayoutParams(edittext_layout_params);

framelayout.addView(edittext);

this.mGLSurfaceView = this.onCreateView();

        this.mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 0, 8);

framelayout.addView(this.mGLSurfaceView);

this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());

this.mGLSurfaceView.setCocos2dxEditText(edittext);

mFrameLayout = framelayout;

}

 创建一个framelayout 将mGLSurfaceView add进来,并且mGLSurfaceView 通过setCocos2dxRenderer设置一个cocos2dxRenderer,并通过GLThread调起RendereronSurfaceCreated方法(android sdk GLSurfaceView.java)cocos2dx的引擎也就初始化完成。

@Override

public void onSurfaceCreated(final GL10 pGL10, final EGLConfig pEGLConfig) 

{

Cocos2dxRenderer.nativeInit(this.mScreenWidth, this.mScreenHeight);

this.mLastTickInNanoSeconds = System.nanoTime();

}

nativeInit使用jni的形式调起c++函数

void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h)

{

    if (!CCDirector::sharedDirector()->getOpenGLView())

    {

        CCEGLView *view = CCEGLView::sharedOpenGLView();

        view->setFrameSize(w, h);

        AppDelegate *pAppDelegate = new AppDelegate();

        CCApplication::sharedApplication()->run();

}

}

android平台上,cocos2dx游戏入口跑起来了,依照android平台的特性需要使用opengl es需要在AndroidMainfest.xml中声明

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

2、onstart,没有对其进行重写,调用基类Activity方法,不分析。

3、onResume(),基类Cocos2dxGLSurfaceView

@Override

public void onResume() {

super.onResume();

 

this.queueEvent(new Runnable() {

@Override

public void run() {Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleOnResume();

}

});

}

     public void handleOnResume() {

Cocos2dxRenderer.nativeOnResume();

}

 JNIEXPORT void JNICALLJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeOnResume() {

        if (CCDirector::sharedDirector()->getOpenGLView()) {

       CCApplication::sharedApplication()->applicationWillEnterForeground();

        }

}

当active的重新需要显示的时,java的activity跟.so中的c++中的函数关联起来,同理之后的onResume()也是这样跟c++中的关联起来。只需要在对应的c++函数中填写逻辑。

4、游戏是由画面构建而成,让画面动起来就需要重绘、渲染,借助GLSurfaceView.Renderer渲染。

    @Override

public void onDrawFrame(final GL10 gl) 

{

Cocos2dxRenderer.nativeRender();

mFrameCount += 1;

if (mFrameCount % 100 == 0)

{

Cocos2dxHelper.checkMemoryWarning();

}

}

JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender(JNIEnv* env) {

        cocos2d::CCDirector::sharedDirector()->mainLoop();

}


将调用c++中的CCDirector的mainLoop,游戏的循环已经被调用起来,在游戏的mainloop将会实现游戏的检测、绘制等任务。


5、android 如何驱动Renderer的onDrawFrame()

 由GLSurfaceView在setCocos2dxRenderer调用GLThread线程,GLThread线程中

    if (LOG_RENDERER_DRAW_FRAME) {

      Log.w("GLThread", "onDrawFrame tid=" + getId());

     }

    {

     GLSurfaceView view = mGLSurfaceViewWeakRef.get();

     if (view != null) {

          view.mRenderer.onDrawFrame(gl);

      }

    }

GLThread 外部就是一个while(true),不停的驱动渲染画面,让游戏动起来。


6、Ui Thread 跟 GLThread

  手游引擎需要兼顾UI事件跟屏幕帧数的刷新,在andorid中采用了UI线程+渲染线程,UI线程捕获跟用户交互的信息和事件,并跟渲染进程交互对游戏进行渲染,例如上述的setCocos2dxRenderer设置了渲染进程。

  在接入SDK的登录的时候需要将Login 函数写入 runGLthread 中。

@Override

public void runOnGLThread(final Runnable pRunnable)

{

this.mGLSurfaceView.queueEvent(pRunnable);

}

    public void queueEvent(Runnable r) {

            if (r == null) {

                throw new IllegalArgumentException("r must not be null");

            }

            synchronized(sGLThreadManager) {

                mEventQueue.add(r);

                sGLThreadManager.notifyAll();

            }

        }

GLThread run中:

 if (! mEventQueue.isEmpty()) {

      event = mEventQueue.remove(0);

      break;

 }

if (event != null) {

                        event.run();

                        event = null;

                        continue;

            }


当点击登录,UI线程捕获到了,需要传递给引擎,让渲染线程根据画面的元素的状态重新绘画,UI线程通过this.mGLSurfaceView.queueEvent(pRunnable);将事件以及处理方法传递给GLThread来执行,完成了UI线程跟GLThread之间的通讯。

在android系统中通过UI线程,如果不在这两个方式中改变UI组件的属性,那么有SDK

一些图像显示过程将显示不来了。

有时候我们需要将SDK的接口放置在UI线程中,因为SDK 接口可能需要改变到UI组件的属性。

 

Cocos2dx 本身依靠opengl es 完成跨平台,在android平台下面android已有的opengl es API实现对android平台的支持.所以能够看到主要还是继承的COcos2dxActivity 来完成 对cocos2dx 引擎中的 API进行控制,达到控制游戏的目的。

在cocos2dx android目录下还能够看到很多*.java文件,例如音乐 cocos2dx本身通过调用android的API来调用android的硬件资源来实现功能。

 

参考文件:cocos2d-x-2.2.5\cocos2dx\platform\android

http://code.taobao.org/p/cnandroiddocs/src/trunk/opengl/java/android/opengl/GLSurfaceView.java

参考网站:

http://www.cnblogs.com/helloandroid/articles/2948081.html

http://blog.sina.com.cn/s/blog_69887cd70100jxmu.html

http://my.oschina.net/bankofchina/blog/284150

http://www.jb51.net/article/49452.htm

2015-05-22 12:56:54 u012801153 阅读数 388
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

声明:这是在阅读cocos2dx游戏“奇怪大冒险”源码后所做的总结笔记……

#ifndef _SINGLETON_H
#define _SINGLETON_H

template <class T>
class Singleton
{
public:
    //获取类的唯一实例
    static inline T* getInstance();
    //释放类的唯一实例
    void release();
protected:
    // protected类型的构造函数,使其可以继承
    Singleton(void){}
    ~Singleton(void){}
    // 需要在子类cpp中对它进行初始化
    static T* _instance;
};

template <class T>
inline T* Singleton<T>::getInstance()
{
    if(!_instance)
        _instance = new T;
    return _instance;
}

template <class T>
void Singleton<T>::release()
{
    if (!_instance)
        return;
    delete _instance;
    _instance = 0;
}

//子类的cpp文件中需要先声明静态变量后才可以使用
#define DECLARE_SINGLETON_MEMBER(_Ty)   \
    template <> _Ty* Singleton<_Ty>::_instance = NULL;

#endif//_SINGLETON_H

首先这是一个模板类,所以可以用它定义不同的类。

再者这个模板类的构造函数是protected属性的,因此不能用它来直接实例化,必须使用它的子类来实例化对象。

最后竟然发现这个模板类内部的实现只是new一个对象,再销毁而已,public里提供了一个静态函数,返回实例,果然只是为了单例化子类对象。

使用:
AnimationManager.h

class AnimationManager : public Singleton<AnimationManager>
{
    ……
};

AnimationManager.cpp

#include "AnimationManager.h"

DECLARE_SINGLETON_MEMBER(AnimationManager);

……

在cocos2dx工程的其他地方就使用AnimationManager::getInstance()获取子类对象,从而访问子类的属性和方法。

还要记得release单例对象

AppDelegate::~AppDelegate()
{
    AnimationManager::getInstance()->release();
}
2017-08-30 09:15:27 lianghui0811 阅读数 611
  • Cocos2d-x 3.x项目实战:星空大战(射击类游戏)

    本课程是《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》课程配套的项目实战课程。建议对Cocos2d-x 3.0不了解的同学先学习该课程。本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏。

    18362 人正在学习 去看看 李宁

直接继承Ref的有哪些

AnimationAnimationCacheActionNodeSpriteFrameSpriteFrameCacheTexture2DDirectorEventEventDispatcherEventListenerSchedulerTouchHttpRequestHttpResponse

Widget

/************************************************************************/

 

继承自Action的有哪些

FiniteTimeActionSpeedFollow

继承自FiniteTimeAction的有哪些

ActionInstant, and ActionInterval.

继承自ActionInstant的有哪些

CallFunc, FlipX, FlipY, Hide, Place, RemoveSelf, ReuseGrid, Show, StopGrid, and ToggleVisibility.

继承自ActionInterval的有哪些

AccelAmplitude, AccelDeccelAmplitude, ActionCamera, ActionEase, ActionFloat, ActionTween, Animate, Animate3D, BezierBy, Blink, CardinalSplineTo, DeccelAmplitude, DelayTime, FadeTo, GridAction, JumpBy, MoveBy, ProgressFromTo, ProgressTo, Repeat, RepeatForever, ReverseTime, RotateBy, RotateTo, ScaleTo, Sequence, SkewTo, Spawn, TargetedAction, TintBy, and TintTo.

继承自ActionCamera的有哪些

OrbitCamera

继承自ActionEase的有哪些

EaseBackIn, EaseBackInOut, EaseBackOut, EaseBezierAction, EaseBounce, EaseCircleActionIn, EaseCircleActionInOut, EaseCircleActionOut, EaseCubicActionIn, EaseCubicActionInOut, EaseCubicActionOut, EaseElastic, EaseExponentialIn, EaseExponentialInOut, EaseExponentialOut, EaseQuadraticActionIn, EaseQuadraticActionInOut, EaseQuadraticActionOut, EaseQuarticActionIn, EaseQuarticActionInOut, EaseQuarticActionOut, EaseQuinticActionIn, EaseQuinticActionInOut, EaseQuinticActionOut, EaseRateAction, EaseSineIn, EaseSineInOut, and EaseSineOut.

继承自FadeTo的有哪些:

FadeIn, and FadeOut.

继承自JumpBy的有哪些:

JumpTo

继承自MoveBy的有哪些:

MoveTo

继承自ScaleTo的有哪些:

ScaleBy

继承自SkewTo的有哪些:

SkewBy

 

/************************************************************************/

 

继承自Event的有哪些

EventKeyboard

继承自EventListener的有哪些

EventListenerAcceleration, EventListenerController, EventListenerCustom, EventListenerFocus, EventListenerKeyboard, EventListenerMouse, EventListenerTouchAllAtOnce, and EventListenerTouchOneByOne.

 

/************************************************************************/

 

继承自Node的有哪些:

LabelLayerLabelAtlasLayerColorMenuItemParticleSystemRenderTextureSceneSprite,、Scale9SpriteProgressTimerClippingNodeDrawNode

继承自Label的有哪些

TextFieldTTF(必须实现TextFieldDelegate)

继承自Layer的有哪些

Menu

继承自MenuItem的有哪些

MenuItemLabelMenuItemSpriteMenuItemToggle

继承自MenuItemLabel的有哪些

MenuItemFont

继承自MenuItemSprite的有哪些

MenuItemImage

继承自ParticleSystem的有哪些

ParticleSystemQuad

继承自Scene的有哪些

TransitionScene

继承自TransitionScene的有哪些

TransitionCrossFade, TransitionFade, TransitionFadeTR, TransitionJumpZoom, TransitionMoveInL, TransitionPageTurn, TransitionProgress, TransitionRotoZoom, TransitionSceneOriented, TransitionShrinkGrow, TransitionSlideInL, TransitionSplitCols, and TransitionTurnOffTiles.

 

/************************************************************************/

继承自Widget的有哪些:

ButtonCheckBoxRadioButtonEditBox(必须实现EditBoxDelegate)ImageViewLayoutLoadingBarRichTextSliderTextTextAltasTextField

继承自Layout的有哪些

ScorllView

继承自ScrollView的有哪些

ListViewTableView(要实现TableViewDataSourceTableViewDelegate)

继承自ListView的有些

PageView

cocos2dx lua继承C++类

阅读数 2770

没有更多推荐了,返回首页