![制作了一个cocos2d-x下沿y轴旋转任意角度的精灵对象,第1张 制作了一个cocos2d-x下沿y轴旋转任意角度的精灵对象,第1张](/aiimages/%E5%88%B6%E4%BD%9C%E4%BA%86%E4%B8%80%E4%B8%AAcocos2d-x%E4%B8%8B%E6%B2%BFy%E8%BD%B4%E6%97%8B%E8%BD%AC%E4%BB%BB%E6%84%8F%E8%A7%92%E5%BA%A6%E7%9A%84%E7%B2%BE%E7%81%B5%E5%AF%B9%E8%B1%A1.png)
概述闲来无事,想了想cocos2d-x下精灵
对象好像不能沿y轴
旋转,使用CCSprite的setSkewY函数想做成类似的旋转效果简直没法看,其实实现起来不难,就自己写了点小玩意,分享一下。 运行效果如上,右上是使用setSkewY的效果,另外两个是我自己实现的旋转效果(PS: 贝璐丹迪好可爱) 话不多说,上代码: //cwSprite3D.h///////////////////////////// 闲来无事,想了想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
{
public:
staticcwSprite3D* create(const char *pszfilename);
//沿Y轴旋转degree角度
voIDrotateY(float degree);
protected:
//四个顶点数据原始值
ccV3F_C4B_T2F_Quad m_squadOri;
};
#endif
//cwSprite3D.cpp//////////////////////////////////////////////////////////////////////////////
#include "cwSprite3D.h"
cwSprite3D* cwSprite3D::create(const char *pszfilename)
{
cwSprite3D*pobSprite = new cwSprite3D();
if(pobSprite &&pobSprite->initWithfile(pszfilename))
{
//保存顶点原始数据
pobSprite->m_squadOri =pobSprite->m_squad;
pobSprite->autorelease();
return pobSprite;
}
CC_SAFE_DELETE(pobSprite);
returnNulL;
}
//沿Y轴旋转degree角度
voID cwSprite3D::rotateY(float degree)
{
static floatfRadSeed = 3.14159f/180.0f;
//创建个旋转矩阵
kmMat4kMat;
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];
v[i]->x = x;
v[i]->y = y;
v[i]->z = z;
}
}
代码很简单,在初始化的时候保存了顶点原始数据,目的是在计算旋转后坐标时,使用原始值计算变换后的坐标数据(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 =0;
fDegree2 =0;