zoukankan      html  css  js  c++  java
  • 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();
    }



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

  • 相关阅读:
    最大回文子串
    求数组中的最大连续子序列和
    如何在10亿数中找出前1000大的数
    给定一个字符串,最多删除一个字符,判断能够构成回文字符串
    HashMap(数组+链表+红黑树)、HashTable、TreeMap
    【转】jmeter如何设置登录接口只调用一次以及遇到的问题:cookie参数放在消息头headers里面
    Kafka命令行操作
    git上无法push代码解决办法
    【转】Jenkins集成Docker镜像实现自动发布
    awk命令总结
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4619683.html
Copyright © 2011-2022 走看看