// 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
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; } } } }