溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

cocos2dx[3.2](8) ——核心類Director/Scene/Layer/Sprite

發(fā)布時間:2020-07-18 20:37:41 來源:網(wǎng)絡(luò) 閱讀:6633 作者:shahdza 欄目:開發(fā)技術(shù)




【核心類】

    導(dǎo)演Director、場景Scene、布景層Layer、精靈Sprite的概念請移步: cocos2dx基礎(chǔ)篇(3)——第一個程序HelloWorld

    導(dǎo)演控制場景,場景控制圖層,圖層控制精靈,精靈控制動作。

    相互之間的關(guān)系框架如下圖所示:

cocos2dx[3.2](8) ——核心類Director/Scene/Layer/Sprite

    由此看出:

        (1)整個游戲一般只有一個導(dǎo)演。

        (2)一個游戲可以由多個場景組成(菜單界面、游戲界面、游戲結(jié)束界面等),但是每次導(dǎo)演只能指導(dǎo)一個場景的運(yùn)作。

        (3)一個場景可以由多個圖層組成(背景層、道具層、英雄層、怪物層等,每個圖層都可以由多個精靈元素組成(標(biāo)簽、按鈕、菜單等)。

        (4)對于圖層上的每個精靈元素,一般都附帶相應(yīng)的動作,可以帶多個動作。如揮刀、使用魔法、跑、跳,以及放大、縮小、旋轉(zhuǎn)等動作。




【導(dǎo)演Director】

    就和現(xiàn)實中的導(dǎo)演一樣,這里的導(dǎo)演也是起到指導(dǎo)的作用的。導(dǎo)演在這里負(fù)責(zé)的就是讓不同的場景切換,控制整個游戲的流程,包括開始,繼續(xù),暫停等。以及設(shè)置、獲取系統(tǒng)信息,比如調(diào)整OpenGL相關(guān)的設(shè)置,獲取屏幕的大小等。

    和Scene、Layer、Sprite等不同的是,導(dǎo)演類Director是直接繼承Ref類的,而不是Node類。

    繼承關(guān)系如下:

cocos2dx[3.2](8) ——核心類Director/Scene/Layer/Sprite

    主要函數(shù)如下:

//
/** 
	導(dǎo)演類Director主要是用來:
		- 創(chuàng)建一個主窗口
		- 管理場景Scene
	Director 也負(fù)責(zé)以下: 
		- 初始化 OpenGL 內(nèi)容
		- 設(shè)置 OpenGL 像素格式 (默認(rèn)值時 RGB565) 
		- 設(shè)置 OpenGL 緩存大小 (默認(rèn)是 0-bit) 
		- 設(shè)置 投影 (默認(rèn)是一個 3D) 
		- 設(shè)置 方向 (默認(rèn)是豎屏Portrait)
  
	Director 是一個單例對象, 標(biāo)準(zhǔn)的調(diào)用方法是:
		- Director::getInstance()->methodName(); 
*/

class CC_DLL Director : public Ref
{
/**
 *	獲取單例對象
 */
    //獲取全局唯一的Director實例 , 替代 sharedDirector
	//使用方法:Director::getInstance()->replaceScene(scene);
    static Director* getInstance();
	

/**
 *	場景管理相關(guān)
 *		- runWithScene
 *		- pushScene
 *		- popScene , popToRootScene , popToSceneStackLevel
 *		- replaceScene
 *		- pause , resume , end
 *		- getRunningScene , isPaused
 */
	//指定進(jìn)入Director的主循環(huán)運(yùn)行的場景.
	//ps:僅在運(yùn)行第一個場景時調(diào)用,如果已經(jīng)存在運(yùn)行中的場景,不能調(diào)用本方法.
	//本方法調(diào)用后將調(diào)用pushScene方法,然后調(diào)用startAnimation.
	void runWithScene(Scene *scene);

	//將運(yùn)行中的場景暫停,并push到場景堆棧中,運(yùn)行新的場景.
	void pushScene(Scene *scene);

	//從場景堆棧中pop出一個場景,替換現(xiàn)在正運(yùn)行的場景,而運(yùn)行中的場景將被刪除.
	void popScene();

	//從場景堆棧中pop出所有場景,最后一個棧底的場景將替換現(xiàn)在正運(yùn)行的場景,而運(yùn)行中的場景將被刪除.
	void popToRootScene();

	//彈出從隊列中的所有場景,直到它到達(dá) level.
	//如果 level 是 0,它將結(jié)束 director. 
	//如果 level 是 1, 從隊列中彈出所有的場景,直到只有根場景在隊列中. 
	//如果 level <= 當(dāng)前的堆棧水平,它不會做任何事情。
 	void popToSceneStackLevel(int level);

	//使用新場景替換當(dāng)前場景,而運(yùn)行中的場景將被刪除.
	//PS:舊場景不壓入堆棧,而是直接刪除.
	void replaceScene(Scene *scene);

	void pause(void);                //暫停場景
	void resume(void);               //恢復(fù)被暫停的場景
	void end(void);                  //終止執(zhí)行,釋放運(yùn)行中的場景. GL view需手動移除.
	
	inline Scene* getRunningScene(); //獲取當(dāng)前運(yùn)行的場景
    inline bool isPaused();          //Director 是否被暫停


/**
 *	刷新幀數(shù)FPS相關(guān)
 *		- setAnimationInterval
 *		- setDisplayStats
 *		- getSecondsPerFrame , getTotalFrames
 */
	//設(shè)置程序的FPS值. 即刷新頻率,相連兩幀的時間間隔.
	//如dValue = 1.0/60.0 表示每秒60幀.
    virtual void setAnimationInterval(double interval) = 0;
    inline double getAnimationInterval();

    //是否在左下角顯示 FPS
    inline void setDisplayStats(bool displayStats);
    inline bool isDisplayStats();
	
    //獲取每秒執(zhí)行幀數(shù)
    inline float getSecondsPerFrame()
	
    //從 Director 開機(jī)后,總共已經(jīng)渲染了多少幀
    inline unsigned int getTotalFrames();

	
/**
 *	OpenGL圖形渲染相關(guān)
 *		- setOpenGLView
 *		- setProjection
 *		- getTextureCache
 *		- setViewport , setGLDefaultValues , setAlphaBlending , setDepthTest
 */
	//獲取渲染所有東西的GLView
	void setOpenGLView(GLView *openGLView);
	inline GLView* getOpenGLView();

	//設(shè)置一個 OpenGL 投影
	//	Projection::_2D           : 設(shè)定的二維投影(正投影)
	//	Projection::_3D           : 使用 fovy=60, znear=0.5f and zfar=1500 設(shè)置一個3D投影
	//	Projection::CUSTOM        : 投影委托里面它調(diào)用 "updateProjection".
	//	Projection::DEFAULT = _3D : 默認(rèn)投影是 3D 投影
	void setProjection(Projection projection);
	inline Projection getProjection();

	TextureCache* getTextureCache() const; //獲取紋理緩沖
	void setViewport();                    //設(shè)置glViewport
	void setGLDefaultValues();             //設(shè)置 OpenGL 默認(rèn)值
	void setAlphaBlending(bool on);        //啟用/禁用 OpenGL alpha 混合
	void setDepthTest(bool on);            //啟用/禁用 OpenGL 深度測試


/**
 *	OpenGL View視圖相關(guān)
 *		- getWinSize
 *		- getVisibleSize , getVisibleOrigin
 *		- convertToGL , convertToUI
 */
	//類似手機(jī)屏幕的大小
	const Size& getWinSize() const;      //獲取OpenGL view大小,單位點.
	Size getWinSizeInPixels() const;     //獲取OpenGL view大小,單位像素.

	//類似程序的游戲區(qū)域
	//如果不調(diào)用GLView::setDesignResolutionSize(), 值等于getWinSize
	Size getVisibleSize() const;         //獲取OpenGL View可視區(qū)域大小,單位點.
	Vec2 getVisibleOrigin() const;       //獲取可視區(qū)域的原點坐標(biāo).

	//將UIKit坐標(biāo)與OpenGL坐標(biāo)的相互轉(zhuǎn)換
	//UIKit坐標(biāo) :原點在屏幕的左上角. 從左到右,從上到下.
	//OpenGL坐標(biāo):原點在屏幕的左下角. 從左到右,從下到上.
	Vec2 convertToGL(const Vec2& point); //轉(zhuǎn)為GL坐標(biāo)
	Vec2 convertToUI(const Vec2& point); //轉(zhuǎn)為UI坐標(biāo)


/**
 *	其他操作
 *		- purgeCachedData
 *		- getRenderer
 *		- setDefaultValues
 *		- setScheduler , setActionManager , setEventDispatcher
 */
	void purgeCachedData();                               //移除所有 cocos2d 緩存數(shù)據(jù).
	Renderer* getRenderer() const;                        //獲取渲染器(Renderer). v3.0
	void setDefaultValues();                              //設(shè)置配置信息的默認(rèn)值

	void setScheduler(Scheduler* scheduler);              //設(shè)置與director關(guān)聯(lián)的調(diào)度器
	void setActionManager(ActionManager* actionManager);  //設(shè)置與director關(guān)聯(lián)的ActionManager
	void setEventDispatcher(EventDispatcher* dispatcher); //設(shè)置與director關(guān)聯(lián)的EventDispatcher. v3.0
	Scheduler* getScheduler() const;
	ActionManager* getActionManager() const;
	EventDispatcher* getEventDispatcher() const;
}
//




【場景Scene】

    Scene是繼承與Node類的。作為場景類,它卻只有函數(shù)create。因為場景就像是一個容器,將不同的布景層(Layer)組合在一起,方便管理。

    一個游戲會有很多的場景,比如,主界面,游戲界面,載入界面等等都是一個場景。而每一個場景都是由多個圖層組合在一起,形成一個完整的游戲畫面。

    其實在 cocos2dx基礎(chǔ)篇(3)——第一個程序HelloWorld 中就出現(xiàn)了Scene的創(chuàng)建,以及將HelloWorld布景層放入該Scene中。

    繼承關(guān)系如下:

cocos2dx[3.2](8) ——核心類Director/Scene/Layer/Sprite

    主要函數(shù)如下:

//
class CC_DLL Scene : public Node
{
	static Scene *create();                         //大小和屏幕一樣
	static Scene *createWithSize(const Size& size); //自定義大小
	virtual Scene *getScene() const override;       //覆蓋
};
//




【布景層Layer】

    Layer繼承于Node。Layer不僅繼承了CCNode的所有操作,還附加觸控、重力加速度計、支持鍵盤輸入的事件代理。

    一個布景層(Layer)可以包含多個元素,如標(biāo)簽(Label)、菜單(Menu)、精靈(Sprite)等等。

    和2.x對比,3.2版本的Layer做了很大的改動:將觸控函數(shù) ccTouch 改為 onTouch ,還棄用了好多加速度計、鍵盤輸入事件相關(guān)操作函數(shù)。

    并且對于觸控、加速度計、鍵盤輸入的事件回調(diào)函數(shù),將通過3.x中新的事件分發(fā)機(jī)制來完成。

    注意:Layer的錨點默認(rèn)為(0,0),即左下角。并且忽略錨點的設(shè)置,即使你setAnchorPoint了錨點,Layer的錨點也不會改變,依然是(0,0)。

    繼承關(guān)系如下:

cocos2dx[3.2](8) ——核心類Director/Scene/Layer/Sprite

    主要函數(shù)如下:

//
class CC_DLL Layer : public Node
{
/**
 *	創(chuàng)建布景層
 *		- create
 */
    static Layer *create();


/**
 *	觸控相關(guān)
 *		- 單點觸控 onTouch
 *		- 多點觸控 onTouches
 */
	//單點觸控
    virtual bool onTouchBegan(Touch *touch, Event *unused_event); 
    virtual void onTouchMoved(Touch *touch, Event *unused_event); 
    virtual void onTouchEnded(Touch *touch, Event *unused_event); 
    virtual void onTouchCancelled(Touch *touch, Event *unused_event);

	//多點觸控
    virtual void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event);
    virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event);
    virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event);
    virtual void onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event);


/**
 *	加速度計相關(guān). 即重力感應(yīng).
 *		- Acceleration為加速度計信息
 *		- class Acceleration : public Ref { double x , y , z , timestamp; };
 */
	//加速度計監(jiān)聽事件回調(diào)函數(shù)
    virtual void onAcceleration(Acceleration* acc, Event* unused_event);
	
	
/**
 *	鍵盤輸入相關(guān)
 *		- KeyCode : 為鍵盤按下了那個鍵.
 *		- 舉例    : KEY_BACKSPACE, KEY_ALT, KEY_F1, KEY_0, KEY_A,...
 *		- 詳情參照: "\cocos\base\CCEventKeyboard.h"
 */
	//按下鍵盤, 監(jiān)聽事件回調(diào)函數(shù)
	virtual void onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event);
    //釋放鍵盤, 監(jiān)聽事件回調(diào)函數(shù)
	virtual void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event);
};
//




【精靈Sprite】

    精靈說簡單一點,其實就是一個2D的圖片。并賦予圖片各種屬性以及特性。如大小、顏色、放縮、旋轉(zhuǎn)、動作等。精靈一般都是放在布景層(Layer)上面的,即一個布景層(Layer)應(yīng)當(dāng)有許多的精靈存在。精靈可以用來當(dāng)做背景、人物、鳥、白云等內(nèi)容。

    Sprite不僅繼承了Node,還繼承了紋理協(xié)議接口TextureProtocol。

    TextureProtocol紋理協(xié)議接口主要是負(fù)責(zé)紋理圖片的管理。

    注意:精靈的錨點默認(rèn)為(0.5,0.5),即中心點。

    繼承關(guān)系如下:

cocos2dx[3.2](8) ——核心類Director/Scene/Layer/Sprite

    

    主要函數(shù)如下:

//
/**
	Sprite定義為二維圖像, 可以通過一個圖像或一個圖像的矩形裁剪部分創(chuàng)建Sprite.

		- 為了優(yōu)化Sprite渲染,請遵循以下最佳用法:
			- 所有Sprite放入同一個SpriteSheet
			- 所有Sprite使用相同的渲染混合函數(shù)(BlendFunc)
			- 使得渲染器(Renderer)自動批量處理("batch")Sprite (將會在一次OpenGL調(diào)用內(nèi)繪制完成)

		- 為了獲得額外5%~10的渲染優(yōu)化效果,你可以把Sprite作為子節(jié)點加入到SpriteBatchNode中, 
		- 但這么做有以下限制:
			- Alias/Antialias屬性屬于SpriteBatchNode,不能單獨設(shè)置Sprite的Alias屬性。
			- 渲染混合函數(shù)(BlendFunc)屬于SpriteBatchNode,不能單獨設(shè)置Sprite的渲染混合函數(shù)(BlendFunc)。
			- 不支持ParallaxNode,不過可以使用代理("proxy")Sprite模擬實現(xiàn)。

		- Sprite的子節(jié)點只能是其它Sprite(或Sprite的子類)
		- Sprite的默認(rèn)錨點(anchorPoint)為(0.5, 0.5)。
 */
 
