游戏开发cocos2d-x实战(3) -- 以几何图和sprite位置为例理解座标系统

1、座标系统的理解

(1)设备座标系

设备座标系的原点在显示屏幕的左上角为原点(0,0)。X轴右向为正,Y轴是下向为正,
在这里插入图片描述

(2)openGL座标系

openGL座标系以显示屏幕左下角为原点(0,0),Y轴是上向上正,X是右向为正。
在这里插入图片描述cocos2d-x以openGL库绘制信息,采用openGL座标系。

(3)局部座标或本地座标

本地座标是相对座标,是以节点(node)的左下解为原点(0,0)。

(4)世界座标

世界座标系又称为绝对座标系,是游戏中虚拟出来的座标。表示场景空间内的统一座标系,用来标识游戏的场景。它建立了其他座标系所需的参考标准,可使用世界系来描述其他座标系的位置。

(5)锚点

锚点是Cocos2d-x中一个非常重要的概念,每个节点都有一个锚点,锚点指定了纹理图像和节点原点重合的位置。默认情况下,锚点位于纹理图像的集合中心。锚点的最大作用是辅助节点进行界面布局定位。

Node::setAnchorPoint(const Vec2& anchorPoint)
anchorPoint是规一化的座标, 取值0~1.可以理解为百分比。
左下(0.0,0.0),
左上(1.0,0.0),
右上(1.0,1.0),
右下(1.0,0.0)
中心点(0.5, 0.5)

2、座标相关函数

(1)节点位置设定和取得

void Node::setPosition(float x, float y)
void Node::getPosition(float* x, float* y)
座标(x,y)是父节点的本地座标。

(2)锚点位置设定和取得

const Vec2& Node::getAnchorPoint()
void Node::setAnchorPoint(const Vec2& anchorPoint)
锚点缺省值为(0,0),即节点的左下角。
设置值可以大于(1,1),或小于(0,0);
如果节点是一个物理体,锚点必须位置节点内部。

(3)座标系的转化。

转化为节点座标,参数worldPoint为世界座标
Vec2 Node::convertToNodeSpace(const Vec2& worldPoint)

转化为世界座标,参数nodePoint为节点座标
Vec2 convertToWorldSpace(const Vec2& nodePoint)

3、绘制几何图

(1)绘制几何图形的程序框架

a.重载父类Node的draw()函数
void draw(cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t flags)
在draw()函数中写绘制的回调函数OnMyDraw()

b.在OnMyDraw函数中绘制
画点函数:drawPoint,drawPoints
画线:drawLine
画圆: drawCircle, drawSolidCircle
画多边形: drawPoly, drawSolidPoly
画矩形:drawQuadBezier, drawCubicBezier
线宽:glLineWidth
颜色:setDrawColor
点大小:setPointSize

4、创建sprite

(1)创建sprite的函数

从文件中创建
Sprite* Sprite::create(const std::string& filename, const Rect& rect)

从动画帧中创建
Sprite* Sprite::createWithSpriteFrame(SpriteFrame *spriteFrame)

从纹理中创建
Sprite* Sprite::createWithTexture(Texture2D *texture, const Rect& rect, bool rotated)

从多边形中创建
Sprite* Sprite::create(const PolygonInfo& info)

(2)设定sprite位置和锚点

void setAnchorPoint(const Vec2& anchor)
setPosition(const Vec2& pos)
setPosition(float x, float y)

(3)sprite缩放旋转

void setRotation(float rotation)
void setScale(float scaleX, float scaleY)

(4)实战纪录

SpriteFrame* frame = SpriteFrame::create("HelloWorld.png", Rect(100, 100, 80, 80));
	auto spriteByFrame = Sprite::createWithSpriteFrame(frame);
	spriteByFrame->setAnchorPoint(Vec2(0, 1));// 指定锚点
	spriteByFrame->setPosition(Vec2(0, visibleSize.height)); // 在左上角
	this->addChild(spriteByFrame, 0);

5、实战源码分享

本文源码在Debug-win32下编译运行通过。
ZIP包中包含开发环境,下载解压后可直接编译运行。

分享战迹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章