Cocos2d-x 单点触摸--让我们用手指动起来的精灵

转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/25656673

效果图:

CCTouch类装载了触摸点的信息。包含触摸点的横纵坐标值和触摸点的ID号,如获取触摸点转GL坐标:

	CCPoint point = pTouch->getLocationInView();
	point = CCDirector::sharedDirector()->convertToGL(point);

创建触摸事件流程:首先开启setTouchEnabled(true), 然后重写registerWithTouchDispatcher调用触摸代理函数addTargetedDelegate同意布景层接收触摸事件,再重写ccTouchBegan、ccTouchMoved、ccTouchEnded、ccTouchCancelled函数

程序代码:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback));

	pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
                                origin.y + pCloseItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu, 1);

	setTouchEnabled(true);
	sp1 = CCSprite::create("cpp1.png");
	sp1->setScale(0.5f);
	sp1->setPosition(ccp(100, 200));
	this->addChild(sp1);

    return true;
}

//触摸移动
void HelloWorld::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
	if (iscontrol)
	{
		CCPoint location = touch->getLocationInView();
		location = CCDirector::sharedDirector()->convertToGL(location);
		CCLOG("ccTouchMoved...x:%f y:%f", location.x, location.y);

		//移动时又一次设置sprite坐标
		float x = location.x-deltax;
		float y = location.y-deltay;
		sp1->setPosition(ccp(x, y));
	}

}

//触摸開始点击,计算该点坐标与sprite坐标差值
bool HelloWorld::ccTouchBegan(CCTouch* touch, CCEvent* event)
{

	CCPoint pos = sp1->getPosition();
	CCPoint location = touch->getLocationInView();
	location = CCDirector::sharedDirector()->convertToGL(location);//openGL
	CCLOG("ccTouchBegan...x:%f y:%f", location.x, location.y);

	if (location.x > 0 && location.x <960 &&
		location.y >0 && location.y < 640)//触摸的矩形区域
	{
		iscontrol = true;
		//计算触摸点与sprite的坐标差值
		deltax = location.x-pos.x;
		deltay = location.y-pos.y;
	}

	return true;

}
//触摸结束
void HelloWorld::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
	CCLOG("ccTouchEnded...");
	//iscontrol = false;

}

//注冊触摸事件
void HelloWorld::onEnter()
{
	CCDirector* pDirector = CCDirector::sharedDirector();
	pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
	CCLayer::onEnter();
}

void HelloWorld::onExit()
{
	CCDirector* pDirector = CCDirector::sharedDirector();
	pDirector->getTouchDispatcher()->removeDelegate(this);
	CCLayer::onExit();
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-05 13:35:02

Cocos2d-x 单点触摸--让我们用手指动起来的精灵的相关文章

Quick cocos2dx-Lua(V3.3R1)学习笔记(九) ---- 事件篇之单点触摸事件,让我们用精灵模仿一个按钮吧

本篇就开始讲单点触摸事件,我们在前面用UIPushButton做菜单那篇,就用了触摸事件,只不过我们感觉不出来,我们基本不需要分析触摸消息.这篇我们用一个精灵模仿出按钮效果,加强理解 至于原理,廖大在文档中讲的很清楚,就不赘叙了. Quick的触摸机制(点我点我(*^__^*)) 一般,我们按按钮的时候,总会发现,按钮按下去,按钮会缩小,松开,按钮会恢复原来的大小. function MyScene:ctor() local sprite = display.newSprite("Hello.p

Cocos2d-x 3.0 中使用单点触摸

Cocos2d-x 3.0 中使用单点触摸 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2712 在游戏中,经常会用到触摸,大部分游戏也是通过触摸控制游戏角色运动的,在Cocos2d-x 3.0中使用了新的触摸机制,Cocos2d-x 3.0中摒弃了Cocos2d-x 2.0中将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应,在Cocos2d-x 3.0中只需通过创建一个

registerWithTouchDispatcher 注册单点触摸事件

Doc: If isTouchEnabled, this method is called onEnter. Override it to change the way CCLayer receives touch events. Default: CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this,0); Example: void CCLayer::registerWithTouchDispatcher() { CC

Cocos2d-X3.4中使用单点触摸

在游戏中,经常会用到触摸,大部分游戏也是通过触摸控制游戏角色运动的,在Cocos2d-X3.0中使用了新的触摸机制,Cocos2d-X3.0中摒弃了Cocos2d-X2.0中将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应,在Cocos2d-X3.0中只需通过创建一个事件监听器-用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理,即可完成事件响应. 上面的

5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬

 1 触摸 Coco2dx默认仅仅有CCLayer及其派生类才有触摸的功能. 2 单点触摸 打开触摸开关和触摸方式 setTouchEnabled(true); setTouchMode(kCCTouchesOneByOne); Cocos2dx 对触摸分三布来处理.分是是点触.移动.离开. 或是中间被打断. 其功能皆有对应的virtual 函数进行override 的. virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);

cocos2dx触屏响应(单点触摸)CCTouchBegan,CCTouchMove,CCTouchEnd

今天白白跟大家分享一下cocos2dx单点触摸经验. cocos2dx触摸CCTouch类的单点触摸有四个函数CCTouchBegan,CCTouchMove,CCTouchEnd,CCTouchCancalled. 这些触摸的函数不一定每一个都要响应,可是CCTouchBegan是一定要有的,他的返回值是bool,其他函数返回值为void 以下我们看看怎样触摸: 首先我们新建一个项目Hello 1.在源文件Hello.h声明函数 void registerWithTouchDispatcher

Cocos2d-x实例:单点触摸事件

addChild(boxC,30, kBoxC_Tag);                                                                                         ⑥ returntrue; } 我们在HelloWorld::init()函数中初始化了场景中的背景和三个方块精灵.代码第①~④行是创建并添加背景,图8-3所示的背景是由一个128x128纹理图片(BackgroundTile.png)反复贴图上,这样可以减少内存

cocos2d-x-3.x 触摸反馈(1)单点触摸

单点触摸就是在同一时间只支持一个点的触摸反馈. 1 bool HelloWorld::init() 2 { 3 if ( !Layer::init()) 4 { 5 return false; 6 } 7 Size size = Director::getInstance()->getVisibleSize(); //获取有效长度 8 auto label = LabelTTF::create("Click me", "Courier", 30); //输入文

android开发之单点触摸

相对于多点触摸,单点触摸还是很简单的. 新建一个工程,先看看布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="