您的位置:首页 > 移动开发 > Cocos引擎

Cocos2dx之精灵坐标系

2015-07-29 17:21 316 查看
一、有哪些坐标系

1.屏幕坐标系

标准屏幕坐标系使用和OpenGL不同的坐标系,而Cocos2d则使用和OpenGL相同的坐标系。iOS,
Android, Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点为屏幕左上角,x向右,y向下。Cocos2d坐标系和OpenGL坐标系一样,原点为屏幕左下角,x向右,y向上。



2世界坐标系(World
Coordinate)

世界坐标系也叫做绝对坐标系,是游戏开发中建立的概念。因此,“世界”指游戏世界。cocos2d中的元素是有父子关系的层级结构,我们通过Node的setPosition设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。一般的世界坐标系就是你以后设计地图坐标系。

3本地坐标系(Node
Local)

本地坐标系也叫相对坐标系,是和节点相关联的坐标系。每个节点都有独立的坐标系,当节点移动或改变方向时,和该节点关联的坐标系将随之移动或改变方向。物体本身的坐标系。

二、
锚点

将一个节点添加到父节点里面时,需要设置其在父节点上的位置,本质上是设置节点的锚点在父节点坐标系上的位置。

Anchor Point的两个参数都在0~1之间。它们表示的并不是像素点,而是乘数因子。(0.5,
0.5)表示Anchor Point位于节点长度乘0.5和宽度乘0.5的地方,即节点的中心在Cocos2d-x中Layer的Anchor Point为默认值(0, 0),其他Node的默认值为(0.5,
0.5)。

三、VertexZ,PositionZ和zOrder

VerextZ是OpenGL坐标系中的Z值

PositionZ是Cocos2d-x坐标系中Z值

zOrder是Cocos2d-x本地坐标系中Z值

在实际开发中我们只需关注zOrder。

可以通过
setPositionZ
接口来设置PositionZ

#ifndef __T05ORDERandTag_H__
#define __T05ORDERandTag_H__
#include "cocos2d.h"
USING_NS_CC;
#include "f:\cocos2dx\cocos2d-x-2.2.6\cocos2dx\layers_scenes_transitions_nodes\cclayer.h"
class T05ODERandTag :
public CCLayer
{
public:
T05ODERandTag(void);
~T05ODERandTag(void);

static CCScene* scene();
CREATE_FUNC(T05ODERandTag);
bool init();

enum{TAG_BG = 10, TAG_SPRITE};
bool ccTouchBegin(CCTouch *pTouch, CCEvent *pEvent);
};
#endif

#include "T05ODERandTag.h"

T05ODERandTag::T05ODERandTag(void)
{
}

T05ODERandTag::~T05ODERandTag(void)
{
}

CCScene* T05ODERandTag::scene()
{
CCScene* scene = CCScene::create();
T05ODERandTag* layer = T05ODERandTag::create();
scene->addChild(layer);
return scene;
}

bool T05ODERandTag::init()
{
CCLayer::init();

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

// bg的zorder默认是0
CCSprite* bg = CCSprite::create("HelloWorld.png");
addChild(bg);
bg->setPosition(ccp(winSize.width / 2, winSize.height / 2));
bg->setTag(TAG_BG);

CCSprite* sprite = CCSprite::create("CloseNormal.png");
addChild(sprite);
sprite->setPosition(ccp(winSize.width / 2, winSize.height / 2));

sprite->setZOrder(1);
sprite->setTag(TAG_SPRITE);

setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);
return true;
}

bool T05ODERandTag::ccTouchBegin(CCTouch *pTouch, CCEvent *pEvent)
{
CCNode* node = getChildByTag(TAG_SPRITE);
node->setZOrder(0 - node->getZOrder());
return false;
}


四、拖动节点设计和实现

#ifndef __T04DrawNode_H__
#define __T04DrawNode_H__
#include "f:\cocos2dx\cocos2d-x-2.2.6\cocos2dx\layers_scenes_transitions_nodes\cclayer.h"
#include "cocos2d.h"
USING_NS_CC;

class T04DrawNode :	public CCLayer
{
public:
T04DrawNode(void);
~T04DrawNode(void);

static CCScene* scene();
CREATE_FUNC(T04DrawNode);
bool init();
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
CCSprite* _sprite;
};

#endif


#include "T04DrawNode.h"

T04DrawNode::T04DrawNode(void)
{
}

T04DrawNode::~T04DrawNode(void)
{
}

CCScene* T04DrawNode::scene()
{
CCScene* scene = CCScene::create();
T04DrawNode* layer = T04DrawNode::create();
scene->addChild(layer);
return scene;
}

bool T04DrawNode::init()
{
CCLayer::init();

CCSprite* sprite = CCSprite::create("CloseNormal.png");
addChild(sprite);
sprite->setPosition(ccp(100, 100));

setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);

_sprite = sprite;
return true;
}

bool T04DrawNode::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
// rc描述了精灵所占用的矩形,包括位置和大小
CCRect rc=_sprite->boundingBox();

// 鼠标按下的位置
CCPoint pt = pTouch->getLocation();

// 只有当鼠标点中精灵的时候,ccTouchMoved才要被调用
return rc.containsPoint(pt);
}
void T04DrawNode::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint ptDelta = pTouch->getDelta();
CCPoint oldPos = _sprite->getPosition();
CCPoint newPos = oldPos  + ptDelta;
_sprite->setPosition(newPos);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: