最近做的项目,我实现了一个3d可旋转的游戏大厅界面。在win32和在ios上均没有问题,在android上初始化没问题,后台到前台时效果出错。
实现代码如下:
...
//创建一个sprite
CCSprite* pImage;
//初始化精灵的代码
...
//设置3d camera的视角
getCameraAngle(pImage,0.5f,0,0,0,0,0,&i,&j,&k);
pImage->getCamera()->setEyeXYZ(i,j,k);
...
//设置3d camera视角的函数。其实就是用CCOrbitCamera的action写的。由于直接调用action无法直接初始化3d效果,所以封装了一下。不知道这个封装有没有问题,请指正
void getCameraAngle(CCNode* actnode,float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX,float* i,float * j,float* k)
{
float fRadDeltaZ = (CGFloat)CC_DEGREES_TO_RADIANS(deltaAngleZ);
float fRadDeltaX = (CGFloat)CC_DEGREES_TO_RADIANS(deltaAngleX);
float newRadius, zenith, azimuth;
float ex, ey, ez, cx, cy, cz, x, y, z;
float r; // radius
float s;
CCCamera* pCamera = actnode->getCamera();
pCamera->getEyeXYZ(&ex, &ey, &ez);
pCamera->getCenterXYZ(&cx, &cy, &cz);
x = ex-cx;
y = ey-cy;
z = ez-cz;
r = sqrtf( powf(x,2) + powf(y,2) + powf(z,2));
s = sqrtf( powf(x,2) + powf(y,2));
if( s == 0.0f )
s = FLT_EPSILON;
if(r==0.0f)
r = FLT_EPSILON;
zenith = acosf( z/r);
if( x < 0 )
azimuth= (CGFloat)M_PI - asinf(y/s);
else
azimuth = asinf(y/s);
newRadius = r / CCCamera::getZEye();
if( isnan(radius) )
radius = newRadius;
if( isnan(angleZ) )
angleZ= (CGFloat)CC_RADIANS_TO_DEGREES(zenith);
if( isnan(angleX) )
angleX = (CGFloat)CC_RADIANS_TO_DEGREES(azimuth);
float fRadZ = (CGFloat)CC_DEGREES_TO_RADIANS(angleZ);
float fRadX = (CGFloat)CC_DEGREES_TO_RADIANS(angleX);
float rr = radius * CCCamera::getZEye();
float za = fRadZ + fRadDeltaZ ;
float xa = fRadX + fRadDeltaX ;
* i = sinf(za) * cosf(xa) * rr;
* j = sinf(za) * sinf(xa) * rr ;
* k = cosf(za) * rr ;
}...//AppDelegate.cpp里在applicationDidFinishLaunching函数里初始化场景前调用pDirector->setDepthTest(false);...
实现效果如下:
win32、ios以及android未切到后台前效果:
277
android切入后台,再到前台效果:
278
cocos2d-x版本:1.0.1-0.12.0
求王哲老大以及各位了解这块的大拿们帮忙解答。谢谢{:soso_e183:}