游戏开发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包中包含开发环境,下载解压后可直接编译运行。

分享战迹。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值