COCOS2D-X 实现图片区域内滚动
来源:互联网 发布:java查询ip地址归属地 编辑:程序博客网 时间:2024/05/17 06:40
制作游戏过程中也许会碰到这样的需求,写出来给大家分享。 转载请注明,谢谢。
代码实现:
先show一下效果:
实现思路:
通过CCSprite::setTextureRect修改图像显示区间,通过注册定时器任务实时刷新并显示。
废话不多说,上代码。
参考代码如下:
头文件:
class ScollDisplay : public CCNode{public: CREATE_FUNC(ScollDisplay); // 设置显示对象 void setDisPlayObj(CCSprite *pObj, CCSize dispSize, float speed, EDirection direction = ktLeft, bool bForever = true); // 开始交替显示 void startShow(); private: ScollDisplay(); ~ScollDisplay(); virtual bool init(); // 接受定时更新 virtual void display(float dt); protected: bool m_bIsStarted; CCRect m_curRect; // 当前的显示区域 通过调整这个来达到滚轴效果 CCSprite *m_pScollObj; float m_fSpeed; // 每帧滚动速度 EDirection m_direction; // 滚动方向 bool m_bScollEnd; // 滚动结束 bool m_bScollForever; // 不断滚动还是滚动一次};
代码实现:
//// ScollDisplay.cpp// Island of Jiang//// Created by apple on 13-6-21.////#include "ScollDisplay.h"ScollDisplay::ScollDisplay():m_bIsStarted(false), m_pScollObj(NULL), m_fSpeed(0), m_direction(ktLeft), m_bScollEnd(false), m_bScollForever(true){}ScollDisplay::~ScollDisplay(){}// 初始化bool ScollDisplay::init(){ return true;}// 设置显示对象void ScollDisplay::setDisPlayObj(CCSprite *pObj, CCSize dispSize, float speed, EDirection direction, bool bForever){ CC_RETURN_NONE_IF(!pObj); m_bIsStarted = false; m_pScollObj = pObj; m_curRect = CCRectMake(0, 0, dispSize.width, dispSize.height); // 初始显示区域 m_fSpeed = speed; m_direction = direction; m_bScollForever = bForever; m_bScollEnd = false;}// 开始交替显示void ScollDisplay::startShow(){ // 防止重复 if (m_bIsStarted) { return; } schedule(schedule_selector(ScollDisplay::display)); display(0); // display first}// 接受定时更新void ScollDisplay::display(float dt){ // 处理滚动逻辑 if (!m_pScollObj) { return; } // 滚动到位了 if (m_bScollEnd) { return; } CCSize textureSize = m_pScollObj->getTexture()->getContentSizeInPixels(); CCSize winSize = m_curRect.size; // x最大坐标 = 窗口宽度 - 素材宽度 * 缩放比 float min_X = 0; float max_X = (textureSize.width * m_pScollObj->getScaleX()) - winSize.width; // y最大坐标 = 窗口高度 - 素材高度 * 缩放比 float min_Y = 0; float max_Y = (textureSize.height * m_pScollObj->getScaleY()) - winSize.height; // 计算偏差 并判断是否需要复位 float fxOffset = 0; float fyOffset = 0; switch (m_direction) { case ktDown: // first time init if (!m_bIsStarted) { m_curRect.origin.y = min_Y; m_bIsStarted = true; } fyOffset += m_fSpeed; m_curRect.origin.y += fyOffset; if (m_curRect.origin.y > max_Y) { if (m_bScollForever) { m_curRect.origin.y = min_Y; // 复位 } else { m_bScollEnd = true; } return; } break; case ktLeft: // first time init if (!m_bIsStarted) { m_curRect.origin.x = min_X; m_bIsStarted = true; } fxOffset += m_fSpeed; m_curRect.origin.x += fxOffset; if (m_curRect.origin.x > max_X) { if (m_bScollForever) { m_curRect.origin.x = min_X; // 复位 } else { m_bScollEnd = true; } return; } break; case ktRight: // first time init if (!m_bIsStarted) { m_curRect.origin.x = max_X; m_bIsStarted = true; } fxOffset -= m_fSpeed; m_curRect.origin.x += fxOffset; if (m_curRect.origin.x < min_X) { if (m_bScollForever) { m_curRect.origin.x = max_X; // 复位 } else { m_bScollEnd = true; } return; } break; case ktUp: // first time init if (!m_bIsStarted) { m_curRect.origin.y = max_Y; m_bIsStarted = true; } fyOffset -= m_fSpeed; m_curRect.origin.y += fyOffset; if (m_curRect.origin.y < min_Y) { if (m_bScollForever) { m_curRect.origin.y = max_Y; // 复位 } else { m_bScollEnd = true; } return; } break; default: CCLog("direction [%d] is invalid.", m_direction); return; } // 通过设置特定区域来实现滚动 m_pScollObj->setTextureRect(m_curRect);}
代码调用:
void GameMenuLayer::onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader) { // scoll upgrade pic ScollDisplay *scollObj = ScollDisplay::create(); scollObj->setDisPlayObj(m_pUpgrade, CCSizeMake(115, 76), 1.0f); scollObj->startShow(); this->addChild(scollObj); }
- COCOS2D-X 实现图片区域内滚动
- cocos2d-x 滚动条实现
- cocos2d-x实现背景滚动
- cocos2d-x中滚动视图的实现
- Cocos2d-x 实现静态进度条,文字滚动
- cocos2d-x利用CCClippingNode实现滚动字幕
- cocos2d-x之CCClippingNode实现滚动字幕
- 【Cocos2d-x】地图滚动算法的实现
- cocos2d-x 滚动条
- cocos2d-x 实现图片加文字菜单
- Cocos2d-x--判断触摸点是否在指定区域内
- 学习cocos2d-x之路(5)--实现屏幕滚动
- cocos2d-x 《Flappy Bird 》一、滚动背景的实现
- 【Cocos2d-x】实现可上下左右无限滚动的背景
- cocos2d-x滚动文字(一)
- cocos2d-x 无限地图滚动
- cocos2d-x之滚动背景
- cocos2d-x无限滚动背景
- LINUX3.0内核源代码分析-----内核同步
- 36进制数与10进制数互转
- 【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
- 奇怪的struts乱码
- 【第二章】 IoC 之 2.2 IoC 容器基本原理 ——跟我学Spring3
- COCOS2D-X 实现图片区域内滚动
- 结合设备安装类GUID和设备接口类GUID获取设备VIDPID
- java 设计模式
- 《c陷阱与缺陷》笔记--注意边界值
- tpc-c 基准测试简介以及程序的安装、使用
- android之写文件到sd卡
- Struts2(0):Struts2框架入门
- ArchLinux终于安装成功
- 我喜欢那个曾经喜欢你(RL)的我