9. Cocos2d-x 游戏编程 之 多点触碰

上一篇内容讲了 单点触碰,然后这篇接着讲 多点触碰。多点触碰就是说,多个手指同时在屏幕上操作,然后触发监听器,回调方法实现功能而已。

1、先了解这个代码如何在手机上调试。因为这个是关乎到多个手指触碰才能触发的监听器,所以说,在模拟器上实现不了手指的触碰。必须在真机上跑才行。

其实很简单,只要在项目中的 ios 这个文件夹中的 AppController.mm 文件里边的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions { } 方法内 补上一句 [eaglView setMultipleTouchEnabled:YES]; 就行了,详细请看图:

2、然后,我们就要上代码了,很简单的,只不过是在单点触碰的基础上把 onTouchBegan 等这些个单词变成复数 onTouchesBegan 等词而已,上过英语课的都懂。

代码(Firth.h):

#include "cocos2d.h"

USING_NS_CC;

class FirthTest : public cocos2d::Layer
{
/* TouchAllAtOnce */
private:
    double _distance;   //两个触摸点之间的距离
    double _deltax;     //x 轴的改变值
    double _deltay;     //y 轴的改变值
    Sprite *_bgSprite;  //精灵
    double _mscale;     //缩放比例
public:
    static cocos2d::Scene* createScene();

    virtual bool init();

    /* TouchAllAtOnce */
    void onTouchesBegan(const std::vector<Touch *> &touches, cocos2d::Event *event);
    void onTouchesMoved(const std::vector<Touch *> &touches, cocos2d::Event *event);
    void onTouchesEnded(const std::vector<Touch *> &touches, cocos2d::Event *event);
    void onTouchesCancelled(const std::vector<Touch *> &touches, cocos2d::Event *event);

    void menuCloseCallback(cocos2d::Ref* pSender);

    void scale9();

    CREATE_FUNC(FirthTest);
};
#endif /* defined(__HelloWorld__Fireth__) */

(Firth.cpp)

USING_NS_CC;

Scene* FirthTest::createScene()
{
    auto scene = Scene::create();
    auto layer = FirthTest::create();
    scene->addChild(layer);
    return scene;
}

bool FirthTest::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    /**
     *  获得可见OpenGL视图大小
     */
    Size size = Director::getInstance()->getVisibleSize();

    /**
     *  获得可见OpenGL视图起始点(0,0)
     */
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /**
     *  创建菜单项
     */
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(FirthTest::menuCloseCallback, this));

    closeItem->setPosition(Vec2(origin.x + size.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 title = Label::createWithSystemFont("多点触碰", "", 50);
    title->setPosition(size.width / 2 , size.height * 0.9);
    this->addChild(title);

    /**
     *  创建一个精灵
     */
    _bgSprite = Sprite::create("HelloWorld.png");
    _bgSprite->setPosition(Vec2(size.width / 2 + origin.x , size.height / 2 + origin.y));
    this->addChild(_bgSprite , 0);

    _mscale = 1.0;

    /**
     *  创建多点触碰监听器
     */
    auto listener = EventListenerTouchAllAtOnce::create();

    listener->onTouchesBegan = CC_CALLBACK_2(FirthTest::onTouchesBegan, this);
    listener->onTouchesMoved = CC_CALLBACK_2(FirthTest::onTouchesMoved, this);
    listener->onTouchesEnded = CC_CALLBACK_2(FirthTest::onTouchesMoved, this);
    listener->onTouchesCancelled = CC_CALLBACK_2(FirthTest::onTouchesMoved, this);

    /**
     *  注册监听事件
     */
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

    return true;
}
void FirthTest::onTouchesBegan(const std::vector<Touch *> &touches, cocos2d::Event *event)
{
    if (touches.size() >= 2) {

        //获取第一个点
        auto touch1 = touches.at(0);

        Vec2 myPoint1 = touch1->getLocation();

        //获取第二个点
        auto touch2 = touches.at(1);

        Vec2 myPoint2 = touch2->getLocation();

        /**
         *  勾股定理,算出两点距离
         */
        _distance = sqrt((myPoint2.x - myPoint1.x) * (myPoint2.x - myPoint1.x) +
                         (myPoint2.x - myPoint1.x) * (myPoint2.y - myPoint1.y));

    }
}

void FirthTest::onTouchesMoved(const std::vector<Touch *> &touches, cocos2d::Event *event)
{
    if (touches.size() >= 2) {
        //获取第一个点
        auto touch1 = touches.at(0);

        Vec2 myPoint1 = touch1->getLocation();

        //获取第二个点
        auto touch2 = touches.at(1);

        Vec2 myPoint2 = touch2->getLocation();

        /**
         *  勾股定理,算出两点距离
         */
        double mdistance = sqrt((myPoint2.x - myPoint1.x) * (myPoint2.x - myPoint1.x) +
                         (myPoint2.x - myPoint1.x) * (myPoint2.y - myPoint1.y));
        <span class="s1" style="font-family: Arial, Helvetica, sans-serif;">// </span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;">新的距离</span><span class="s1" style="font-family: Arial, Helvetica, sans-serif;">/</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;">老的距离</span><span class="s1" style="font-family: Arial, Helvetica, sans-serif;">*</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;">原来的缩放比例,即为新的缩放比例</span>
        _mscale = mdistance / _distance * _mscale;

        _distance = mdistance;
        //设置新的比例
        _bgSprite->setScale(_mscale);
    }
}
void FirthTest::onTouchesEnded(const std::vector<Touch *> &touches, cocos2d::Event *event)
{}
void FirthTest::onTouchesCancelled(const std::vector<Touch *> &touches, cocos2d::Event *event)
{}

void FirthTest::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
}

