2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标)



  1. openGL & UI坐标体系

OpenGL坐标系:该坐标原点在屏幕左下角,x轴向右,y轴向上。这也就是cocos2dx中用到的坐标系。

屏幕坐标系:该坐标系的原点在屏幕左上角,x轴向右,y轴向下,其实和OpenGL坐标系的差别也就是y轴的方向。假设游戏场景的分辨率为(500,500),其中一个点坐标为(200,200),那么它在OpenGL坐标系中的坐标还是(200,200),在屏幕坐标系中则倒过来,则为(200,500-200)。其实也就是6和9的差别。


图: UI坐标系


图: GL坐标系

2
转化函数


CCDirector::sharedDirector()->convertToUI();


CCDirector::sharedDirector()->convertToGL();

节点坐标系:又名相对坐标系,本地坐标,和OpenGL坐标系方向一致,不同的是原点的父节点左下角。

世界坐标系:又名绝对坐标系,世界即指游戏世界,我们只要知道世界坐标系和OpenGL坐标系方向一致,原点在屏幕左下角,x轴向右,y轴向上。

节点坐标与世界坐标转化

几乎所有的游戏引擎都会使用本地坐标系而非世界坐标系来指定元素

的位置,这样做的好处是当计算物体运动的时候使用同一本地坐标系的元素

可以作为一个子系统独立计算,最后再加上坐标系的运动即可,这是物理研

究中常用的思路。例如一个在行驶的车厢内上下跳动的人,我们只需要在每

帧绘制的时候计算他在车厢坐标系中的位置,然后加上车的位置就可以计算

出人在世界坐标系中的位置,如果使用单一的世界坐标系,人的运动轨迹就

变复杂了。

3
关于坐标体系的案例:


Coordinate.h


#ifndef
__COORDINATE_H__

#define
__COORDINATE_H__

#include
"cocos2d.h"

USING_NS_CC;

//坐标体系

class
Coordinate :public
CCLayer

{

public:

static
CCScene *
scene();

CREATE_FUNC(Coordinate);

bool
init();

//触摸事件开始的一个事件,第二个参数只是为了做苹果的兼容才保留的

virtual
bool
ccTouchBegan(CCTouch
*pTouch,
CCEvent *pEvent);

};

#endif


Coordinate.cpp


#include
"Coordinate.h"

#include
"AppMacros.h"

CCScene *
Coordinate::scene()
{

CCScene *
scene =
CCScene::create();

Coordinate *
layer =
Coordinate::create();

scene->addChild(layer);

return
scene;

}

bool
Coordinate::init()

{

CCLayer::init();

//打开触摸开关

setTouchEnabled(true);

//下面的kCCTouchesOneByOne是一个枚举:

//typedef enum {

// 
kCCTouchesAllAtOnce,

// 
kCCTouchesOneByOne,

//} ccTouchesMode;

setTouchMode(kCCTouchesOneByOne);

//创建一个精灵

CCSprite *big
= CCSprite::create();

big->setColor(ccRED);

//设置锚点

big->setAnchorPoint(ccp(0,
0));

//表示的是一个矩形,CCRectMake是一个宏

big->setTextureRect(CCRectMake(0,0,150,150));

big->setPosition(ccp(100,100));

addChild(big);

CCSprite *little
= CCSprite::create();

little->setColor(ccYELLOW);

little->setAnchorPoint(ccp(0,0));

little->setTextureRect(CCRectMake(0,
0, 50, 50));

little->setPosition(ccp(100,100));

//从下面可以知道一个精灵中可以添加另外一个精灵

big->addChild(little);

CCLog("little
x = %f,y = %f",
little->getPositionX(),
little->getPositionY());

CCPoint
toWorld =
big->convertToWorldSpace(little->getPosition());

CCLog("toWorld
x = %f,y=%f",
toWorld.x,
toWorld.y);

CCSprite *little2
= CCSprite::create();

little2->setColor(ccGREEN);

little2->setAnchorPoint(ccp(0,
0));

little2->setTextureRect(CCRectMake(0,0,50,50));

little2->setPosition(ccp(0,0));

addChild(little2);

CCPoint
toNode =
big->convertToNodeSpace(little2->getPosition());

CCLog("little2
x = %f,y = %f",
little2->getPositionX(),
little2->getPositionY());

CCLog("toNode
x = %f,y = %f",
toNode.x,
toNode.y);

CCMoveBy *by
= CCMoveBy::create(2,ccp(200,0));

CCMoveBy *by2
= (CCMoveBy *)by->reverse();

//最后一个NULL是一个哨兵

CCSequence *seq
= CCSequence::create(by,
by2,
NULL);

big->runAction(CCRepeatForever::create(seq));

//第一个参数是:duration

//第二个参数是:移动位置.表示上下移动

CCMoveBy *lby
= CCMoveBy::create(2,
ccp(0, -100));

CCMoveBy *lby2
= (CCMoveBy *)lby->reverse();

CCSequence *lseq
= CCSequence::create(lby,
lby2,
NULL);

little->runAction(CCRepeatForever::create(lseq));

return
true;

}

//触摸事件开始

bool
Coordinate::ccTouchBegan(CCTouch
*pTouch,
CCEvent *pEvent)