class CC_DLL Sprite : public Node, public TextureProtocol
{
/**
 *	創(chuàng)建方法
 *		- create
 *		- createWithTexture
 *		- createWithSpriteFrame
 */
    static Sprite* create();                                                                    //默認(rèn)創(chuàng)建空精靈對象
    static Sprite* create(const std::string& filename);                                         //圖片文件(*.png)
    static Sprite* create(const std::string& filename, const Rect& rect);                       //截取圖片文件中某一區(qū)域圖片
    static Sprite* createWithTexture(Texture2D *texture);                                       //紋理圖片
    static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false); //截取紋理圖片中某一區(qū)域圖片,是否旋轉(zhuǎn)
    static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);                             //精靈幀. 精靈幀一般從plist中讀取的
    static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);               //精靈幀的名字



/**
 *	批處理節(jié)點BatchNode
 *		- updateTransform
 *		- setBatchNode
 *		- getBatchNode
 */
    virtual void updateTransform(void);                          //更新四個值:position(x,y), rotation, scale
    virtual void setBatchNode(SpriteBatchNode *spriteBatchNode); //設(shè)置批節(jié)點,不推薦手工調(diào)用
    virtual SpriteBatchNode* getBatchNode(void);                 //如果精靈是由批節(jié)點渲染,則返回批節(jié)點


/**
 *	紋理Texture
 *		- setTexture
 *		- setTextureRect
 */
	//設(shè)置精靈的紋理圖片.
    virtual void setTexture(const std::string &filename ); //調(diào)用setTextureRect設(shè)置Sprite尺寸
    virtual void setTexture(Texture2D *texture) override;  //紋理的矩形尺寸大小不會改變
    virtual Texture2D* getTexture() const override;

	//設(shè)置Sprite紋理(texture)的Rect尺寸(rect)、是否旋轉(zhuǎn)(rotated)、裁剪尺寸(untrimmedSize)。 
	//調(diào)用此方法會修改紋理(texture)的坐標(biāo)和頂點位置
    virtual void setTextureRect(const Rect& rect, bool rotated = false, const Size& untrimmedSize = rect.size); 


