cocos2d-x Demo-实现画笔功能
来源:互联网 发布:网络教育什么专业好 编辑:程序博客网 时间:2024/06/06 01:21
首先,原文来自 沈大海:cocos2d-x 2.0实现绘图功能实例-《你画你猜》--沈大海cocos2d-x教程14
原理是这样的,当出现屏幕触摸事件时,记录触摸点的坐标,然后通过重载node的draw()方法,这个方法每帧会画一次屏幕,我们在该方法中将记录的点画出来。当然在智能机上其实不推荐直接绘制几何图像,因为大量的坐标编码会极大降低机器的工作效率,而且可能和其他图片产生渲染遮挡的问题,由于这个只是小demo,所以就无所谓。
研究过沈大海的代码后觉得写得稍微有点粗糙,他的版本如果想画东西你只能一笔画完,如果再画第二笔那么第一笔的内容就会被清空,根据他的代码我进行了修改,实现了随意画的功能,并且还添加了一个按钮,可以清空画板。
DrawView.h
#ifndef __DRAW_VIEW_H_#define __DRAW_VIEW_H_#include "cocos2d.h"class DrawView : public cocos2d::CCLayerColor{public:DrawView();~DrawView();cocos2d::CCArray *points;cocos2d::CCArray *lines;static cocos2d::CCScene *scene();virtual bool init();virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);virtual void draw();virtual void menuCloseCallback(cocos2d::CCObject* pSender);virtual void registerWithTouchDispatcher(void);CREATE_FUNC(DrawView);};#endif
DrawView.cpp
#include "DrawView.h"using namespace cocos2d;DrawView::DrawView(){points = new CCArray;points->retain();lines = new CCArray;lines->retain();}DrawView::~DrawView(){points->release();points = NULL;lines->release();lines = NULL;}cocos2d::CCScene *DrawView::scene(){CCScene *scene = CCScene::create();DrawView *layer = DrawView::create();scene->addChild(layer);return scene;}bool DrawView::init(){bool bRet = false;do {CCSize size = CCDirector::sharedDirector()->getWinSize();// 文字标签,内容是replayCCLabelTTF *rePlay = CCLabelTTF::labelWithString("replay", "Arial", 24); CC_BREAK_IF(!rePlay);// 把文字标签加入菜单项,并设置点击后的回调函数CCMenuItemLabel* pMenu = CCMenuItemLabel::create(rePlay, this, menu_selector(DrawView::menuCloseCallback));CC_BREAK_IF(!pMenu);// 设置菜单项的位置,这里是放在右下角pMenu->setPosition(ccp(size.width - pMenu->getContentSize().width/2, pMenu->getContentSize().height/2));// 菜单CCMenu *menu = CCMenu::create(pMenu, NULL);// 让菜单的坐标系按gl坐标系来,如果不这么设置那么原点是默认的屏幕中央menu->setPosition(CCPointZero);// 把菜单添加进图层this->addChild(menu,0);// 设置层可被触摸this->setTouchEnabled(true);bRet = true;} while (0);return bRet;}void DrawView::registerWithTouchDispatcher(){// 注册层响应屏幕触摸事件CCDirector *director = CCDirector::sharedDirector();director->getTouchDispatcher()->addTargetedDelegate(this, 0, true);}bool DrawView::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent ){// 每次触摸事件肯定是由点击开始,所以开始的坐标存进画点的数组CCPoint *point = new CCPoint;point->setPoint(pTouch->getLocation().x, pTouch->getLocation().y);points->addObject(point);point->release();return true;}void DrawView::ccTouchMoved( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent ){// 移动的过程中如果移动的太快,会出现画出来是点不连续的情况,所以存进画线的数组,两点// 之间画成线,那图案看起来就会比较连续CCPoint *point = new CCPoint;point->setPoint(pTouch->getLocation().x, pTouch->getLocation().y);lines->addObject(point);point->release();}void DrawView::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent ){// 结束时添加(-1,-1)这个点,代表这一笔画结束了CCPoint *point = new CCPoint;point->setPoint(-1, -1);lines->addObject(point);point->release();}void DrawView::draw(){// 设置点的宽度为4glPointSize(4);// 设置线的宽度为4glLineWidth(4);if(points == NULL)return;CCObject *_object;// 遍历所有的点并画出CCARRAY_FOREACH(points, _object){CCPoint *point = (CCPoint*)_object;ccDrawPoint(ccp(point->x, point->y));}if(lines == NULL)return;int count = lines->count();bool isFirstPoint = false;for (int i = 0;i < count;i++){CCPoint *point = (CCPoint*)lines->objectAtIndex(i);// 如果是(-1, -1)则不用画出来if (point->equals(ccp(-1, -1))){isFirstPoint = true;}else{// 每一笔如果有滑动那么ccTouchMoved方法就会往lines添加点,由于画线需要// 两个点,所以所以第一点还是画成圆点if (isFirstPoint || i == 0){ccDrawPoint(ccp(point->x, point->y));isFirstPoint = false;}else{// 画线CCPoint *beforePoint = (CCPoint*)lines->objectAtIndex(i-1);ccDrawLine(ccp(point->x, point->y), ccp(beforePoint->x, beforePoint->y));}}}}void DrawView::menuCloseCallback( CCObject* pSender ){// 清空所有点points->removeAllObjects();lines->removeAllObjects();}
最后上图
附本章源码下载:http://download.csdn.net/detail/lpkkk/5002135
文章所写的东西只是我自己的理解,如果哪里出现错误,敬请斧正。
您可以留言、微博私聊我或Email我
我的微博:http://weibo.com/u/2007282737
我的Email:pengkailiao@gmail.com
本文所有内容均为原创,转载请注明出处 lpk:http://blog.csdn.net/lpkkk ,谢谢!
- cocos2d-x Demo-实现画笔功能
- cocos2d-x 画笔实现
- cocos2d实现画笔功能及常用的绘制函数
- Opencv实现画笔的功能
- cocos2d-x实现简易屏幕截图功能
- 利用cocos2d-x实现CandyCrushSaga消除功能
- 利用cocos2d-x实现CandyCrushSaga消除功能
- 在COCOS2D-X中实现橡皮擦功能
- Cocos2d-x实现Android的Toast功能
- Cocos2d-x实现Android的Toast功能
- Cocos2d-x实现Android的Toast功能
- Cocos2d-x实现用户触摸的功能
- Cocos2d-x实现计时器与定时器功能
- cocos2d-x demo资源
- cocos2d-x demo资源
- Cocos2d-x CCScrollView demo
- COCOS2D-X之帧动画的一种实现Demo
- canvas实现简单的画笔功能
- Oracle自动分区
- XlFileFormat Enumeration (Excel)
- C#父子窗体
- 手机开发面试经历
- pointer和reference的比较
- cocos2d-x Demo-实现画笔功能
- 转全角半角(C#,VB.NET)
- iOS开发之UIWebView
- Java 线程以及sychronizd同步
- jquery的一些小技巧
- 如何优化cocos2d/x程序的内存使用和程序大小
- 用一行代码让w3wp进程崩溃,如何查找w3wp进程崩溃的原因
- JS 计算时间差(月份差、天数差)
- android界面的各种属性