{

CCLog("ccTouchBegan");

//基于OpenGL的世界坐标

CCPoint
pGl =
pTouch->getLocation();

CCLog("GL:x
= %f,y = %f",
pGl.x,
pGl);

//基于UI屏幕的坐标

CCPoint
pUi =
pTouch->getLocationInView();

CCLog("UI:x
= %f,y = %f",
pUi.x,
pUi.y);

//将基于GL的坐标转换成为UI的屏幕坐标

CCPoint
toUi =
CCDirector::sharedDirector()->convertToUI(pGl);

CCLog("ToUix
= %f ,y = %f",
toUi.x,
toUi.y);

//将屏幕坐标的转换成为本地坐标

CCPoint
toGL =
CCDirector::sharedDirector()->convertToGL(pUi);

CCLog("ToGLx
= %f,y=%f",
toGL.x,
toGL.y);

//转换成节点坐标

CCPoint
node =
this->convertToNodeSpace(pGl);

CCLog("Node:x
= %f,y = %f",
node.x,
node.y);

return
false;

}


运行结果:

时间: 2024-10-20 02:48:45

2.cocos2d-x坐标体系(UI坐标系,GL坐标系,本地坐标,世界坐标,节点坐标)的相关文章

Cocos2d-x坐标体系

Cocos2d-x坐标体系 cocos2d引擎是一款非常优秀的扩平台的游戏开发引擎,在apple游戏榜上,有很多排名靠前的游戏都是由他创造出来的,他也有一套十分方便的坐标体系. 一.UI坐标体系 UI坐标体系相对于移动开发人员来说再熟悉不过了,在iOS系统中,它就是frame体系,即坐标(0,0)点位于屏幕的左上角,向右x增大,向下y增大. 二.OpenGL坐标体系 OpenGL坐标系是cocos2d中使用的坐标系,它更接近于数学上的坐标系,即(0,0)点位于屏幕的左下角,往左x增大,往上y增大

【cocos2d-x学习笔记】ZOder、tag、场景切换、精灵的各种创建方式、三个特殊层、坐标体系

ZOder: 1.是描述渲染顺序的值,每个CCNode都有ZOder,默认是0. 2.ZOder越大则越后面绘制.如果ZOder值相同,那么看arrival(全局变量每次加一)顺序,先加入的节点先绘制,ZOder只在相同父节点的节点直接进行比较 tag:是一个节点的身份证,方便通过getChildByTag来获取节点对象,它的意义在于减少成员变量 TAG只在相同父节点的节点之间有效 TAG在相同父节点的儿子之间不能相同,相同情况cocos不报错,getChildByTag可能会获取到不是你想要的

地图坐标体系

首先我们要明白,开发者能接触到哪些坐标体系呢? 第一种分类: 1.  GPS,WGS-84,原始坐标体系.一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标.很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密.GPS坐标形式如图,度分秒形式的经纬度. 2.  GCJ-02,国测局02年发布的坐标体系.又称“火星坐标”.在中国,必须至少使用GCJ-02的坐标体系.比如 腾讯,高德都在用这个坐标体系.GCJ-02也是国内最广泛使用的坐标体系. 3.  其他坐标体系.一般

cocos2dx中的坐标体系

1.UI坐标系和GL坐标系 2.本地坐标与世界坐标 本地坐标是一个相对坐标,是相对于父节点或者你指明的某个节点的相对位置来说的,本地坐标的原点在参考节点的左下角 世界坐标是一个绝对的坐标,是以屏幕的左下角为坐标原点,与GL坐标是重合的. 3.Ui坐标与GL坐标和Node坐标 UI坐标是以UI坐标系来计算的,又叫屏幕坐标,y轴向下,在某些游戏中需要使用到屏幕坐标与GL坐标的转换 GL坐标即世界坐标,是一个绝对的坐标,y轴向上 Node坐标即节点坐标,又叫本地坐标,是一个相对的坐标,是以父节点,或者

1.07 坐标体系

一.UI坐标系(屏幕坐标系) 及 openGL坐标系 图示 二.UI 坐标系 和 GL 坐标系 量化关系 三.转化函数 四.单点触摸开启及环境搭建 bool T05Coordinate::init( ) { CCLayer::init( ); setTouchEnabled( true ); //打开触摸 setTouchMode( kCCTouchesOneByOne ); //单点触摸 return true; } bool T05Coordinate::ccTouchBegan( CCTo

java基础 绘图技术.坦克大战 之java绘图坐标体系(一)

坐标体系介绍 下图说明了java坐标体系.坐标原点位于左上角,以像素为单位,像素是计算机屏幕上最小的显示单位.在java的坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素:第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素. 绘图还必须要搞清楚一个非常重要的概念,像素: 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成.例如,计算机显示器的分辨率是800*600,表示计算机屏幕上的每一行由800个点组成,共600行,整个计算机屏幕共有480 000个像素.现在

Three.js 学习笔记(1)--坐标体系和旋转

前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library. The library provides <canvas>, <svg>, CSS3D and WebGL renderers.(该项目的目标是创建一个易于使用,轻量级的3D库.该库提供了<canvas>,<svg>,CSS3D和WebGL渲染器.) 示例 

OpenCV坐标体系的初步认识

实验基础 本次实验通过一个简短的例子,主要来说明下面4个问题: 1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线:Y轴为图像矩形左边的那条垂直线.该坐标体系在诸如结构体Mat,Rect,Point中都是适用的.(OpenCV中有些数据结构的坐标原点是在图片的左下角,可以设置的). 2. 在使用image.at<TP>(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标.因此其访问的结果其实是访问image图像中的Point

深入理解SVG坐标体系和transformations- viewport, viewBox,preserveAspectRatio

本文翻译自blog: https://www.sarasoueidan.com/blog/svg-coordinate-systems/ SVG元素不像其他HTML元素一样受css盒子模型所制约.这个特点导致transform和postioning svg元素显得有些神秘,并且初看起来不是那么浅显易懂.然而,一旦你理解了SVG坐标体系以及transformation是如何工作的,那么操作SVG会变得非常简单.本文中,我们将涵盖控制SVG坐标体系的三个方面内容:viewport, viewBox和