/**
 *	精靈幀SpriteFrames & 動畫Animation
 *		- setSpriteFrame
 *		- isFrameDisplayed
 *		- getSpriteFrame
 *		- setDisplayFrameWithAnimationName
 */	
	//設(shè)置新的顯示精靈幀. 替代setDisplayFrame
    virtual void setSpriteFrame(const std::string &spriteFrameName);
    virtual void setSpriteFrame(SpriteFrame* newFrame);
	
    //返回精靈幀是否正在顯示
    virtual bool isFrameDisplayed(SpriteFrame *pFrame) const;

    //返回當(dāng)前顯示的精靈幀. 替代 getDisplayFrame
    virtual SpriteFrame* getSpriteFrame() const;

	//通過動畫幀的第frameIndex那一幀來設(shè)置顯示精靈幀
	//動畫幀是從CCAnimationCache中讀取的
    virtual void setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex);


/**
 *	精靈屬性相關(guān)
 *		- setDirty
 *		- getQuad
 *		- isTextureRectRotated
 *		- setAtlasIndex
 *		- getTextureRect
 *		- setTextureAtlas
 *		- getOffsetPosition
 *		- setFlippedX , setFlippedY
 */
	//設(shè)置Sprite在紋理集Atlas中是否需要更新
    virtual void setDirty(bool dirty);
    virtual bool isDirty(void) const;
    
	//返回四個值的信息:坐標(biāo)(x,y),頂點,顏色
    inline V3F_C4B_T2F_Quad getQuad(void) const;
	
	//判斷紋理是否被旋轉(zhuǎn)
    inline bool isTextureRectRotated(void) const;

	//設(shè)置紋理集(TextureAtlas)的當(dāng)前使用索引
	//警告: 除非你了解調(diào)用此方法的影響,否則不要改變此值
    inline void setAtlasIndex(ssize_t atlasIndex);
    inline ssize_t getAtlasIndex(void) const;

    //返回Sprite的Rect區(qū)域信息,單位點
    inline const Rect& getTextureRect(void);

    //如果采用批渲染,設(shè)置紋理地圖集
    inline void setTextureAtlas(TextureAtlas *pobTextureAtlas);
    inline TextureAtlas* getTextureAtlas(void);
	
    //獲取偏移值
    inline const Vec2& getOffsetPosition(void) const;

	//設(shè)置是否翻轉(zhuǎn)。
    void setFlippedX(bool flippedX); //設(shè)置Sprite是否水平翻轉(zhuǎn)。替代 setFlipX
    bool isFlippedX(void) const;
    void setFlippedY(bool flippedY); //設(shè)置Sprite是否垂直翻轉(zhuǎn)。替代 setFlipY
    bool isFlippedY(void) const;


/**
 *	繼承于TextureProtocol
 *		- setBlendFunc
 */
	//設(shè)置顏色混合模式
    inline void setBlendFunc(const BlendFunc &blendFunc) override;
    inline const BlendFunc& getBlendFunc() const override;


/**
 *	繼承于Node
 *		- Scale , Position , Skew , AnchorPoint , Visible
 *		- addChild , removeChild , reorderChild , sortAllChildren
 *		- draw , setOpacityModifyRGB , isOpacityModifyRGB
 */
	virtual void setScaleX(float scaleX) override;
	virtual void setScaleY(float scaleY) override;
	virtual void setScale(float scaleX, float scaleY) override;
	virtual void setScale(float scale) override;

	virtual void setPosition(const Vec2& pos) override;
	virtual void setPosition(float x, float y) override;
	virtual void setRotation(float rotation) override;
	virtual void setPositionZ(float positionZ) override;

	virtual void setSkewX(float sx) override;
	virtual void setSkewY(float sy) override;
	virtual void setRotationSkewX(float rotationX) override;
	virtual void setRotationSkewY(float rotationY) override;

	virtual void setAnchorPoint(const Vec2& anchor) override;
	virtual void ignoreAnchorPointForPosition(bool value) override;

	virtual void setVisible(bool bVisible) override;

	virtual void addChild(Node *child, int zOrder, int tag) override;
	virtual void addChild(Node *child, int zOrder, const std::string &name) override;
	virtual void removeChild(Node* child, bool cleanup) override;
	virtual void removeAllChildrenWithCleanup(bool cleanup) override;
	virtual void reorderChild(Node *child, int zOrder) override;
	virtual void sortAllChildren() override;

	virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;
	virtual void setOpacityModifyRGB(bool modify) override;
	virtual bool isOpacityModifyRGB(void) const override;
};
//





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI