好了这里我先上代码

首先定义这个函数

void HelloWorld::changeDatas(Image *image,Image * image1,Point point)
{
	auto data = image->getData();//橡皮擦数据头指针
	auto data1 = image1->getData();//被擦除数据头指针
	auto size = Director::getInstance()->getVisibleSize();
	int pha = 3;
	if (image->hasAlpha())//判断是否有Alpha通道
	{
		pha = 4;
	}

	for (int x = 0; x < image->getWidth(); ++x)
	{
		for (int y = 0; y < image->getHeight(); ++y)
		{
			/*下面是获取rgb颜色值 这里说明一下   
		    data是指向数据的头指;指针指向数据的排列方式是 data 0~3 rgba data 4~7 rgba
			所以没有Alpha通道 的排列方式是  data 0~2  rgb  data 3~5  rgb
			*/
			unsigned char *pixel = data + (x + y * image->getWidth()) * pha;//遍历每个像素点的rgb
			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)//如果该点有颜色就将被剪裁区域的颜色替换成无色
			{
				Point changep = Point(size.width/2,size.height-size.height/2);//因为Opengl的坐标在左上角所以做坐标转换;这里应该把被剪裁区域的图坐标转换成OPENGL
				Point changep1 = Point(changep.x - image1->getWidth() / 2,changep.y - image1->getHeight() / 2);

				int c = x + point.x - changep1.x - image->getWidth() / 2;
				int d = y + point.y - changep1.y - image->getHeight() / 2;

				if (c>0&&d>0&&c < image1->getWidth() && d <image1->getHeight())
				{
					int pha1 = 3;
					if (image1->hasAlpha())
					{
						pha1 = 4;
					}
					unsigned char *pixel1 = data1 + (c + d * image1->getWidth()) * pha1;
					*pixel1 = 0;//数据修改
					*(pixel1 + 1) = 0;
					*(pixel1 + 2) = 0;
		
				}
			}

		}
	}


}

然后在初始化方法里
auto CliperImage = new Image();//创建一个需要剪裁的Image

	CliperImage->initWithImageFile("HelloWorld.png");
	auto image = new Image();//创建一个橡皮擦Image

	image->initWithImageFile("123.png");
	auto text = new Texture2D();
	text->initWithImage(CliperImage);
	auto sp = Sprite::createWithTexture(text);
	sp->setPosition(visibleSize.width/2,visibleSize.height/2);
	this->addChild(sp,33);//通过不停的更新这个SP来实现涂擦效果 也可以认为更新了CliperImage的DATA来实现

	/*创建监听事件*/
	auto linstener = EventListenerTouchOneByOne::create();

	linstener->onTouchBegan = [this](Touch *touch,Event *event)
	{
			return true;
	
	
	};
	linstener->onTouchMoved = [this,CliperImage,image](Touch *touch,Event *event)
	{
		auto size = Director::getInstance()->getVisibleSize();
		this->removeChildByTag(33);
		changeDatas(image,Point(touch->getLocation().x,size.height - touch->getLocation().y));
		auto text1 = new Texture2D();
		text1->initWithImage(CliperImage);
		auto sp = Sprite::createWithTexture(text1);
		sp->setPosition(size.width / 2,size.height / 2);
		addChild(sp,33);
		
	};

	linstener->onTouchEnded = [this,Event *event)
	{  
		auto size = Director::getInstance()->getVisibleSize();
		this->removeChildByTag(33);
		changeDatas(image,size.height - touch->getLocation().y));
	    auto text1 = new Texture2D();
		text1->initWithImage(CliperImage);
		auto sp = Sprite::createWithTexture(text1);
		sp->setPosition(size.width/2,size.height/2);
		addChild(sp,33);
	};

	_eventdispatcher->addEventListenerWithSceneGraPHPriority(linstener,this);

好了我们来看下效果同样的123.png是这个

效果图


其实原理就是通过修改这张图的二进制文件数据来实现擦涂效果;

不像我上一篇介绍的ClippingNode一样可以添加很多精灵进行裁剪;

cocos2dx实现自定义图形橡皮擦功能 不是利用ClippingNode的更多相关文章

  1. 手把手教你实现一个canvas智绘画板的方法

    这篇文章主要介绍了手把手教你实现一个canvas智绘画板的方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. android – 尝试为画布创建橡皮擦颜料

    我正在创建一个利用下面的DrawingSurfaceView类的绘图应用程序.在那个类中,我有一个PaintCalled橡皮擦,用户可以打开和关闭..当在那个油漆上假设橡皮擦的路径是什么.但它只是画了一条黑线..当我将画布保存为透明png时,橡皮擦是正确的,但在屏幕上显示黑色..用于在blob上写“Erik”的EraserPaint手机屏幕截图从画布中保存了PNGeraserPaint看起来像这样

  3. 清除canvas画布内容(点擦除+线擦除)

    这篇文章主要介绍了清除canvas画布内容(点擦除+线擦除),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. 在iOS中为paint应用程序制作橡皮擦工具

    我正在创建一个绘图应用程序,我想知道如何实现橡皮擦工具.我不想让我的橡皮擦工具绘制白色,因为我想让用户更改背景颜色.而且,是否可以设定刷子的硬度?

  5. Fabric.js橡皮擦问题画布

    我想使用Fabric.js在我的Web应用程序中实现橡皮擦.有没有办法在Fabric.js中实现橡皮擦?>如果您删除以前绘制的路径的一半然后想要使用已擦除的形状,该怎么办?形状本身需要修改;叠加不起作用.>橡皮擦会影响形状还是背景颜色?目前我可能还没有想到更多的问题.

  6. cocos2dx实现自定义图形橡皮擦功能 不是利用ClippingNode

    好了这里我先上代码首先定义这个函数然后在初始化方法里好了我们来看下效果同样的123.png是这个效果图其实原理就是通过修改这张图的二进制文件数据来实现擦涂效果;不像我上一篇介绍的ClippingNode一样可以添加很多精灵进行裁剪;

  7. 利用ClippingNode来实现橡皮擦功能

    我这里没有封装主要讲一下原理通过这种方式不能完全实现自定义图片涂擦功能我先上一段代码好我们来看下效果我的123.png是这张图效果图:大家会发现我123.png是圆的为什么橡皮擦还是方的因为创建的时候就是一张2D纹理拥有长宽(像素);当然如果你想要圆形也是可以的通过drawpolygon函数画一个圆然后添加到EraserList当中就能实现这里就不多说了代码注释也很清楚;哪要怎么实现真正的自定义图片擦除呢在下一篇我会写出我想的到方法实现

  8. HTML5 Canvas橡皮擦工具没有透过白色

    我有画布.我有涂料工具铅笔和橡皮擦.如何在不用白色覆盖(透支)的情况下擦除图纸.这是我的代码橡皮擦用白色绘图:http://jsfiddle.net/66z12xb0/我在后端保存图像后绘图.使用Windows照片查看器打开并查看此结果:额外上传照片:解决方法您使用合成创建橡皮擦的想法是个好主意.destination-out将删除现有图纸,其中新图纸与那些现有图纸重叠.

  9. HTML5画布橡皮擦

    有一种实现橡皮擦的方法(除了使用白色铅笔?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部