Пример #1
0
	void Update( float p_fDelta )
	{
		if( Input().Down( FK2DEngine::EKB_Left ) || Input().Down( FK2DEngine::GP_Left ) )
		{
			m_Player.TurnLeft();
		}
		if( Input().Down( FK2DEngine::EKB_Right ) || Input().Down( FK2DEngine::GP_Right ) )
		{
			m_Player.TurnRight();
		}
		if( Input().Down( FK2DEngine::EKB_Up ) || Input().Down( FK2DEngine::GP_Button0 ) )
		{
			m_Player.Accelerate();
		}

		m_Player.Move();
		m_Player.CollectStars( m_Stars );

		if( std::rand() % 25 == 0 && m_Stars.size() < 25 )
		{
			m_Stars.push_back( CStar(m_StarAnim) );
		}

		m_nFps = FK2DEngine::GetFPS();
	}
Пример #2
0
void
CStarField::ParseStarsCatalog( const std::vector<unsigned char>& in_rData, std::vector<unsigned char>& out_rVBData )
{
	CLog::Print("ParseStarsCatalog()\n");
	std::list< CStar > StarsArray;
	const char* pBegin = (const char*)&in_rData[0];
	const char* pEnd = pBegin+in_rData.size();
	for( ; pBegin!=pEnd; )
	{
		const char* pEndLine = pBegin;
		while( pEndLine!=pEnd && *pEndLine!='\r' && *pEndLine!='\n')
			pEndLine++;
		// line is:  [pBegin..pEndLine)
		if(pBegin!=pEndLine)
		{
			// decode line
			std::string S(pBegin,pEndLine-pBegin);
			const char* pS = S.c_str();
			if(*pS != '#')
			{
				float DolgotaHour = 0.0f;
				float DolgotaMin = 0.0f;
				float DolgotaSec = 0.0f;
				float ShirotaDeg = 0.0f;
				float ShirotaMin = 0.0f;
				float ShirotaSec = 0.0f;
				float Magnitude  = 0.0f;
				bool Ok = false;
				do
				{
					// comma after traditional name
					const char* pComma = strchr(pS,',');
					if(!pComma)
						break;
					pS = pComma+1;
					// comma after nomenclature name
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					pS = pComma+1;
					// comma after equinox
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					pS = pComma+1;
					// comma after Dolgota Deg
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					DolgotaHour = atof( std::string(pS,pComma-pS).c_str() );
					pS = pComma+1;
					// comma after Dolgota Min
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					DolgotaMin = atof( std::string(pS,pComma-pS).c_str() );
					pS = pComma+1;
					// comma after Dolgota Sec
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					DolgotaSec = atof( std::string(pS,pComma-pS).c_str() );
					pS = pComma+1;
					// comma after Shirota Deg
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					ShirotaDeg = atof( std::string(pS,pComma-pS).c_str() );
					pS = pComma+1;
					// comma after Shirota Min
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					ShirotaMin = atof( std::string(pS,pComma-pS).c_str() );
					pS = pComma+1;
					// comma after Shirota Sec
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					ShirotaSec = atof( std::string(pS,pComma-pS).c_str() );
					pS = pComma+1;
					// comma after Motion 1
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					pS = pComma+1;
					// comma after Motion 2
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					pS = pComma+1;
					// comma after velocity
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					pS = pComma+1;
					// comma after parallax
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					pS = pComma+1;
					// comma after Magnitude
					pComma = strchr(pS,',');
					if(!pComma)
						break;
					Magnitude = atof( std::string(pS,pComma-pS).c_str() );
					Ok = true;
				} while(false);
				if(Ok)
				{
					//CLog::Print("  dolgota = %1.2f %1.2f %1.2f\n",DolgotaHour,DolgotaMin,DolgotaSec);
					//CLog::Print("  shirota = %1.2f %1.2f %1.2f\n",ShirotaDeg,ShirotaMin,ShirotaSec);
					//CLog::Print("  magnitude = %1.2f\n",Magnitude);
					float Dolgota = DolgotaHour + DolgotaMin/60.0f + DolgotaSec/3600.0f;
					Dolgota *= (CONST_2PI/24.0f);
					float Shirota = ShirotaDeg + ShirotaMin/60.0f + ShirotaSec/3600.0f;
					Shirota *= (CONST_PI_2/90.0f);
					Magnitude = (Magnitude<-2.0f) ? -2.0f : ((Magnitude>6.0f)?6.0f:Magnitude);
					assert(Magnitude>=-2.0f && Magnitude<=6.0f);
					float k=-0.9f/8.0f;
					float b=1.0f-(0.9f/4.0f);
					Magnitude = k*Magnitude+b;
					Magnitude = (Magnitude<0.1f) ? 0.1f : ((Magnitude>1.0f)?1.0f:Magnitude);
					assert(Magnitude>=0.1f && Magnitude<=1.0f);
					StarsArray.push_back( CStar(Shirota,Dolgota,Magnitude) );
				}
			}
		}
		while( pEndLine!=pEnd && (*pEndLine=='\r' || *pEndLine=='\n') )
			pEndLine++;
		pBegin = pEndLine;
	}

	// generate VB data
	CLog::Print("  %ld stars\n",StarsArray.size());
	out_rVBData.resize( StarsArray.size() * 6 * ( 3*sizeof(float) + 2*sizeof(float) ) );
	unsigned char* pDstBegin = (unsigned char*)&out_rVBData[0];
	unsigned char* pDstEnd = pDstBegin+out_rVBData.size();
	for( std::list<CStar>::const_iterator It = StarsArray.begin(); It!=StarsArray.end(); ++It )
	{
		//
		CVector Dir(
			cos(It->m_Shirota)*sin(It->m_Dolgota),
			sin(It->m_Shirota),
			cos(It->m_Shirota)*cos(It->m_Dolgota)
		);
		Dir.Normalize();
		//
		CVector QQ;
		if( CONST_PI_4 < fabs(It->m_Shirota) )
			QQ = CVector(1,0,0);
		else
			QQ = CVector(0,1,0);
		//
		CVector Right( Dir*QQ );
		Right.Normalize();
		CVector Up( Right*Dir );
		Up.Normalize();
		//
		Dir   *= 10.0f;
		Right *= 0.1f*It->m_Size;
		Up    *= 0.1f*It->m_Size;
		//
		assert( pDstBegin + 6 * ( 3*sizeof(float) + 2*sizeof(float) ) <= pDstEnd );
		CVector VUp = Dir+Up;
		CVector VRight = Dir+Right;
		CVector VDown = Dir-Up;
		CVector VLeft = Dir-Right;
		// v1
		*( (CVector*)pDstBegin ) = VUp;
		pDstBegin += 3*sizeof(float);
		*( (float*)pDstBegin ) = 1.0f;
		pDstBegin += sizeof(float);
		*( (float*)pDstBegin ) = 0.0f;
		pDstBegin += sizeof(float);
		// v2
		*( (CVector*)pDstBegin ) = VRight;
		pDstBegin += 3*sizeof(float);
		*( (float*)pDstBegin ) = 1.0f;
		pDstBegin += sizeof(float);
		*( (float*)pDstBegin ) = 1.0f;
		pDstBegin += sizeof(float);
		// v3
		*( (CVector*)pDstBegin ) = VDown;
		pDstBegin += 3*sizeof(float);
		*( (float*)pDstBegin ) = 0.0f;
		pDstBegin += sizeof(float);
		*( (float*)pDstBegin ) = 1.0f;
		pDstBegin += sizeof(float);
		// v4
		*( (CVector*)pDstBegin ) = VDown;
		pDstBegin += 3*sizeof(float);
		*( (float*)pDstBegin ) = 0.0f;
		pDstBegin += sizeof(float);
		*( (float*)pDstBegin ) = 1.0f;
		pDstBegin += sizeof(float);
		// v5
		*( (CVector*)pDstBegin ) = VLeft;
		pDstBegin += 3*sizeof(float);
		*( (float*)pDstBegin ) = 0.0f;
		pDstBegin += sizeof(float);
		*( (float*)pDstBegin ) = 0.0f;
		pDstBegin += sizeof(float);
		// v6
		*( (CVector*)pDstBegin ) = VUp;
		pDstBegin += 3*sizeof(float);
		*( (float*)pDstBegin ) = 1.0f;
		pDstBegin += sizeof(float);
		*( (float*)pDstBegin ) = 0.0f;
		pDstBegin += sizeof(float);
	}
	m_PrimitiveType = PRIM_TRIANGLE_LIST;
	m_PrimitiveCount = 2*StarsArray.size();
}