亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

cocos2dx實現橡皮擦效果以及判斷是否擦除完畢

2020-05-23 13:23:49
字體:
來源:轉載
供稿:網友

本文實例為大家分享了cocos2dx實現橡皮擦效果,以及判斷是否擦除完畢,供大家參考,具體內容如下

首先修改HelloWorld.h文件

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h"#include "cocos-ext.h"USING_NS_CC_EXT;USING_NS_CC;class HelloWorld : public cocos2d::Layer{public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* createScene();  // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init();  // a selector callback void menuCloseCallback(cocos2d::Ref* pSender);  // implement the "static create()" method manually CREATE_FUNC(HelloWorld); void myUpdate(float dt);//不斷判斷是否全部擦除 void onTouchesMoved(const std::vector<Touch*>& touches, Event* event); bool myIsDataClear(RenderTexture *pRenderTexture);//是否完全擦除 bool myIsDataClearInRect(RenderTexture *pRenderTexture,int x,int y,int width ,int height);//某個區域是否完全擦除 Sprite *sprFore; RenderTexture *renderTexture; Vector<Sprite*> _brushs;}; #endif // __HELLOWORLD_SCENE_H__

然后修改HelloWorld.cpp文件

#include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene(){ // 'scene' is an autorelease object auto scene = Scene::create();  // 'layer' is an autorelease object auto layer = HelloWorld::create();  // add layer as a child to scene scene->addChild(layer);  // return the scene return scene;} // on "init" you need to initialize your instancebool HelloWorld::init(){  if ( !Layer::init() ) {  return false; }  Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin();  auto closeItem = MenuItemImage::create(           "CloseNormal.png",           "CloseSelected.png",           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));  closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,        origin.y + closeItem->getContentSize().height/2));  auto menu = Menu::create(closeItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1);     auto label = Label::createWithTTF("Test Eraser", "fonts/Marker Felt.ttf", 24);   label->setPosition(Vec2(origin.x + visibleSize.width/2,       origin.y + visibleSize.height - label->getContentSize().height));  this->addChild(label, 1);    sprFore = Sprite::create("HelloWorld.png"); sprFore->setPosition(Vec2(visibleSize / 2) + origin); sprFore->retain(); renderTexture = RenderTexture::create(visibleSize.width, visibleSize.height, Texture2D::PixelFormat::RGBA8888); renderTexture->setContentSize(visibleSize); renderTexture->retain(); this->addChild(renderTexture); renderTexture->setPosition(Vec2(visibleSize / 2) + origin);    renderTexture->beginWithClear(0, 0, 0, 0); sprFore->visit(); renderTexture->end();    auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);  //不斷判斷是否擦除完畢 schedule(schedule_selector(HelloWorld::myUpdate), 0.5f); return true;}  void HelloWorld::menuCloseCallback(Ref* pSender){#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); return;#endif  Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0);#endif} void HelloWorld::myUpdate(float dt){ if (myIsDataClear(renderTexture) == true) {  log("image is clear !"); }  if (myIsDataClearInRect(renderTexture,300,200,50,50) == true) {  log("image in rect is clear !"); }} void HelloWorld::onTouchesMoved(const std::vector<Touch*>& touches, Event* event){ auto touch = touches[0]; auto start = touch->getLocation(); auto end = touch->getPreviousLocation();  // begin drawing to the render texture renderTexture->begin();  // for extra points, we'll draw this smoothly from the last position and vary the sprite's // scale/rotation/offset float distance = start.getDistance(end); if (distance > 1) { int d = (int)distance; _brushs.clear(); for (int i = 0; i < d; ++i) { //橡皮擦 auto sprite = CCSprite::create("red.png");//主要根據圖片定義橡皮擦的形狀 BlendFunc blendFunc; blendFunc.src = GL_ZERO; blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA; sprite->setBlendFunc(blendFunc); sprite->setScale(1.8f); renderTexture->addChild(sprite); _brushs.pushBack(sprite); } for (int i = 0; i < d; i++) { float difx = end.x - start.x; float dify = end.y - start.y; float delta = (float)i / distance; _brushs.at(i)->setPosition(Vec2(start.x + (difx * delta), start.y + (dify * delta))); _brushs.at(i)->visit(); } }  // finish drawing and return context back to the screen renderTexture->end(); } bool HelloWorld::myIsDataClear(RenderTexture *pRenderTexture){ bool m_bEraserOk = false;  Image* image = new Image(); image = pRenderTexture->newImage(true);  int m = 3; if (image->hasAlpha()) { m = 4; }  unsigned char *data_ = image->getData();  int x = 0, y = 0; /// 這里要提醒一點,即Opengl下,其中心點坐標在左上角 for (x = 0; x < pRenderTexture->getContentSize().width; ++x) { for (y = 0; y < pRenderTexture->getContentSize().height; ++y) { //獲取每個點的像素點值 unsigned char *pixel = data_ + (x + y * image->getWidth()) * m;  // You can see/change pixels' RGBA value(0-255) here ! unsigned int r = (unsigned int)*pixel; unsigned int g = (unsigned int)*(pixel + 1); unsigned int b = (unsigned int)*(pixel + 2); unsigned int a = (unsigned int)*(pixel + 3);  if (r != 0 && g != 0 && b != 0 && a != 0) { m_bEraserOk = false; break; } } //如果改列 有一個點的像素點值不為零 跳出 if (pRenderTexture->getContentSize().height != y) { break; } }  //如果所有點的像素點值都為0 則擦除完畢 if (x == pRenderTexture->getContentSize().width && y == pRenderTexture->getContentSize().height) { m_bEraserOk = true; }  delete image;  return m_bEraserOk;} bool HelloWorld::myIsDataClearInRect(RenderTexture *pRenderTexture, int x, int y, int width, int height){    bool m_bEraserOk = false;  Image* image = new Image(); image = pRenderTexture->newImage(true);  int m = 3; if (image->hasAlpha()) { m = 4; }  int i = 0, j = 0; unsigned char* mdata = (unsigned char*)image->getData(); for (i = 0; i < width; ++i) { for (j = 0; j < height; ++j) {  unsigned char *pixel = mdata + (i + x + (image->getHeight() - y - (height - j)) * image->getWidth()) * m;  // You can see/change pixels' RGBA value(0-255) here ! unsigned int r = (unsigned int)*pixel; unsigned int g = (unsigned int)*(pixel + 1); unsigned int b = (unsigned int)*(pixel + 2); unsigned int a = (unsigned int)*(pixel + 3);  if (r != 0 && g != 0 && b != 0 && a != 0) { break; }  }  if (height != j) { break; } }  if (i == width && j == height) { m_bEraserOk = true; } return m_bEraserOk;}

看下運行效果

cocos2dx,橡皮擦,擦除

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人福利网站在线观看| 91系列在线观看| 亚洲精品电影久久久| 成人写真视频福利网| 91在线看www| 97成人精品区在线播放| 国产精品jvid在线观看蜜臀| 国产精品久久91| 亚洲色图校园春色| 日韩免费观看视频| 国产精品久久av| 北条麻妃久久精品| 亚洲品质视频自拍网| 亚洲一区二区三区sesese| 亚洲国产精久久久久久| 97香蕉久久超级碰碰高清版| 最新日韩中文字幕| 欧美亚洲在线观看| 国内成人精品视频| 亚洲欧美制服丝袜| 亚洲精品久久久久久久久久久久久| 裸体女人亚洲精品一区| 国产精品www| 国内精品久久久久久| 亚洲人午夜精品免费| 亚洲春色另类小说| 成人网在线免费观看| 中文字幕亚洲字幕| 波霸ol色综合久久| 久久久国产精品视频| 亚洲精品成人久久| 欧美激情区在线播放| 国产va免费精品高清在线观看| 亚洲欧洲在线观看| 欧美日韩免费区域视频在线观看| 岛国av一区二区| 亚洲成年网站在线观看| 欧美一区二区影院| 中日韩美女免费视频网址在线观看| 亚洲二区在线播放视频| 欧美精品激情在线| 日韩日本欧美亚洲| 国产精品69av| 国产精品色午夜在线观看| 亚洲国产一区二区三区四区| 久久成人精品视频| 欧美性xxxx极品hd欧美风情| 在线日韩精品视频| 国产成人av网址| 亚洲成人教育av| 欧美一级电影久久| 亚洲成成品网站| 亚洲黄色在线观看| 77777亚洲午夜久久多人| 国产日韩欧美在线播放| 亚洲小视频在线观看| 97在线视频一区| 一本一道久久a久久精品逆3p| 国产精品激情av电影在线观看| 一区二区三区视频免费在线观看| 色偷偷88888欧美精品久久久| 欧美另类暴力丝袜| 97av视频在线| 91精品国产乱码久久久久久蜜臀| 国产精品亚洲美女av网站| 亚洲精品久久久久中文字幕欢迎你| 亚洲精品二三区| 亚洲欧美日韩网| 久久久久国产精品免费网站| 亚洲毛茸茸少妇高潮呻吟| 伊人久久久久久久久久久| 成人免费直播live| 亚洲国产精品久久精品怡红院| 久久av中文字幕| 精品国产一区二区三区久久狼5月| 国产欧美精品一区二区三区-老狼| 国产精品久久久久久久久久小说| 日韩久久精品电影| 黄色一区二区在线观看| 97av在线视频| 日韩麻豆第一页| 欧美自拍视频在线观看| 亚洲精品免费av| 亚洲人成在线观| 欧美另类老肥妇| 成人性生交大片免费看小说| 成人国产精品久久久久久亚洲| 亚洲国产精品人久久电影| 欧美人交a欧美精品| 国产亚洲欧美一区| 欧美视频一二三| 欧美一级黑人aaaaaaa做受| 国产一区二区三区高清在线观看| 成人美女免费网站视频| 性欧美长视频免费观看不卡| 欧美在线欧美在线| 久久国产精品亚洲| 久久人人爽人人爽人人片av高请| 日韩精品免费在线视频观看| 欧美中文字幕视频在线观看| 国外色69视频在线观看| 欧美在线视频导航| 国产一区二区三区在线播放免费观看| 欧美另类极品videosbestfree| 黑人巨大精品欧美一区二区三区| 欧美精品免费在线| 亚洲一区免费网站| 大胆欧美人体视频| 国产精品成人国产乱一区| 国产精品18久久久久久首页狼| 精品成人国产在线观看男人呻吟| 久久久人成影片一区二区三区| 欧美成人免费网| 91精品91久久久久久| 日韩中文理论片| 久久综合亚洲社区| 一个人看的www久久| 国产盗摄xxxx视频xxx69| 色视频www在线播放国产成人| 亚洲区一区二区| 欧美精品一本久久男人的天堂| 日韩亚洲国产中文字幕| 欧美日韩亚洲网| 亚洲国产精品成人va在线观看| 欧美黄色www| 日韩精品在线观看一区| 亚洲精品自在久久| 亚洲国产私拍精品国模在线观看| 国产精品亚洲美女av网站| 国产中文字幕91| 国产精品久久久久久久一区探花| 日本久久亚洲电影| 欧美性猛交xxxx富婆弯腰| 91精品视频观看| 992tv在线成人免费观看| 国产精品露脸av在线| 清纯唯美日韩制服另类| 97超级碰碰碰| 日韩精品在线免费观看视频| 亚洲精品国产精品乱码不99按摩| 欧美午夜精品久久久久久久| 欧美激情在线视频二区| 九九视频直播综合网| 夜夜躁日日躁狠狠久久88av| 亚洲日本aⅴ片在线观看香蕉| 日本伊人精品一区二区三区介绍| 国产亚洲精品日韩| 亚洲黄色在线看| 国产成人aa精品一区在线播放| 亚洲成人免费在线视频| 91久久精品在线| 国产日韩在线精品av| 日韩高清a**址| 黑人巨大精品欧美一区二区一视频| 亚洲淫片在线视频| 日韩中文字幕欧美| 久久久久久久网站| 欧美性高潮床叫视频| 国产高清视频一区三区| 热re91久久精品国99热蜜臀| 久久精品视频va| 中文欧美在线视频| 中文国产成人精品| 亚洲高清一二三区|