其实代码没有难度,就看注释吧,挺详细的了。

第九章,结束!

本篇内容属原创,转载请注明出处,禁止用于商业用途。谢谢!

时间: 2024-10-14 00:07:53

9. Cocos2d-x 游戏编程 之 多点触碰的相关文章

unity3D实现多点触碰

实现多点触碰是利用input这个类里面的方法实现的. 从edit-project settings-input就可以看到input能够得到的轴. 想要读取轴向可以使用Input.GetAxis方法获取下列默认轴: "Horizontal" 和"Vertical" 映射于控制杆.A.W.S.D和箭头键(方向键). "Mouse X" 和"Mouse Y" 映射于鼠标,"Fire1", "Fire2&

Android基础入门教程——3.4 TouchListener PK OnTouchEvent + 多点触碰

Android基础入门教程--3.4 TouchListener PK OnTouchEvent + 多点触碰 标签(空格分隔): Android基础入门教程 本节引言: 如题,本节给大家带来的是TouchListener与OnTouchEvent的比较,以及多点触碰的知识点! TouchListener是基于监听的,而OnTouchEvent则是基于回调的!下面通过两个简单的例子来加深 大家的理解! 1.基于监听的TouchListener 代码示例: 实现效果图: 实现代码: main.xm

cocos2d-x之多点触碰初试

bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); auto listener=EventListenerTouchAllAtOnce::create(); listener->onTouchesBegan=[](std::vector<Touch*> ts,Event *e){

多点触碰实现图片的放大缩小

MainActivity package com.ce.duodian; import com.ce.view.MyView; import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.Menu; public class MainActivity extends Acti

自定义圆形图片实现多点触控放大缩小和拖动

自定义imageview package com.bwie.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import androi

Cocos2dx 多点触控

1 最容易忽略的东西,对于ios平台,须得设置glView的属性: [__glView setMultipleTouchEnabled:YES]; 2 如果调用CCLayer的方法setTouchEnabled,则不需要手动加touchDelegate,因为这个函数里会自动做这些事情. 3 如果调用CCLayer的方法setTouchEnabled,之前可以调用一个设置多点或单点的函数来控制setTouchEnable的注册行为,这个函数是: setTouchMode 4 也可以直接调用 coc

Cocos2d-x3.2 多点触控

//GameScene.h #include "cocos2d.h" USING_NS_CC; class GameScene : public cocos2d::Layer { public:     static cocos2d::Scene* createScene();          virtual bool init();          virtual void onTouchesBegan(const std::vector<Touch*>& t

【读书笔记-《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)

3.1 Button Button这控件不用多说,就是一个按钮,主要是点击后进行相应事件的响应. 给组件添加ID属性:定义格式为 android:id="@+id/name",这里的name是自定义的,不是索引变量."@+"表示新声明,"@"表示引用,例如:"@+id/tv" 表示新声明一个id,是id名为tv的组件:"@id/tv" 表示引用id名为tv的组件. 给按钮添加点击事件响应  想知道按钮是否被

【原】cocos2d-x开发笔记:多点触控

在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图 在实现这个功能的时候,需要使用到cocos2d-x的多点触控功能. 多点触控事件,并不是说你按下了两个手指,执行ccTouchesMoved的时候,pTouches的count为2,这样如果单纯的判断函数传入的参数,实现起来会比较困难. 我用一种方式实现了,感觉还是比较简单明了的,拿出来分享一下 cocos2d-x版本:cocos2d-x 2.2.0 目标平台:ios 1.首先在App