Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了制作了一个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
{
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;

this->scheduleupdate();

///////////////////////////////////////////////////////////////////////
void HelloWorld::update(float dt)
{
fDegree1 +=10.0*dt;
fDegree2 -=10.0*dt;

p3D1->rotateY(fDegree1);
p3D2->rotateY(fDegree2);
}

我在HelloWorld中增加了update函数,目的是以每秒10度的速度旋转两张图片。

鼓捣了一个多小时,找 贝璐丹迪图片找了半个小时,我硬盘好乱-_-! 洗洗睡了>_<

大佬总结

以上是大佬教程为你收集整理的制作了一个cocos2d-x下沿y轴旋转任意角度的精灵对象全部内容,希望文章能够帮你解决制作了一个cocos2d-x下沿y轴旋转任意角度的精灵对象所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。