如何在Cocos2d中实现精灵的触摸精灵官网消失

COCOS2D中对精灵的操作、对图片的各种操作(转) - 幻影交叠 - ITeye技术网站
博客分类:
于精灵的各种操作,总结一下以便以后复习查找。
内容简要:
1、初始化
2、创建无图的精灵
3、设置精灵贴图大小&
4、添加入层中
5、对精灵进行缩放&
6、对精灵款或高进行缩放&
7、旋转精灵
8、设置精灵透明度&
9、精灵的镜像反转&
10、设置精灵的颜色
11、得到图的宽高&&
12、按照像素设定图片大小&
13、在原有的基础上加xy的坐标
14、设置图片锚点&&&
15、从新排列z轴顺序&&
16、更换精灵贴图
17、设置可视区域 18、贴图无锯齿
//初始化
CCSprite* sprite =[CCSprite spriteWithFile:@"Icon.png"];
//创建无图的精灵
CCSprite*sprite2 =[CCSprite node];
//设置精灵贴图大小
sprite2.textureRect=CGRectMake(0, 0, 20, 20);//设置其为宽20,高20.
//添加入层中
[self addChild:sprite z:2]; //将精灵加入层中设置其z轴为2
//对精灵进行缩放
sprite.scale=2;//放大2倍
//对精灵款或高进行缩放
sprite.scaleX = 2;//宽放大2倍
sprite.scaleY = 2;//高放大2倍
//旋转精灵
sprite.rotation=90;//旋转90度
//设置精灵透明度
sprite.opacity=255;//设置透明度为完全不透明(范围0~255)
//定义精灵位置
sprite.position=ccp(100,100);//设置精灵中心点坐标是x=100,y=100
//精灵的镜像反转
[sprite setFlipX:YES];//X轴镜像反转
[sprite setFlipY:YES];//Y轴镜像反转
//设置精灵的颜色
[sprite setColor:ccc3(255, 0, 0)];//设置颜色为红色
//得到图的宽高
float& contentSize& = sprite .contentSize.width //得到图片的宽高
//按照像素设定图片大小
sprite.scaleX=(20)/contentS //按照像素定制图片宽高
//在原有的基础上加xy的坐标
sprite.position = ccpAdd(sprite.position,ccp(20,20));//在原有坐标的基础上加减坐标
//设置图片锚点
[sprite setAnchorPoint:ccp(0.5,0.5) ];//设置图片的锚点
//从新排列z轴顺序
[self reorderChild:sprite z:1];//从新排列z轴顺序
//更换精灵贴图
CCTexture2D * test=[[CCTextureCache sharedTextureCache] addImage:@"test.png"];//新建贴图
[sprite setTexture:test];
//更换精灵贴图,加载帧缓存,这个test.plist保存了fram这张图
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"test.plist"];
CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"fram.png"];
[sprite2 setDisplayFrame:frame];
//设置可视区域
CCSprite * sprite3 =[CCSprite spriteWithFile:@"icon.png" rect:CGRectMake(0, 0, 20,20)];//创建时设置
[sprite3 setTextureRect:CGRectMake(10, 10, 30, 30)];//创建后设置
//贴图无锯齿
[sprite3 .texture setAliasTexParameters];
浏览: 133394 次
来自: 北京
你好:第二部为什么我不到呢?我一开始下载错了安装也许也错了。2 ...
only1 写道兄弟,不错,还看文学的书,我都好久没看过这类的 ...
有些事是你经过了还知道的,比如你学习了ssh之类的,你还会知道 ...
我也是这么说,还特地买了个域名搞了个空间,但是没能坚持下来了。 ...下次自动登录
现在的位置:
& 综合 & 正文
cocos2d-x 中让精灵跟随触点移动
第一步,我们要在场景中创建一个新的精灵。
打开HelloWorldScene.h。我们为HelloWorld增加一个精灵类成员指针
所在的层中开启触屏响应。我们以HelloCpp为例,在HelloWorld的init函数中创建这个精灵。
第二步,我们要启用场景所属层CCLayer响应触点功能。
这一步是超级简单,只需要在创建精灵后加一行:
setTouchEnabled(true);
这个函数是CCLayer类开启触屏响应功能的开关。
第三步,为场景所属CCLayer增加相应的响应触点事件处理功能。
CCLayer层本身由CCTouchDelegate派生,CCTouchDelegate是触点消息响应接口类,它指定了CCLayer在响应触点事件时所触发的函数,其中单点触屏主要用于控件,如按钮,而多点触屏多用于场景。
代码分析:
看一下这些接口,如果我们需要增加相应的触屏事件处理,只需要在CCLayer的派生类中重载这些接口函数就OK了。
回到我们的HelloWorld场景,本节只需要用到移动跟随触屏位置,所以我们在其public部分增加函数重载:
virtualvoid ccTouchesBegan(CCSet*pTouches, CCEvent *pEvent);
并在Cpp中实现它:
运行一下,我们可以在按下鼠标时发现精灵始终跟随鼠标移动。
&&&&推荐文章:
【上篇】【下篇】Cocos2d-x触摸事件实例
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Cocos2d-x触摸事件实例,本文代码中包含大量注释来说明Cocos2d-x中的触摸事件使用示例,需要的朋友可以参考下
在玩手机游戏的时候,屏幕接收我们的触摸消息是必不可少的,根据我们的触摸事件,去实现相应的功能,这里我们就来学习一下cocos2d-x中的触摸是怎么实现的。触摸分为单点触摸和多点触摸,先来看单点触摸,就是接收一个点的触摸。代码将实现过程清楚的写了下来,仔细分析代码吧。
bool HelloWorld::init()
bool bRet =
CC_BREAK_IF(! CCLayer::init());
//开启触摸
this-&setTouchEnabled(true);
} while (0);
//开启触摸以后必须注册触摸事件,告诉引擎你支持单点触摸还是多点触摸
void HelloWorld::registerWithTouchDispatcher()
//addTargetedDelegate注册单点触摸,第一个参数代表为哪个对象注册触摸事件,第二个代表优先级,数字越
//小,优先级越高,第三个参数代表是否吞噬消息,如果为true这个节点接受了消息,处理后,优先级比它小的节点
//就接受不到消息了
CCDirector::sharedDirector()-&getTouchDispatcher()-&addTargetedDelegate(this,0,true);
//ccTouchBegan是必须要实现的函数,也是在四个协议方法中唯一一个返回值为bool类型的函数
//返回值是true的情况下,会接下来响应ccTouchMoved和ccTouchEnded和ccTouchCancelled函数。
//CCTouch中封装了关于触摸点的一些属性,例如坐标信息,CCEvent没有什么用
bool HelloWorld::ccTouchBegan(CCTouch * pTouch,CCEvent * pEvent)
//获得opengl坐标下的点坐标
CCPoint point = pTouch-&getLocation();
CCSprite * sprite = CCSprite::create("image.png");
this-&addChild(sprite);
sprite-&setPosition(point);
//当手指在屏幕上移动的时候不断调用的一个方法
void HelloWorld::ccTouchMoved(CCTouch * touch,CCEvent * pEvent)
//获得opengl坐标下的点坐标
CCPoint point = touch-&getLocation();
CCSprite * sprite = CCSprite::create("image.png");
this-&addChild(sprite);
sprite-&setPosition(point);
//当手指抬起来的时候会调用的方法
void HelloWorld::ccTouchEnded(CCTouch * pTouch,CCEvent * pEvent)
this-&removeAllChildrenWithCleanup(true);
//还有一个ccTouchCancelled函数,在取消触摸事件的时候调用,比如我们在触屏的时候突然打来了电话
接下来用我们刚刚学到的知识,来实现拖拽精灵移动的效果。
bool HelloWorld::init()
bool bRet =
CC_BREAK_IF(! CCLayer::init());
//实现拖拽精灵移动的效果
CCSprite * sprite = CCSprite::create("image2.png");
sprite-&setPosition(ccp(240,180));
this-&addChild(sprite,0,0);
//开启触摸
this-&setTouchEnabled(true);
} while (0);
//开启触摸以后必须注册触摸事件,告诉引擎你支持单点触摸还是多点触摸
void HelloWorld::registerWithTouchDispatcher()
//addTargetedDelegate注册单点触摸,第一个参数代表为哪个对象注册触摸事件,第二个代表优先级,数字越
//小,优先级越高,第三个参数代表是否吞噬消息,如果为true这个节点接受了消息,处理后,优先级比它小的节点
//就接受不到消息了
CCDirector::sharedDirector()-&getTouchDispatcher()-&addTargetedDelegate(this,0,true);
bool HelloWorld::ccTouchBegan(CCTouch * touch,CCEvent * pEvent)
CCSprite * sprite = (CCSprite *)this-&getChildByTag(0);
//获得手指点击的点的坐标
CCPoint point = touch-&getLocation();
//获得精灵所在的区域,CCRect包括x,y,width,height
CCRect rect = sprite-&boundingBox();
//判断手指点击的点是否点在了精灵上
if(rect.containsPoint(point))
//返回true则会接受其他的协议消息
void HelloWorld::ccTouchMoved(CCTouch * touch,CCEvent * pEvent)
这里可以直接将精灵的坐标设置为手指所在点的坐标位置,但是这样的话会产生跳跃的效果,视觉上不好看,这是
因为精灵是在用自己的锚点占据我们设置的坐标位置,而不是我们点击在精灵身上的那个点放到我们的手指所在的位置
//分别获得了手指现在的点击点和手指上次的点击点位置
CCPoint point = touch-&getLocation();
CCPoint pointPre = touch-&getPreviousLocation();
//ccpSub将俩个点相减,获得一个移动方向的向量
CCPoint direction = ccpSub(point,pointPre);
CCSprite * sprite = (CCSprite *)this-&getChildByTag(0);
CCPoint spritePoint = sprite-&getPosition();
//ccpAdd将精灵现在的位置点和移动方向的向量相加,获得精灵将要移动到的位置点
CCPoint spriteDirection = ccpAdd(spritePoint,direction);
sprite-&setPosition(spriteDirection);
接下来学习多点触摸,多点触摸和单点触摸不同的是它的优先级要低于单点触摸,不论注册的时候里边传入的数字是多少,当然还有其它的一些区别,让我们看代码吧。以下是在windows上演示的效果,windows上没法实现多点触摸。
bool HelloWorld::init()
bool bRet =
CC_BREAK_IF(! CCLayer::init());
//实现拖拽精灵移动的效果
CCSprite * sprite = CCSprite::create("image2.png");
sprite-&setPosition(ccp(240,180));
this-&addChild(sprite,0,0);
//开启触摸
this-&setTouchEnabled(true);
} while (0);
void HelloWorld::registerWithTouchDispatcher()
//注册多点触摸,里边只有俩个参数
CCDirector::sharedDirector()-&getTouchDispatcher()-&addStandardDelegate(this,0);
//在多点触摸中,这四个协议函数在touch后边都加了es,并且每个协议函数不需要都实现,所有的返回值都是void
//CCSet是CCTouch的集合
void HelloWorld::ccTouchesBegan(CCSet * set,CCEvent * pEvent)
//CCSetIterator是一个迭代器
//以下的方法就是从CCSet中获得对象的方法
for(iterator = set-&begin();iterator != set-&end();iterator++)
//将元素强制转化为CCTouch *类型
CCTouch * touch = (CCTouch *)(*iterator);
CCPoint point = touch-&getLocation();
CCSprite * sprite = CCSprite::create("image.png");
sprite-&setPosition(point);
this-&addChild(sprite);
接下来利用上边的多点触摸消息实现精灵的放大和缩放效果,大家看到的相册图片放大和缩小的效果也是这么实现的,但是windows不支持多点,所以这里只是说明原理。
查看源代码打印帮助
bool HelloWorld::init()
bool bRet =
CC_BREAK_IF(! CCLayer::init());
//实现拖拽精灵移动的效果
CCSprite * sprite = CCSprite::create("image2.png");
sprite-&setPosition(ccp(240,180));
this-&addChild(sprite,0,0);
//开启触摸
this-&setTouchEnabled(true);
} while (0);
void HelloWorld::registerWithTouchDispatcher()
//注册多点触摸,里边只有俩个参数
CCDirector::sharedDirector()-&getTouchDispatcher()-&addStandardDelegate(this,0);
void HelloWorld::ccTouchesBegan(CCSet * set,CCEvent * pEvent)
CCSetIterator iterator = set-&begin();
//获得第一个触摸点
CCTouch * touch0 = (CCTouch *)(*iterator);
iterator++;
//程序执行到这里会死掉,因为windows只支持单点触摸,不支持多点,所以这里是不会获得第二个点的
CCTouch * touch1 = (CCTouch *)(*iterator);
length = ccpDistance(touch0-&getLocation(),touch1-&getLocation());
void HelloWorld::ccTouchesMoved(CCSet * set,CCEvent * pEvent)
CCSetIterator iterator = set-&begin();
CCTouch * touch0 = (CCTouch *)(*iterator);
iterator++;
CCTouch * touch1 = (CCTouch *)(*iterator);
float length2 = ccpDistance(touch0-&getLocation(),touch1-&getLocation());
float times = length2/
CCSprite * sprite = (CCSprite *)this-&getChildByTag(0);
sprite-&setScale(times);
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 触摸精灵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信