本文来自http://blog.csdn.net/runaying ,引用必须注明出处!
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
Layer 是 Node 的子类,它实现 TouchEventsDelegate 协议.节点的所有功能都有效,加上以下新的特点:它可以接收手机的触摸、它可以接收输入加速度
3.1启用/禁用 触摸事件/传感器事件/小键盘事件
3.2 LayerRGBA、LayerColor、LayerGradient、MultipleLayer 是 Layer 的子类,它们扩展了 layer 拥有layer 的所有功能
///cocos2d-x-3.0alpha0/cocos2dx/layers_scenes_transitions_nodes #ifndef __CCLAYER_H__ #define __CCLAYER_H__ #include "base_nodes/CCNode.h" #include "CCProtocols.h" #include "cocoa/CCArray.h" #ifdef EMSCRIPTEN #include "base_nodes/CCGLBufferedNode.h" #endif // EMSCRIPTEN #include "physics/CCPhysicsSetting.h" #include "event_dispatcher/CCEventKeyboard.h" NS_CC_BEGIN /** * @addtogroup layer * @{ */ class TouchScriptHandlerEntry; class EventListenerTouch; class EventListenerKeyboard; class EventListenerAcceleration;
//
// Layer
//
/** @简要 Layer 是 Node 的子类,它实现 TouchEventsDelegate 协议.
节点的所有功能都有效,加上以下新的特点:
- 它可以接收iPhone触摸
- 它可以接收输入加速度
*/
class CC_DLL Layer : public Node
{
public:
/** 创建一个全屏的黑色层*/
static Layer *create(void);
/**
* @js ctor
*/
Layer();
/**
* @js NA
* @lua NA
*/
virtual ~Layer();
virtual bool init();
// 过时的触摸回调函数
CC_DEPRECATED_ATTRIBUTE virtual bool ccTouchBegan(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchMoved(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchEnded(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchCancelled(Touch *pTouch, Event *pEvent) final {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesBegan(Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesMoved(Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesEnded(Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
CC_DEPRECATED_ATTRIBUTE virtual void ccTouchesCancelled(Set *pTouches, Event *pEvent) final {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
// 如果回调脚本存在默认就实现来它们
virtual bool onTouchBegan(Touch *touch, Event *event);
virtual void onTouchMoved(Touch *touch, Event *event);
virtual void onTouchEnded(Touch *touch, Event *event);
virtual void onTouchCancelled(Touch *touch, Event *event);
// 如果回调脚本存在默认就实现来它们
virtual void onTouchesBegan(const std::vector<Touch*>& touches, Event *event);
virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *event);
virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *event);
virtual void onTouchesCancelled(const std::vector<Touch*>&touches, Event *event);
/** @弃用的API请 onAcceleration */
CC_DEPRECATED_ATTRIBUTE virtual void didAccelerate(Acceleration* accelerationValue) final {};
virtual void onAcceleration(Acceleration* acc, Event* event);
/** 如果触摸被启用了, 这个方法在 onEnter 里面被调用. 改变 layer 接受触摸事件需要重写这个方法
( Default: TouchDispatcher::sharedDispatcher()->addStandardDelegate(this,0); )
Example:
void Layer::registerWithTouchDispatcher()
{
TouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,INT_MIN+1,true);
}
@since v0.8.0
*/
CC_DEPRECATED_ATTRIBUTE virtual void registerWithTouchDispatcher() final {};
/** 是否接受触摸事件.
你可以通过这个属性启用/ 禁用触摸事件。
只有这个节点的触摸有效,这个方法不会传播到他的 children
@since v0.8.1
*/
virtual bool isTouchEnabled() const;
virtual void setTouchEnabled(bool value);
virtual void setTouchMode(Touch::DispatchMode mode);
virtual Touch::DispatchMode getTouchMode() const;
/**触摸事件的 swallowsTouches. 默认是true */
virtual void setSwallowsTouches(bool swallowsTouches);
virtual bool isSwallowsTouches() const;
/** 是否接收加速度传感器事件
你可以通过这个属性启用/ 禁用加速度传感器事件
@since v0.8.1
*/
virtual bool isAccelerometerEnabled() const;
virtual void setAccelerometerEnabled(bool value);
virtual void setAccelerometerInterval(double interval);
/** 是否接收键盘或小键盘事件事件
你可以通过这个属性启用/ 禁用键盘或小键盘事件事件
他是 cocos2d-x 新加入的
*/
virtual bool isKeyboardEnabled() const;
virtual void setKeyboardEnabled(bool value);
/** 请使用 onKeyPressed 替代. */
virtual void keyPressed(int keyCode) final {};
/** 请使用 onKeyReleased 替代. */
virtual void keyReleased(int keyCode) final {}; //释放
virtual void onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event);
virtual void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event);
CC_DEPRECATED_ATTRIBUTE virtual bool isKeypadEnabled() const final { return isKeyboardEnabled(); };
CC_DEPRECATED_ATTRIBUTE virtual void setKeypadEnabled(bool value) { setKeyboardEnabled(value); };
/** @弃用的 API 请检查 KeyboardEvent::KeyCode::Menu(KEY_BACKSPACE) 的键码,重写 onKeyReleased 代替. */
CC_DEPRECATED_ATTRIBUTE virtual void keyBackClicked() final {};
CC_DEPRECATED_ATTRIBUTE virtual void keyMenuClicked() final {};
//
// Overrides
//
/**
* @js NA
* @lua NA
*/
virtual void onEnter() override;
/**
* @js NA
* @lua NA
*/
virtual void onExit() override;
/**
* @js NA
* @lua NA
*/
virtual void onEnterTransitionDidFinish() override;
#ifdef CC_USE_PHYSICS
virtual void addChild(Node* child) override;
virtual void addChild(Node* child, int zOrder) override;
virtual void addChild(Node* child, int zOrder, int tag) override;
#endif // CC_USE_PHYSICS
protected:
void addTouchListener();
bool _touchEnabled;
bool _accelerometerEnabled;
bool _keyboardEnabled;
EventListenerTouch* _touchListener;
EventListenerKeyboard* _keyboardListener;
EventListenerAcceleration* _accelerationListener;
private:
Touch::DispatchMode _touchMode;
bool _swallowsTouches;
int executeScriptTouchHandler(EventTouch::EventCode eventType, Touch* touch);
int executeScriptTouchesHandler(EventTouch::EventCode eventType, const std::vector<Touch*>& touches);
};
#ifdef __apple__ #pragma mark - #pragma mark LayerRGBA #endif /** LayerRGBA 是 Layer 的子类,他实现了 RGBAProtocol 协议,使用实心的颜色作为背景 Layer 的所有属性都有效,再加上一下新的特点,传播到符合 children 的 RGBAProtocol: - opacity // 不透明度 - RGB colors @since 2.1 */ class CC_DLL LayerRGBA : public Layer, public RGBAProtocol { public: CREATE_FUNC(LayerRGBA); /** * @js ctor */ LayerRGBA(); /** * @js NA * @lua NA */ virtual ~LayerRGBA(); virtual bool init(); // // Overrides // virtual GLubyte getOpacity() const override; virtual GLubyte getDisplayedOpacity() const override; virtual void setOpacity(GLubyte opacity) override; virtual void updateDisplayedOpacity(GLubyte parentOpacity) override; virtual bool isCascadeOpacityEnabled() const override; virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled) override; virtual const Color3B& getColor() const override; virtual const Color3B& getDisplayedColor() const override; virtual void setColor(const Color3B& color) override; virtual void updateDisplayedColor(const Color3B& parentColor) override; virtual bool isCascadeColorEnabled() const override; virtual void setCascadeColorEnabled(bool cascadeColorEnabled) override; virtual void setOpacityModifyRGB(bool bValue) override {CC_UNUSED_PARAM(bValue);} virtual bool isOpacityModifyRGB() const override { return false; } protected: GLubyte _displayedOpacity, _realOpacity; Color3B _displayedColor, _realColor; bool _cascadeOpacityEnabled, _cascadeColorEnabled; };
// // LayerColor // /** @brief LayerColor 是 Layer的子类它实现了 RGBAProtocol 协议. Layer 的所有属性都有效,再加上一下新的特点: - opacity //不透明度 - RGB colors */ class CC_DLL LayerColor : public LayerRGBA, public BlendProtocol #ifdef EMSCRIPTEN , public GLBufferedNode #endif // EMSCRIPTEN { public: /** 创建一个全屏的黑色层 */ static LayerColor* create(); /** 根据指定的颜色创建一个 layer, width 和 height 都是以点为单位的 */ static LayerColor * create(const Color4B& color, GLfloat width, GLfloat height); /** 根据指定的颜色创建一个 layer, width 和 height 是窗口的尺寸. */ static LayerColor * create(const Color4B& color); /** * @js ctor */ LayerColor(); /** * @js NA * @lua NA */ virtual ~LayerColor(); virtual bool init(); /** 根据指定的颜色初始化一个 layer, width 和 height 都是以点为单位的 * @js init * @lua init */ bool initWithColor(const Color4B& color, GLfloat width, GLfloat height); /** 根据指定的颜色初始化一个 layer, width 和 height 是窗口的尺寸. * @js init * @lua init */ bool initWithColor(const Color4B& color); /** 改变宽度点数*/ void changeWidth(GLfloat w); /** 改变高度点数*/ void changeHeight(GLfloat h); /** 改变宽、高点数 @since v0.8 */ void changeWidthAndHeight(GLfloat w ,GLfloat h); // // Overrides // virtual void draw() override; virtual void setColor(const Color3B &color) override; virtual void setOpacity(GLubyte opacity) override; virtual void setContentSize(const Size & var) override; /** BlendFunction 符合 BlendProtocol 协议 */ /** * @js NA * @lua NA */ virtual const BlendFunc& getBlendFunc() const override; /** *@code *当这个功能绑定到 js 或者 lua,参数将改变 *In js: var setBlendFunc(var src, var dst) *In lua: local setBlendFunc(local src, local dst) *@endcode */ virtual void setBlendFunc(const BlendFunc& blendFunc) override; protected: virtual void updateColor(); BlendFunc _blendFunc; Vertex2F _squareVertices[4]; Color4F _squareColors[4]; };
// // LayerGradient 梯度 Layer // /** @brief LayerGradient 是 LayerColor 的子类用来绘制整个背景的渐变 LayerColor 的所有功能都有效,加上以下新的特点:: - direction //方向 - final color - interpolation mode //插补模式 StartColor 和 endColor ,之间的沿给定载体(在原点开始,结束在总站)之间的颜色插值。如果没有提供载体,它默认为(0,-1) - 淡入淡出从上到下。 如果'compressedInterpolation'被禁用,你将不会看到起点或结束颜色的 non-cardinal ;但是一个平滑渐变将仍然在两个端点之间显示 如果'compressedInterpolation'启用(默认模式),你会看到的开始和结束的颜色渐变. @since v0.99.5 */ class CC_DLL LayerGradient : public LayerColor { public: /** 创建一个全屏的黑色层 */ static LayerGradient* create(); /** 使用开始和结束之间的颜色渐变,创建一个全屏幕的 Layer*/ static LayerGradient* create(const Color4B& start, const Color4B& end); /** 在 v 方向上,使用开始和结束之间的颜色渐变,创建一个全屏幕的 Layer. */ static LayerGradient* create(const Color4B& start, const Color4B& end, const Point& v); virtual bool init(); /** 使用开始和结束之间的颜色渐变,初始化一个 Layer. * @js init * @lua init */ bool initWithColor(const Color4B& start, const Color4B& end); /** 在 v 方向上,使用开始和结束之间的颜色渐变,初始化一个 Layer. * @js init * @lua init */ bool initWithColor(const Color4B& start, const Color4B& end, const Point& v); /** 是否在 规范/非规范 的载体上压缩插值,以便显示所有颜色的梯度 Default: true */ void setCompressedInterpolation(bool bCompressedInterpolation); bool isCompressedInterpolation() const; /** Sets 渐变梯度的开始颜色 */ void setStartColor( const Color3B& startColor ); /** Returns 渐变梯度的开始颜色 */ const Color3B& getStartColor() const; /** Sets 渐变梯度的结束颜色*/ void setEndColor( const Color3B& endColor ); /** Returns 渐变梯度的结束颜色 */ const Color3B& getEndColor() const; /** set 颜色梯度的开始不透明度 */ void setStartOpacity( GLubyte startOpacity ); /** Returns 颜色梯度的开始不透明度 */ GLubyte getStartOpacity() const; /** set 颜色梯度的结束不透明度 */ void setEndOpacity( GLubyte endOpacity ); /** Returns 颜色梯度的结束不透明度 */ GLubyte getEndOpacity() const; /** 设置将用于梯度的方向矢量。 默认值是垂直方向(0,-1)。 */ void setVector(const Point& alongVector); /** Returns 梯度的方向矢量 */ const Point& getVector() const; protected: virtual void updateColor() override; Color3B _startColor; Color3B _endColor; GLubyte _startOpacity; GLubyte _endOpacity; Point _alongVector; bool _compressedInterpolation; };
/** @brief MultipleLayer 是一个有复用它的 children 能力的 Layer. Features: //特点 - 支持一个或多个 children - 同一时间只有一个孩子将被激活 */ class CC_DLL LayerMultiplex : public Layer { public: /** 创建和初始化LayerMultiplex对象 * @js NA * @lua NA */ static LayerMultiplex* create(); /** 使用一个 layers 数组,创建一个LayerMultiplex @since v2.1 * @js NA */ static LayerMultiplex* createWithArray(Array* arrayOfLayers); /** 使用一个或读个 layer 的可变参数列表,创建一个LayerMultiplex * @code * 当这个功能绑定到 js 或者 lua,参数将改变. * In js:var create(...) * In lua:local create(...) * @endcode */ static LayerMultiplex * create(Layer* layer, ... ); /** * lua 脚本不能初始化数目不详变量 * 所以在 lua 使用这个添加这些功能 * @js NA * @lua NA */ static LayerMultiplex * createWithLayer(Layer* layer); /** * @js ctor //js的构造函数 */ LayerMultiplex(); /** * @js NA * @lua NA */ virtual ~LayerMultiplex(); virtual bool init(); /** 使用可变参数列表与一个或多个 layer 初始化MultiplexLayer * @js NA * @lua NA */ bool initWithLayers(Layer* layer, va_list params); /** 使用一个 layers 数组初始化一个 MultiplexLayer @since v2.1 */ bool initWithArray(Array* arrayOfLayers); void addLayer(Layer* layer); /** 使用索引 n 切换到某个 layer 当前(旧的)layer 将使用 'cleanup=true' 从它们的 parent 里面移除 The current (old) layer will be removed from it's parent with 'cleanup=true'. */ void switchTo(int n); /** 释放当前 layer ; 使用索引 n 切换到某个 layer. The current (old) layer will be removed from it's parent with 'cleanup=true'. */ void switchToAndReleaseMe(int n); protected: unsigned int _enabledLayer; Array* _layers; }; // end of layer group /// @} NS_CC_END #endif // __CCLAYER_H__