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

首頁 > 編程 > C > 正文

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

2020-01-26 13:36:35
字體:
來源:轉載
供稿:網友

本文實例為大家分享了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;}

看下運行效果

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美精品在线| 高清亚洲成在人网站天堂| 在线视频欧美日韩精品| 成人免费淫片aa视频免费| 久久久久久久久久久免费精品| 国产精品亚洲美女av网站| 国产精品高潮呻吟视频| 97久久精品在线| 日韩电影免费观看中文字幕| 77777少妇光屁股久久一区| 九九九久久国产免费| 国产在线观看91精品一区| 国产精品jizz在线观看麻豆| 日韩av黄色在线观看| 91精品国产高清久久久久久久久| 日韩av理论片| 日韩一二三在线视频播| 欧美理论电影网| 精品无人国产偷自产在线| 国产精品 欧美在线| 中文字幕欧美视频在线| 久久伊人精品视频| 国产精品香蕉国产| 久久久97精品| 欧美精品久久久久a| 日韩欧美aⅴ综合网站发布| 久久免费视频在线| 成人欧美一区二区三区黑人孕妇| 一区二区av在线| 欧美激情视频一区| 久久久精品电影| 欧美日韩在线视频观看| 欧美成人免费大片| 色悠悠久久久久| 久色乳综合思思在线视频| 国产视频精品免费播放| 国产精品久久久久一区二区| 成人黄色免费在线观看| 中文字幕av一区| 日韩人体视频一二区| 亚洲美女又黄又爽在线观看| 中文字幕亚洲激情| 亚洲自拍欧美色图| 最近2019中文字幕第三页视频| 日韩av在线最新| 精品久久久久久久中文字幕| 亚洲一区二区三区香蕉| 欧美激情国内偷拍| 77777少妇光屁股久久一区| 国产香蕉97碰碰久久人人| 91综合免费在线| 日韩电影中文字幕在线观看| 欧美怡春院一区二区三区| 中文字幕亚洲天堂| 国内揄拍国内精品| 欧美激情在线狂野欧美精品| 日韩精品极品毛片系列视频| 日本最新高清不卡中文字幕| 亚洲韩国日本中文字幕| 91免费看片在线| 伦伦影院午夜日韩欧美限制| 成人精品视频久久久久| 日本久久久a级免费| 在线观看国产成人av片| 日韩精品中文在线观看| 亚洲免费视频观看| 亚洲国产女人aaa毛片在线| 国产成人精品视频在线观看| 亚洲国产精彩中文乱码av在线播放| 日本一区二区三区在线播放| 日韩中文有码在线视频| 日本不卡免费高清视频| 中文字幕亚洲自拍| 亚洲最大成人免费视频| 国内免费久久久久久久久久久| 欧美色视频日本高清在线观看| 久久久成人的性感天堂| 成人午夜在线观看| 欧美一级淫片丝袜脚交| 日韩在线观看高清| 国产欧亚日韩视频| 欧美裸体男粗大视频在线观看| 久久久亚洲影院| 国产精品久久久久久影视| 亚州成人av在线| 欧美激情在线播放| 亚洲精品国产综合区久久久久久久| 亚洲精品女av网站| 97国产一区二区精品久久呦| 成人精品一区二区三区电影免费| 亚洲欧美中文日韩在线v日本| 日本成熟性欧美| 中文字幕精品视频| 亚洲国产天堂久久综合网| 91精品视频专区| 亚洲男子天堂网| 91精品国产自产91精品| 国产精品久久久久久久久久三级| 成人免费观看49www在线观看| 亚洲男人天堂手机在线| 欧美午夜性色大片在线观看| 亚洲精品国产综合区久久久久久久| 播播国产欧美激情| 国产精品久久久久久av福利软件| 中文字幕欧美专区| 欧美激情伊人电影| 亚洲黄色www网站| 国产精品亚洲欧美导航| 日韩精品免费综合视频在线播放| 韩国v欧美v日本v亚洲| 日韩综合视频在线观看| 国产精品久久久久久久久粉嫩av| 亚洲美女中文字幕| 欧美另类高清videos| 92版电视剧仙鹤神针在线观看| 国产一区私人高清影院| 精品中文字幕在线| 国产成人精品综合| 欧美日韩国产123| 中文综合在线观看| 91性高湖久久久久久久久_久久99| 狠狠爱在线视频一区| 亚洲激情久久久| 欧美成人激情图片网| 中文欧美日本在线资源| 国产亚洲一区二区精品| 国产日韩精品在线观看| 国产成人在线亚洲欧美| 亚洲另类图片色| 欧美激情国产精品| 色播久久人人爽人人爽人人片视av| 91精品视频在线免费观看| 一个人www欧美| 国产精品羞羞答答| 久久影视电视剧凤归四时歌| 91av网站在线播放| 91沈先生作品| 精品国产91久久久| 日本欧美在线视频| 91精品国产91久久久久久| 亚洲女人初尝黑人巨大| 国产精品91在线| 日韩第一页在线| 久久亚洲精品中文字幕冲田杏梨| 精品中文字幕在线| 91av视频在线免费观看| 国产色综合天天综合网| 最新91在线视频| 国产精品99一区| 久久久久久国产精品久久| 成人黄色短视频在线观看| 欧美日韩aaaa| 91精品啪在线观看麻豆免费| 欧美极品在线播放| 亚洲第一福利在线观看| 亚洲在线免费看| 粗暴蹂躏中文一区二区三区| 日本一区二区在线免费播放| 欧洲美女7788成人免费视频| 一区二区三区日韩在线| 日韩黄在线观看| 欧美色播在线播放| 91精品视频免费观看| 欧美大胆a视频|