Example #1
0
	// Dispara rayos mediante raycast dependiendo de los parametros del arquetipo del arma
	CEntity* CShootRaycast::fireWeapon() {
		//Direccion
		Vector3 direction = _entity->getOrientation()*Vector3::NEGATIVE_UNIT_Z; //Ojo con las mallas y su orientacion ( o lo mismo es rollo 3quaternion)
		//Me dispongo a calcular la desviacion del arma, en el map.txt se pondra en grados de dispersion (0 => sin dispersion)
		Ogre::Radian angle = Ogre::Radian( (  (((float)(rand() % 100))/100.0f) * (_dispersion)) /100);
		//Esto hace un random total, lo que significa, por ejemplo, que puede que todas las balas vayan hacia la derecha 
		Vector3 dispersionDirection = direction.randomDeviant(angle);
		dispersionDirection.normalise();

		std::cout << "Angulo: " << angle << std::endl;

		//El origen debe ser mínimo la capsula (si chocamos el disparo en la capsula al mirar en diferentes direcciones ya esta tratado en la funcion de colision)
		//Posicion de la entidad + altura de disparo(coincidente con la altura de la camara)
		Vector3 origin = _entity->getPosition()+Vector3(0.0f,_heightShoot,0.0f);
		// Creamos el ray desde el origen en la direccion del raton (desvio ya aplicado)
		Ray ray(origin, dispersionDirection);
			
		// Dibujamos el rayo en ogre para poder depurar
		//drawRaycast(ray);

		//Comprobación de si da al mundo
		Physics::CRaycastHit hits2;
		bool disp = Physics::CServer::getSingletonPtr()->raycastSingle(ray, _distance,hits2, Physics::CollisionGroup::eWORLD);
		if (disp)
		{
			Vector3 pos = hits2.impact;
			std::cout << "-------He dado " << pos << std::endl;
			decals(hits2.entity, hits2.impact);

			// Añado aqui las particulas de dado en la pared.
			auto m = std::make_shared<CMessageCreateParticle>();
			m->setPosition(hits2.impact);
			m->setParticle("impactParticle");
			m->setDirectionWithForce(hits2.normal);
			hits2.entity->emitMessage(m);

		}

		// Rayo lanzado por el servidor de físicas de acuerdo a la distancia de potencia del arma
		std::vector<Physics::CRaycastHit> hits;
		Physics::CServer::getSingletonPtr()->raycastMultiple(ray, _distance,hits, true, Physics::CollisionGroup::ePLAYER);

		//Devolvemos lo primero tocado que no seamos nosotros mismos
		CEntity* touched=NULL;
		for(int i=0;i<hits.size();++i)
			if(hits[i].entity!=_entity)
				touched=hits[i].entity;
		return touched;
		
	}// fireWeapon
Example #2
0
int main(int argc, char *argv[]) {
	
	//initCube(&cube0, 30.0f, 30.0f, 30.0f);
		
	setParticle(particles, isovalue);

	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // TODO: test on psp
	glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT); // TODO: test on psp
	glutInitWindowPosition(0,0); // TODO: test on psp
	glutCreateWindow(__FILE__);
	glutKeyboardFunc(keydown);
	glutKeyboardUpFunc(keyup);
	glutJoystickFunc(joystick, 0);
	//glutReshapeFunc(reshape);
	//glutReshapeFunc(setupGL);
	glutDisplayFunc(display2);

	setupGL(SCREEN_WIDTH, SCREEN_HEIGHT);

	glutMainLoop();

	return 0;
}
void MosquitoBase::update(float timePass)
{
	if(m_pBody != NULL)
	{
		if(m_pMove != NULL)
		{
			switch(m_eState)
			{
			case eMosquitoMove:
				{
					bool bDestory = false;
					m_pMove->update(bDestory, timePass * m_fMoveSpeed);

					Ogre::Vector3 pos= m_pMove->getPosition();
					Ogre::Quaternion q= m_pMove->getOrientation();
					m_pBody->update(timePass, (float *)&pos, (float *)&q);
					if(pos.z > MAX_ALERT_DIST)
					{
						m_eState = eMosquitoAlert;
						setParticle("Circle");
					}
				}
				break;
			case eMosquitoAlert:
				{
					bool bDestory = false;
					m_pMove->update(bDestory, timePass * m_fMoveSpeed);

					Ogre::Vector3 pos= m_pMove->getPosition();
					Ogre::Quaternion q= m_pMove->getOrientation();
					m_pBody->update(timePass, (float *)&pos, (float *)&q);
					if(bDestory)
						setState(eMosquitoBlood);
				}
				break;
			case  eMosquitoBlood:
				m_fTimer += timePass;
				if(m_fTimer > MAX_WAIT_BLOOD_TIME)
				{
					GameSystem::getInstance()->reduceBlood();
					setState(eMosuqitoDead);
				}
				break;
			case eMosuqitoHit:
			case eMosuqitoCut:
				m_fTimer += timePass;
				m_pBody->update(timePass);

				if(m_fTimer > MAX_WAIT_DEAD_TIME)
				{
					setState(eMosuqitoDead);
				}
				break;
			case eMosuqitoDead:
				m_bDestory = true;
				break;
			default:
				break;
			}
		}
	}
}