void Coctree::getpCollisionLeafList_inn(CocNode*pNode,const Cc3dVector4&c,float R, vector<CocNode*>&pCollisionLeafList) //获得与c为球心R为半径球体的碰撞叶子节点 { if(pNode==NULL)return; //检查球体cR是否与pNode碰撞 bool collision=false; { const float *c_node=pNode->getCenter().getArray(); const float R_node=pNode->getBoundingSphereRadius(); float d2=square(c_node[0]-c.x())+square(c_node[1]-c.y())+square(c_node[2]-c.z()); if(d2<square(R+R_node)){//相交 collision=true; } }//得到collision if(collision){//如果碰撞 if(pNode->getIsLeaf()){ //将pNode加入到pCollisionLeafList pCollisionLeafList.push_back(pNode); }else{ //去考察pNode的孩子 for(int i=0;i<8;i++){ getpCollisionLeafList_inn(pNode->getChildByIndex(i),c,R,pCollisionLeafList); } } } }
bool isEqual(const Cc3dVector4&v1,const Cc3dVector4&v2,float eps){ for(int i=0;i<4;i++){ float d=fabsf(v1.getAt(i)-v2.getAt(i)); if(d>eps)return false; } return true; }
Cc3dVector4 normalize(const Cc3dVector4&v){ //assert(v.w()==0); float r2=v.x()*v.x()+v.y()*v.y()+v.z()*v.z(); if(r2==0){ return Cc3dVector4(0,0,0,0); } float r=sqrtf(r2); Cc3dVector4 rs(v.x()/r,v.y()/r,v.z()/r,0); return rs; }
Cc3dVector4 componentProduct(const Cc3dVector4&v1,const Cc3dVector4&v2){ Cc3dVector4 v(v1.x()*v2.x(), v1.y()*v2.y(), v1.z()*v2.z(), v1.w()*v2.w()); return v; }
Cc3dVector4 Cc3dMatrix4::operator*(const Cc3dVector4&v)const{ const float *m=this->getArray(); const float *vin=v.getArray(); float vout[4]; vout[0]=vin[0]*m[0]+vin[1]*m[4]+vin[2]*m[8]+vin[3]*m[12]; vout[1]=vin[0]*m[1]+vin[1]*m[5]+vin[2]*m[9]+vin[3]*m[13]; vout[2]=vin[0]*m[2]+vin[1]*m[6]+vin[2]*m[10]+vin[3]*m[14]; vout[3]=vin[0]*m[3]+vin[1]*m[7]+vin[2]*m[11]+vin[3]*m[15]; return Cc3dVector4(vout); }
Cc3dVector4 cross(const Cc3dVector4&v1,const Cc3dVector4&v2) { assert(v1.w()==0); assert(v2.w()==0); Cc3dVector4 rs(v1.y()*v2.z()-v1.z()*v2.y(), v1.z()*v2.x()-v1.x()*v2.z(), v1.x()*v2.y()-v1.y()*v2.x(), 0);//cross product result must be a vector, so the fourth component set to zero return rs; }
float dot(const Cc3dVector4&v1,const Cc3dVector4&v2){ return v1.x()*v2.x()+v1.y()*v2.y()+v1.z()*v2.z(); }
float getLength(const Cc3dVector4&v){ assert(v.w()==0); return sqrtf(v.x()*v.x()+v.y()*v.y()+v.z()*v.z()); }
float getLength2(const Cc3dVector4&v){//square of length assert(v.w()==0); return v.x()*v.x()+v.y()*v.y()+v.z()*v.z(); }
Cc3dVector2 toV2(const Cc3dVector4&v4){ return Cc3dVector2(v4.x(), v4.y()); }
void Cc3dTransform::setPos(const Cc3dVector4&pos){ setPos(pos.x(),pos.y(),pos.z()); }
Cc3dVector4 Cc3dVector4::operator -(const Cc3dVector4&right)const { Cc3dVector4 rs(this->x()-right.x(),this->y()-right.y(),this->z()-right.z(),this->w()-right.w()); return rs; }
bool CsuccedPage::init(int nStar,int nEnemyKilled,int nCoinEaten){ const float wReso=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getResolutionSize().x(); const float hReso=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getResolutionSize().y(); const float width=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenSize().x(); const float height=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenSize().y(); string resoStr=numberToStr(wReso)+"x"+numberToStr(hReso); const float keyMovUp=height-480; //----创建数字纹理和符号纹理--abc { for(int i=0;i<10;i++){ string texPath="singleCellGameResource/data/global/tex/numberAndSymbolTex/"+numberToStr(i)+".png"; Cc3dTexture* ptex=Cc3dTextureCache::sharedTextureCache()->addImage(texPath); m_numberTexList.push_back(ptex); ptex->retain(); } m_dotTex=Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/numberAndSymbolTex/dot.png"); m_dotTex->retain(); } //--quad_succeed { m_quad_succeed=new Ckey(); m_quad_succeed->autorelease(); m_quad_succeed->init(); // Cc3dTexture* ptexture_quad_succeed=Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/quads/quad_succeed.png"); float bx=0; float by=0; float w=220; float h=55; m_quad_succeed->genAndInit(bx, bx+w, by, by+h,0,1,0,1); m_quad_succeed->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); m_quad_succeed->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(ptexture_quad_succeed); m_quad_succeed->setKeyUpColor(1, 1, 1, 1); m_quad_succeed->useKeyUpColor(); m_quad_succeed->setCamera(camera2D); m_quad_succeed->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); m_quad_succeed->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); m_quad_succeed->setPassUnifoCallback(passUnifoCallback_noLight); m_quad_succeed->setVisitDrawOrder(10000); // float _bx=52; float _by=380; m_quad_succeed->reSetLeftDownCorner(_bx, _by+keyMovUp); m_quad_succeed->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); // addChild(m_quad_succeed); } //--quad_star { m_quad_star=new Ckey(); m_quad_star->autorelease(); m_quad_star->init(); // float bx=0; float by=0; float w=200; float h=50; m_quad_star->genAndInit(bx, bx+w, by, by+h,0,1,0,1); m_quad_star->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); m_quad_star->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(Cc3dTextureCache::sharedTextureCache()->addImage(string("singleCellGameResource/data/global/tex/quads/quad_star")+numberToStr(nStar)+".png")); m_quad_star->setKeyUpColor(1, 1, 1, 1); m_quad_star->useKeyUpColor(); m_quad_star->setCamera(camera2D); m_quad_star->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); m_quad_star->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); m_quad_star->setPassUnifoCallback(passUnifoCallback_noLight); m_quad_star->setVisitDrawOrder(10000); // float _bx=60; float _by=265; m_quad_star->reSetLeftDownCorner(_bx, _by+keyMovUp); m_quad_star->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); // addChild(m_quad_star); } //--nextLevelKey { m_nextLevelKey=new Ckey(); m_nextLevelKey->autorelease(); m_nextLevelKey->init(); // Cc3dTexture* ptexture=Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/keys/key_nextLevel.png"); float c[2]={0,0}; m_nextLevelKey->genAndInit(c[0]-r_key,c[0]+r_key,c[1]-r_key,c[1]+r_key, 0,1,0,1); m_nextLevelKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); m_nextLevelKey->setKeyDownColor(0.7, 0.7, 0.7, 1); m_nextLevelKey->setKeyUpColor(1, 1, 1, 1); m_nextLevelKey->useKeyUpColor(); m_nextLevelKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(ptexture); m_nextLevelKey->setCamera(camera2D); m_nextLevelKey->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); m_nextLevelKey->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); m_nextLevelKey->setPassUnifoCallback(passUnifoCallback_noLight); m_nextLevelKey->setVisitDrawOrder(10000); // Cc3dVector4 center; if(CgameState::sharedGameState()->getCurrentLevel()==CuserConfig::sharedUserConfig()->get_levelCount()){ center.init(160, 340+10+keyMovUp, 0,1); }else{ center.init(223, 340+10+keyMovUp, 0,1); } m_nextLevelKey->reSetCenter(center.x(), center.y()); m_nextLevelKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); // addChild(m_nextLevelKey); } //--homeKey { m_homeKey=new Ckey(); m_homeKey->autorelease(); // float c[2]={0,0}; m_homeKey->genAndInit(c[0]-r_key,c[0]+r_key,c[1]-r_key,c[1]+r_key, 0,1,0,1); m_homeKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); m_homeKey->setKeyDownColor(0.7, 0.7, 0.7, 1); m_homeKey->setKeyUpColor(1, 1, 1, 1); m_homeKey->useKeyUpColor(); m_homeKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/keys/key_home.png")); m_homeKey->setCamera(camera2D); m_homeKey->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); m_homeKey->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); m_homeKey->setPassUnifoCallback(passUnifoCallback_noLight); m_homeKey->setVisitDrawOrder(10000); m_homeKey->setIsVisible(CgameState::sharedGameState()->getCurrentLevel()!=CuserConfig::sharedUserConfig()->get_levelCount()); // float _c[2]={95,340+10+keyMovUp}; m_homeKey->reSetCenter(_c[0], _c[1]); m_homeKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); // addChild(m_homeKey); } //--restartKey { m_restartKey=new Ckey(); m_restartKey->autorelease(); m_restartKey->init(); // float c[2]={0,0}; m_restartKey->genAndInit(c[0]-r_key,c[0]+r_key,c[1]-r_key,c[1]+r_key, 0,1,0,1); m_restartKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); m_restartKey->setKeyDownColor(0.7, 0.7, 0.7, 1); m_restartKey->setKeyUpColor(1, 1, 1, 1); m_restartKey->useKeyUpColor(); m_restartKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/keys/key_restart.png")); m_restartKey->setCamera(camera2D); m_restartKey->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); m_restartKey->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); m_restartKey->setPassUnifoCallback(passUnifoCallback_noLight); m_restartKey->setVisitDrawOrder(10000); m_restartKey->setIsVisible(CgameState::sharedGameState()->getCurrentLevel()!=CuserConfig::sharedUserConfig()->get_levelCount()); // float _c[2]={160,340+10+keyMovUp}; m_restartKey->reSetCenter(_c[0],_c[1]); m_restartKey->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); // addChild(m_restartKey); } //----quad_coin { m_quad_coin=new Ckey(); m_quad_coin->autorelease(); m_quad_coin->init(); // Cc3dTexture* ptex_quad_coin=Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/quads/quad_coin.png"); m_quad_coin->genAndInit(0, 30, 0, 30,0,1,0,1); m_quad_coin->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); m_quad_coin->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(ptex_quad_coin); m_quad_coin->setKeyUpColor(1, 1, 1, 1); m_quad_coin->useKeyUpColor(); m_quad_coin->setCamera(camera2D); m_quad_coin->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); m_quad_coin->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); m_quad_coin->setPassUnifoCallback(passUnifoCallback_noLight); m_quad_coin->setVisitDrawOrder(10000); //quad_coin float bx=100; float by=165-60; m_quad_coin->reSetLeftDownCorner(bx, by); m_quad_coin->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); // addChild(m_quad_coin); } //----quad_nCoinPositivePlaceList { //提取nCoin各位数字--abc int _nCoinEaten=nCoinEaten; vector<int> numberList; for(int i=0;i<nCoinPositivePlaceCount;i++){ int number=_nCoinEaten%10; _nCoinEaten/=10; numberList.push_back(number); } for(int i=0;i<nCoinPositivePlaceCount;i++){//反序--abc if(i>=nCoinPositivePlaceCount/2)break; int temp=numberList[i]; numberList[i]=numberList[nCoinPositivePlaceCount-i-1]; numberList[nCoinPositivePlaceCount-i-1]=temp; } int nPositivePlace=nCoinPositivePlaceCount; for(int i=0;i<nPositivePlace;i++){ Ckey*quad=new Ckey();//quad_nCoinPositivePlaceList[i]; quad->genAndInit(0, 26, 0, 26,0,1,0,1); quad->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); quad->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(m_numberTexList[numberList[i]]); quad->setKeyUpColor(1, 1, 1, 0.8); quad->useKeyUpColor(); quad->setCamera(camera2D); quad->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); quad->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); quad->setPassUnifoCallback(passUnifoCallback_noLight); quad->setVisitDrawOrder(10000); addChild(quad); m_quad_nCoinPositivePlaceList.push_back(quad); } //quad_nCoinPostivePlaceList float _bx=100+10; float _by=165-60; for(int i=0;i<nPositivePlace;i++){ Ckey*quad=m_quad_nCoinPositivePlaceList[i]; _bx+=20; quad->reSetLeftDownCorner(_bx, _by); quad->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); } } //----quad_killEnemy { m_quad_killEnemy=new Ckey(); m_quad_killEnemy->autorelease(); m_quad_killEnemy->init(); // Cc3dTexture* ptex_quad_killEnemy=Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/quads/quad_killEnemy.png"); m_quad_killEnemy->genAndInit(0, 30, 0, 30,0,1,0,1); m_quad_killEnemy->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); m_quad_killEnemy->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(ptex_quad_killEnemy); m_quad_killEnemy->setKeyUpColor(1, 1, 1, 1); m_quad_killEnemy->useKeyUpColor(); m_quad_killEnemy->setCamera(camera2D); m_quad_killEnemy->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); m_quad_killEnemy->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); m_quad_killEnemy->setPassUnifoCallback(passUnifoCallback_noLight); m_quad_killEnemy->setVisitDrawOrder(10000); // float bx=100; float by=130-60; m_quad_killEnemy->reSetLeftDownCorner(bx, by); m_quad_killEnemy->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); // addChild(m_quad_killEnemy); } //----quad_nKillEnemyPostivePlaceList { //提取nBoss各位数字--abc int _nEnemyKilled=nEnemyKilled; vector<int> numberList; for(int i=0;i<nCoinPositivePlaceCount;i++){ int number=_nEnemyKilled%10; _nEnemyKilled/=10; numberList.push_back(number); } for(int i=0;i<nCoinPositivePlaceCount;i++){//反序--abc if(i>=nCoinPositivePlaceCount/2)break; int temp=numberList[i]; numberList[i]=numberList[nCoinPositivePlaceCount-i-1]; numberList[nCoinPositivePlaceCount-i-1]=temp; } int nPositivePlace=nKillEnemyPostivePlaceCount; for(int i=0;i<nPositivePlace;i++){ Ckey*quad=new Ckey();//quad_nKillEnemyPositivePlaceList[i]; quad->genAndInit(0, 26, 0, 26,0,1,0,1); quad->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); quad->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(m_numberTexList[numberList[i]]); quad->setKeyUpColor(1, 1, 1, 0.8); quad->useKeyUpColor(); quad->setCamera(camera2D); quad->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); quad->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); quad->setPassUnifoCallback(passUnifoCallback_noLight); quad->setVisitDrawOrder(10000); addChild(quad); m_quad_nKillEnemyPositivePlaceList.push_back(quad); } // float _bx=100+10; float _by=130-60; for(int i=0;i<nPositivePlace;i++){ Ckey*quad=m_quad_nKillEnemyPositivePlaceList[i]; _bx+=20; quad->reSetLeftDownCorner(_bx, _by); quad->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); } } //----quad_keyList { m_tex_quad_key_blackWhite=Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/quads/quad_geneCube_blackWhite.png"); m_tex_quad_key_blackWhite->retain(); m_tex_quad_key_colored=Cc3dTextureCache::sharedTextureCache()->addImage("singleCellGameResource/data/global/tex/quads/quad_geneCube.png"); m_tex_quad_key_colored->retain(); int nKey=1; for(int i=0;i<nKey;i++){ Ckey*quad_key=new Ckey();//quad_keyList[i]; quad_key->genAndInit(0, 30, 0, 30,0,1,0,1); quad_key->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->getIndexVBO()->genBuffers(); quad_key->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(m_tex_quad_key_blackWhite); quad_key->setKeyUpColor(1, 1, 1, 1); quad_key->useKeyUpColor(); quad_key->setCamera(camera2D); quad_key->getModel()->getMeshList()[0]->setIsWriteDepthBuffer(false); quad_key->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("shaderNoLight")); quad_key->setPassUnifoCallback(passUnifoCallback_noLight); quad_key->setVisitDrawOrder(10000); addChild(quad_key); m_quad_keyList.push_back(quad_key); } //在quad_keyList中先前nkey个quad_key进行绘制--abc float by=145; float xBeginMin=100; float xEndMax=500; //在xbeginMin和xEndMax区间内画nKey个quad_key //为此重新设定各quad_key的大小--abc float keyWidth=minf((xEndMax-xBeginMin)/nKey,50); float keyHeight=keyWidth; for(int i=0;i<nKey;i++){ Ckey*quad_key=m_quad_keyList[i]; quad_key->reSetWidth(keyWidth); quad_key->reSetHeight(keyHeight); } //重设各quad_key的位置(通过左下角) for(int i=0;i<nKey;i++){ Ckey*quad_key=m_quad_keyList[i]; quad_key->reSetLeftDownCorner(xBeginMin+keyWidth*i, by); } //将各quad_key纹理都设置为彩色--abc for(int i=0;i<nKey;i++){ Ckey*quad_key=m_quad_keyList[i]; quad_key->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->setTexture(m_tex_quad_key_colored); } //提交--abc for(int i=0;i<nKey;i++){ Ckey*quad_key=m_quad_keyList[i]; quad_key->getModel()->getMeshList()[0]->getSubMeshByIndex(0)->submit(GL_STATIC_DRAW); } } //----switchPage Cc3dALSource*pALSource_switchPage=Cc3dAudioCache::sharedAudioCache()->createBufferAndSource("singleCellGameResource/data/global/audio/switchPage.wav","switchPage"); this->addALSource(pALSource_switchPage); return true; }