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。
可以通过
#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
四、拖动节点设计和实现
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); }
相关文章推荐
- cocos2d-x 角色选择视图 类似ListView
- 【Cocos游戏实战】功夫小子第八课之游戏打包和相关问题说明
- 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现
- Cocos2dx NotificationCenter(广播或通告)的使用方法
- Cocos移植Android-Android.mk编译后的文件
- Cocos2d-x函数----addChild()
- Cocos2dx之精灵创建
- cocos2d-x使用CCClippingNode实现跑马灯
- JniHelper调用java静态和非静态方法总结(即cocos2dx中调用android平台下显示第三方广告)
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x自定义按钮类
- cocos2d-x自定义按钮类 分类: cocos2d代码编写 2015-07-29 09:01 6人阅读 评论(0) 收藏
- cocos2d-x系列笔记技巧篇—关于CREATE_FUNC宏的用法
- cocos2d-x系列笔记技巧篇—关于CREATE_FUNC宏的用法 分类: cocos2d代码编写 2015-07-29 08:50 7人阅读 评论(0) 收藏
- Cocos2d-x中文支持问题的解决办法
- 远古守卫/cocos2d-x 源码/塔防游戏/高仿王国保卫战
- Lua_Cocos Code IDE打造炫酷的颜色主题,用于保护眼睛
- 【独立开发者er Cocos2d-x实战 012】Cocos2dx 2.2.6 CCTableView和CCTableViewCell详解
- cocos2dx飞机大战开发记录(2)
- cocos2d-x 3.x游戏教程 - Eight 第二篇