文档章节

cocos2dx 放大镜实现思路(带实现代码1)

y
 yizhangxyz
发布于 2016/04/01 15:44
字数 535
阅读 81
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

总体思路是

先对当前屏幕截屏,然后利用clippingnode 对截屏进行显示,同时对截屏进行放大达到放大镜的效果

实现细节如下:

1 利用renderTexture对屏幕进行截图

2 创建一个放大镜类,该类包含一个clippingnode,clippingnode的显示区域为放大镜的镜头区域。将屏幕截图作为child添加到clippingnode里面。通过镜头区域的移动来控制内容的显示

3 为放大镜类添加一个放大镜的手柄,移动手柄来控制clippingnode显示区域的移动。

4 注意放大镜的中心点在屏幕中的位置(百分比),通过该位置来决定屏幕截图的注册点。可以先将屏幕截图的注册点修改后,再将截图正中显示,再缩放。注册点改变后,显示坐标不变的方法是: 

之前坐标是 (x1,y1) 之前注册点是 anchpoint1,新设置的注册点是 anchpoint2

那么之后坐标为 

x2  = x1 +(anchpoint2.x - anchpoint1.x) * width

y2  = y1 +(anchpoint2.y - anchpoint1.y) * height

实现代码如下:

#ifndef __STTouchableSprite__

#define __STTouchableSprite__


#include "cocos2d.h"

#include "STMacro.h"


NS_ST_BEGIN


class STTouchableSprite : public cocos2d::Sprite

{

    cocos2d::EventListenerTouchOneByOne *m_pListener;

    

public:

    

    static STTouchableSprite * create();

    

    static STTouchableSprite* create(const std::string& filename);

    

    static STTouchableSprite* createWithSpriteFrame(cocos2d::SpriteFrame *spriteFrame);

    

    static STTouchableSprite* createWithSpriteFrameName(const std::string& spriteFrameName);

    

    void setTouchEnable(std::function<bool(cocos2d::Touch*, cocos2d::Event*)> began,

                        std::function<void(cocos2d::Touch*, cocos2d::Event*)> moved = nullptr,

                        std::function<void(cocos2d::Touch*, cocos2d::Event*)> ended = nullptr,

                        std::function<void(cocos2d::Touch*, cocos2d::Event*)> cancelled = nullptr);

    

    void setTouchDisable();

    

protected:

    

    STTouchableSprite();

    

    virtual ~STTouchableSprite();

};


NS_ST_END


#endif


#include "STTouchableSprite.h"



USING_NS_CC;

USING_NS_ST;

using namespace std;



STTouchableSprite * STTouchableSprite::create()

{

    auto sprite = new (std::nothrow) STTouchableSprite();

    if ( sprite && sprite->init() )

    {

        sprite->autorelease();

        return sprite;

    }

    

    CC_SAFE_DELETE(sprite);

    return nullptr;

}


STTouchableSprite *STTouchableSprite::create(const std::string& filename)

{

    STTouchableSprite *sprite = new (std::nothrow) STTouchableSprite();

    if (sprite && sprite->initWithFile(filename))

    {

        sprite->autorelease();

        return sprite;

    }

    CC_SAFE_DELETE(sprite);

    return nullptr;

}


STTouchableSprite *STTouchableSprite::createWithSpriteFrame(cocos2d::SpriteFrame *spriteFrame)

{

    STTouchableSprite *sprite = new (std::nothrow) STTouchableSprite();

    if (sprite && spriteFrame && sprite->initWithSpriteFrame(spriteFrame))

    {

        sprite->autorelease();

        return sprite;

    }

    CC_SAFE_DELETE(sprite);

    return nullptr;

}


STTouchableSprite *STTouchableSprite::createWithSpriteFrameName(const std::string& spriteFrameName)

{

    SpriteFrame *frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(spriteFrameName);

    

    return createWithSpriteFrame(frame);

}



STTouchableSprite::STTouchableSprite()

: m_pListener(nullptr)

{

    

}


STTouchableSprite::~STTouchableSprite()

{

    

}


void STTouchableSprite::setTouchEnable(function<bool(Touch*, Event*)> began,

                                       function<void(Touch*, Event*)> moved,

                                       function<void(Touch*, Event*)> ended,

                                       function<void(Touch*, Event*)> cancelled)

{

    m_pListener = EventListenerTouchOneByOne::create();

    

    m_pListener->setSwallowTouches(true);

    

    m_pListener->onTouchBegan = began;

    m_pListener->onTouchMoved = moved;

    m_pListener->onTouchEnded = ended;

    m_pListener->onTouchCancelled = cancelled;

    

    _eventDispatcher->addEventListenerWithSceneGraphPriority(m_pListener, this);

}


void STTouchableSprite::setTouchDisable()

{

    if (m_pListener)

        _eventDispatcher->removeEventListener(m_pListener);

}




© 著作权归作者所有

下一篇: c++ 友元函数
y
粉丝 2
博文 67
码字总数 42366
作品 0
成都
私信 提问
【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/653.html 本篇跟大家分享下Cocos2dX中的存储,其中也...

迷途d书童
2012/03/19
610
0
杨超 (wantnon)/EffectNodes-for-Cocos2dx

EffectNodes for Cocos2dx by yang chao (wantnon), 2014-6-26 EffectNodes for Cocos2dx is a collection of 2d special effects implemented with cocos2dx. i will add more when i got g......

杨超 (wantnon)
2018/05/09
0
0
Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上

感谢听D同学赞助的Demo。 那怎样让它运行在vs中呢: 1 使用cocos2d-x-2.2toolsproject-creator文件夹中的create_project.py脚本,生成一个demo。 2 拷贝Classes和Resources文件夹到刚生成的d...

懒骨头
2013/12/09
1K
0
【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造

继续上一篇 【cocos2dx进阶】调试篇(1)基础介绍 的内容,这次主要讲下对于Cocos2dx的一些小改造。 先说Cocosdx关于调试的一些设计。主要包括2块内容,一个是log输出,一个是节点信息的反馈...

kingzeus
2018/06/28
0
0
C++与java混合编写和C++与OC混合编写 笔记

1、Java与C++混合编写: 使用JNI(Java本地调用) 实例:cocos2dx/platform/android/jni对应目录cocos2dx/platform/android/java const char getConstStrRetuen(const char funcName){ JniMeth......

悠米海
2014/06/12
797
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis面试题详解:哨兵+复制+事务+集群+持久化等

Redis主要有哪些功能? 1.哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 Sentinel...

Java阿七
3分钟前
0
0
响应国家号召 1+X 证书 Web 前端开发考试模拟题

官方QQ群:736413913 1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http://blog.zh66.club/index.php/...

张帅个人博客
7分钟前
2
0
如何检查一个字符串在Objective-C中是否包含另一个字符串?

如何检查字符串( NSString )是否包含另一个较小的字符串? 我希望有这样的东西: NSString *string = @"hello bla bla";NSLog(@"%d",[string containsSubstring:@"hello"]); 但是我能找到......

javail
25分钟前
2
0
.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏

目 录 1. 概述... 2 2. 演示信息... 2 3. 简单介绍... 3 4. 产品特点... 4 5. 价值体现... 5 1. 概述 经过一段时间的努力,iNeuDA产品组件已经开发和测试完成,现在正式上线。现在iNeuOS工业...

wxzz
27分钟前
2
0
在每个GROUP BY组中选择第一行?

顾名思义,我想选择以GROUP BY分组的每组行的第一行。 具体来说,如果我有一个如下的purchases表: SELECT * FROM purchases; 我的输出: id | customer | total---+----------+------ 1...

技术盛宴
40分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部