国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢

2020-01-26 13:36:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

首先修改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);//某個(gè)區(qū)域是否完全擦除 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");//主要根據(jù)圖片定義橡皮擦的形狀 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; /// 這里要提醒一點(diǎn),即Opengl下,其中心點(diǎn)坐標(biāo)在左上角 for (x = 0; x < pRenderTexture->getContentSize().width; ++x) { for (y = 0; y < pRenderTexture->getContentSize().height; ++y) { //獲取每個(gè)點(diǎn)的像素點(diǎn)值 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; } } //如果改列 有一個(gè)點(diǎn)的像素點(diǎn)值不為零 跳出 if (pRenderTexture->getContentSize().height != y) { break; } }  //如果所有點(diǎn)的像素點(diǎn)值都為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;}

看下運(yùn)行效果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 漳州市| 保康县| 剑河县| 鄂尔多斯市| 新营市| 阳信县| 崇左市| 阳山县| 沙河市| 兴文县| 克东县| 中卫市| 婺源县| 乌拉特中旗| 杂多县| 滦平县| 五大连池市| 宣恩县| 临朐县| 林周县| 郁南县| 遵化市| 镇宁| 海淀区| 南江县| 康保县| 通江县| 广宗县| 平舆县| 灯塔市| 陕西省| 西丰县| 贵德县| 岳西县| 平顺县| 乐清市| 上林县| 黔西县| 石城县| 巴中市| 盐城市|