cocos2d-x 图片平移缩放组件

最近需要实现游戏地图的平移缩放功能,想到这是一个常用的功能,应该有现成的组件,可是到处找也没找到合适完美的实现,干脆自己写一个,经过一些测试没有问题,共享出来,有什么问题欢迎大家提出来继续完善。基于cocos2d-x 3.7.1,ide为vs2013。

使用方法:

PanZoomController panzoom;

panzoom.start(your node or layer or sprite);


PanZoomController.h

#ifndef __PAN_ZOOM_CONTROLLER_H__
#define __PAN_ZOOM_CONTROLLER_H__

#include "cocos2d.h"

USING_NS_CC;

// 当前拖动或缩放状态
enum PanZoomState
{
	None, // 无状态
	Pan, // 拖动平移
	Zoom, // 缩放
	Rebound // 弹回动画中
};

/**
 * 触控平移缩放操作控件
 */
class PanZoomController : public Ref
{
public:
	PanZoomController();
	
	~PanZoomController();
	
	/**
	 * @param node 要控制的节点
	 * @param enableRebound 是否启用拖动到边缘时的弹回效果
	 */
	void start(Node* node, bool enableRebound = false);
	
protected:
	// 要控制的节点
	Node* _node;

	// 一次连续缩放操作是否初始化
	bool _scaleInited = false;

	// 拖动到边缘时允许的黑边宽度 单位 像素点
	float _blackBorder = 50.0f;

	// 回弹动画播放时间 单位 秒
	float _reboundTime = 0.2f;

	// 当前拖动或缩放状态
	PanZoomState _state = PanZoomState::None;

	// 是否启用拖动到边缘时的弹回效果
	bool _enableRebound = false;

	// 最小缩放倍率
	float _minScale = 0.5;

	// 最大缩放倍率
	float _maxScale = 2;

	Director* _director;
	Vec2 _visibleOrigin;
	Size _visibleSize;

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

	// 回弹动画结束
	void onReboundEnd();

	/**
	 * 平移后有黑边则移动图片对齐屏幕,获取移动相对偏移值
	 * @param minXY maxXY node's boundingBox's minXY in opengl coordinate
	 * @return delta position 
	 */ 
	Vec2 getDeltaPosition(Vec2 minXY, Vec2 maxXY);

	std::vector<long> times;
};

#endif // __PAN_ZOOM_CONTROLLER_H__

PanZoomController.cpp

#include "PanZoomController.h"

PanZoomController::PanZoomController()
{
}

PanZoomController::~PanZoomController()
{
}

void PanZoomController::start(Node* node, bool enableRebound /* = false */)
{
	_node = node;
	_director = Director::getInstance();
	_visibleOrigin = _director->getVisibleOrigin(); // 注意应该使用visibleOrigin而不是0,0
	_visibleSize
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值