制作了一个cocos2d-x下沿y轴旋转任意角度的精灵对象
闲来无事,想了想cocos2d-x下精灵对象好像不能沿y轴旋转,使用CCSprite的setSkewY函数想做成类似的旋转效果简直没法看,其实实现起来不难,就自己写了点小玩意,分享一下。
运行效果如上,右上是使用setSkewY的效果,另外两个是我自己实现的旋转效果(PS:贝璐丹迪好可爱)
话不多说,上代码:
//cwSprite3D.h///////////////////////////////////////////////////////////////////////////////
#ifndef _cwSprite3D_h_
#define _cwSprite3D_h_
#include "cocos2d.h"
using namespace cocos2d;
class cwSprite3D : public CCSprite
&&& static
cwSprite3D* create(const char *pszFileName);
//沿Y轴旋转degree角度
rotateY(float degree);
protected:
//四个顶点数据原始值
ccV3F_C4B_T2F_Quad m_sQuadO
//cwSprite3D.cpp//////////////////////////////////////////////////////////////////////////////
#include "cwSprite3D.h"
cwSprite3D* cwSprite3D::create(const char *pszFileName)
&&& cwSprite3D
*pobSprite = new cwSprite3D();
(pobSprite &&
pobSprite-&initWithFile(pszFileName))
//保存顶点原始数据
pobSprite-&m_sQuadOri =
pobSprite-&m_sQ
pobSprite-&autorelease();
return pobS
CC_SAFE_DELETE(pobSprite);
&&& return
//沿Y轴旋转degree角度
void cwSprite3D::rotateY(float degree)
&&& static float
fRadSeed = 3.1f;
//创建个旋转矩阵
&&& kmMat4
kmMat4Identity(&kMat);
kmMat4RotationY(&kMat, degree*fRadSeed);
&&& ccVertex3F*
v[4] = {&m_sQuad.bl.vertices,
&m_sQuad.br.vertices,
&m_sQuad.tl.vertices,
&m_sQuad.tr.vertices};
&&& ccVertex3F*
vOri[4] = {&m_sQuadOri.bl.vertices,
&m_sQuadOri.br.vertices,
&m_sQuadOri.tl.vertices,
&m_sQuadOri.tr.vertices};
//向量矩阵相乘
&&& for(int i =
0; i & 4; ++i) {
&&& float x =
kMat.mat[0]*vOri[i]-&x +
kMat.mat[4]*vOri[i]-&y +
kMat.mat[8]*vOri[i]-&z + kMat.mat[12];
&&& float y =
kMat.mat[1]*vOri[i]-&x +
kMat.mat[5]*vOri[i]-&y +
kMat.mat[9]*vOri[i]-&z + kMat.mat[13];
&&& float z =
kMat.mat[2]*vOri[i]-&x +
kMat.mat[6]*vOri[i]-&y +
kMat.mat[10]*vOri[i]-&z + kMat.mat[14];
代码很简单,在初始化的时候保存了顶点原始数据,目的是在计算旋转后坐标时,使用原始值计算变换后的坐标数据(float容易失真的,嘎嘎)。
rotateY函数就是绕Y轴旋转了,也很简单,创建了一个矩阵,然后乘以顶点,得到旋转后的新顶点,矩阵使用cocos2d-x自带的kazmath库(PS:一直以来对opengl下的列向量感觉是不太舒服,没数学天分-_-!)
代码中使用也很简单
/////HelloWorld::init()////////////////////////////////////////////////////////////////////
//setSkewY效果
CCSprite* pTest = CCSprite::create("godness.png");
pTest-&setPosition(ccp(size.width*0.7,
size.height*0.75));
this-&addChild(pTest);
pTest-&setSkewY(25.0);
//两张旋转图片
&&& p3D1 =
cwSprite3D::create("godness.png");
p3D1-&setPosition(ccp(size.width*0.3,
size.height*0.5));
p3D1-&rotateY(0);
this-&addChild(p3D1);
&&& p3D2 =
cwSprite3D::create("godness.png");
p3D2-&setPosition(ccp(size.width*0.6,
size.height*0.25));
p3D2-&rotateY(0);
this-&addChild(p3D2);
//角度计数器
&&& fDegree1 =
&&& fDegree2 =
this-&scheduleUpdate();
///////////////////////////////////////////////////////////////////////
void HelloWorld::update(float dt)
&&& fDegree1 +=
&&& fDegree2 -=
p3D1-&rotateY(fDegree1);
p3D2-&rotateY(fDegree2);
我在HelloWorld中增加了update函数,目的是以每秒10度的速度旋转两张图片。
鼓捣了一个多小时,找贝璐丹迪图片找了半个小时,我硬盘好乱-_-!
洗洗睡了&_&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。