您的位置:首页 > 移动开发 > Cocos引擎

制作了一个cocos2d-x下沿y轴旋转任意角度的精灵对象

2013-12-12 13:46 429 查看

制作了一个cocos2d-x下沿y轴旋转任意角度的精灵对象


(2013-05-23 21:39:27)


转载▼

标签:

cocos2d-x

y轴

旋转

ccsprite

 
闲来无事,想了想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:
static cwSprite3D* create(const char *pszFileName);

//沿Y轴旋转degree角度
void rotateY(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);
return NULL;

}

//沿Y轴旋转degree角度

void cwSprite3D::rotateY(float degree)

{
static float fRadSeed = 3.14159f/180.0f;

//创建个旋转矩阵
kmMat4 kMat;
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: