cocos2d-x3.2 多点缩放单点滑动

cocos2d-x3.2 多点缩放单点滑动,第1张

概述#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"USING_NS_CC;class HelloWorld : public cocos2d::Layer{public: // there's no 'id' in cpp, so we recommend retu
#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"USING_NS_CC;class HelloWorld : public cocos2d::Layer{public:    // there's no 'ID' in cpp,so we recommend returning the class instance pointer    static cocos2d::Scene* createScene();    virtual bool init();        // implement the "static create()" method manually    CREATE_FUNC(HelloWorld);    voID ontouchesBegan(const std::vector<cocos2d::touch*>& touches,cocos2d::Event* event);    voID ontouchesMoved(const std::vector<cocos2d::touch*>& touches,cocos2d::Event* event);        Sprite* bgSprite;    Vec2 bgOrigin;    Layer* mapLayer;    };#endif // __HELLOWORLD_SCENE_H__


HelloWorld.cpp

#include "HelloWorldScene.h"USING_NS_CC;Scene* HelloWorld::createScene(){    // 'scene' is an autorelease object    auto scene = Scene::create();        // 'layer' is an autorelease object    auto layer = HelloWorld::create();    // add layer as a child to scene    scene->addChild(layer);    // return the scene    return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){    //////////////////////////////    // 1. super init first    if ( !Layer::init() )    {        return false;    }        /////////////////////////////    mapLayer = Layer::create();    this->addChild(mapLayer,-1);        bgSprite = Sprite::create("2.jpg");    bgSprite->setAnchorPoint(Vec2::ZERO);    bgSprite->setposition(Vec2::ZERO),bgOrigin = Vec2(Vec2::ZERO);    mapLayer->addChild(bgSprite);        auto treeSprite = Sprite::create("1.png");    treeSprite->setAnchorPoint(Vec2::ZERO);    treeSprite->setposition(Vec2::ZERO),treeSprite->setScale(2);    bgSprite->addChild(treeSprite,2);        auto map = TMXTiledMap::create("mymap4.tmx");    map->setAnchorPoint(Vec2::ZERO);    map->setposition(Vec2::ZERO),bgSprite->addChild(map,1);        auto Listener = EventListenertouchAllAtOnce::create();    Listener->ontouchesBegan = CC_CALLBACK_2(HelloWorld::ontouchesBegan,this);    Listener->ontouchesMoved = CC_CALLBACK_2(HelloWorld::ontouchesMoved,this);    _eventdispatcher->addEventListenerWithSceneGraPHPriority(Listener,bgSprite);        return true;}voID HelloWorld::ontouchesBegan(const std::vector<cocos2d::touch*>& touches,cocos2d::Event* event){    cclOG("touch begin");}voID HelloWorld::ontouchesMoved(const std::vector<cocos2d::touch*>& touches,cocos2d::Event* event){    cclOG("touch moved");        auto winSize = Director::getInstance()->getWinSize();    if(touches.size() > 1)        // 多点进行缩放    {        cclOG("多点缩放");        // 得到当前两触摸点        auto point1 = touches[0]->getLocation();        auto point2 = touches[1]->getLocation();        // 计算两点之间得距离        auto currdistance = point1.distance(point2);        // 计算两触摸点上一时刻之间得距离        auto prevdistance = touches[0]->getPrevIoUsLocation().distance(touches[1]->getPrevIoUsLocation());        // 两触摸点与原点的差向量,pointVec1和pointVec2是相对于bgSprite的位置        auto pointVec1 = point1  - bgOrigin;        auto pointVec2 = point2  - bgOrigin;        // 两触摸点的相对中点        auto relMIDx = (pointVec1.x + pointVec2.x) / 2 ;        auto relMIDy = (pointVec1.y + pointVec2.y) / 2 ;        // 计算bgSprite的锚点        auto anchorX = relMIDx / bgSprite->getBoundingBox().size.wIDth;        auto anchorY = relMIDy / bgSprite->getBoundingBox().size.height;        // 相对屏幕的中点        auto absMIDx = (point2.x + point1.x) / 2 ;        auto absMIDy = (point2.y + point1.y) / 2 ;                // 缩放时,为了避免出现空白的区域,需要做以下的边界处理。        // 当bgSprite快要进入到屏幕时,修改bgSprite的位置(既absMIDx和absMIDy)。        if(  bgOrigin.x > 0)        {            absMIDx -= bgOrigin.x;        }        if( bgOrigin.x < -bgSprite->getBoundingBox().size.wIDth + winSize.wIDth )        {            absMIDx +=  -bgSprite->getBoundingBox().size.wIDth + winSize.wIDth - bgOrigin.x;        }        if( bgOrigin.y > 0 )        {            absMIDy -= bgOrigin.y;        }        if( bgOrigin.y < -bgSprite->getBoundingBox().size.height + winSize.height )        {            absMIDy +=  -bgSprite->getBoundingBox().size.height + winSize.height - bgOrigin.y;        }        // 重设bgSprite锚点和位置        bgSprite->setAnchorPoint(Vec2(anchorX,anchorY));        bgSprite->setposition(Vec2(absMIDx,absMIDy));        // 根据两触摸点前后的距离计算缩放倍率        auto scale = bgSprite->getScale() * ( currdistance / prevdistance);        // 控制缩放倍率在1~4倍之间,最小倍率不能太小,不让背景将不能填充满整个屏幕。        scale = MIN(4,MAX(1,scale));        bgSprite->setScale(scale);        // 更新原点位置        bgOrigin = Vec2(absMIDx,absMIDy) - Vec2(bgSprite->getBoundingBox().size.wIDth * anchorX,bgSprite->getBoundingBox().size.height * anchorY) ;    }    else if(touches.size() == 1)        // 单点进行移动    {        cclOG("单点移动");        // 单点时,touches中只有一个touch对象,所以通过touches[0]就可以得到触摸对象        auto touch = touches[0];        // 计算滑动过程中的滑动增量        auto diff = touch->getDelta();        // 得到当前bgSprite的位置        auto currentPos = bgSprite->getposition();        // 得到滑动后bgSprite应该所在的位置        auto pos = currentPos + diff;        // 得到此刻bgSprite的尺寸        auto bgSpriteCurrSize = bgSprite->getBoundingBox().size;                //边界控制,约束pos的位置        pos.x = MIN(pos.x,bgSpriteCurrSize.wIDth * bgSprite->getAnchorPoint().x);        pos.x = MAX(pos.x,-bgSpriteCurrSize.wIDth + winSize.wIDth + bgSpriteCurrSize.wIDth * bgSprite->getAnchorPoint().x);        pos.y = MIN(pos.y,bgSpriteCurrSize.height * bgSprite->getAnchorPoint().y);        pos.y = MAX(pos.y,-bgSpriteCurrSize.height + winSize.height + bgSpriteCurrSize.height * bgSprite->getAnchorPoint().y);        // 重设bgSprite位置        bgSprite->setposition(pos);                // 更新原点位置        if( pos.x >= bgSpriteCurrSize.wIDth * bgSprite->getAnchorPoint().x           || pos.x <= -bgSpriteCurrSize.wIDth + winSize.wIDth + bgSpriteCurrSize.wIDth * bgSprite->getAnchorPoint().x)        {            diff.x = 0;        }        if( pos.y >= bgSpriteCurrSize.height * bgSprite->getAnchorPoint().y           || pos.y <= -bgSpriteCurrSize.height + winSize.height + bgSpriteCurrSize.height * bgSprite->getAnchorPoint().y)        {            diff.y = 0;        }        bgOrigin += diff;    }}
总结

以上是内存溢出为你收集整理的cocos2d-x3.2 多点缩放单点滑动全部内容,希望文章能够帮你解决cocos2d-x3.2 多点缩放单点滑动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1004000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存