コード例 #1
0
ファイル: PlayState.cpp プロジェクト: enriqueforner/Hunter
 void PlayState::CreationWolf(){ //Poner wolves
    int posH = 4;
    int H = -20;
    int V = 0;
    for (int i = 0; i < 19; ++i){  
      Entity *entity = NULL;
      
      std::stringstream uniqueName;
      uniqueName <<"wolf" << _numEntities; 
      
      OBEntity *obentity = new OBEntity(uniqueName.str()); 
      
      entity = _sceneMgr->createEntity(uniqueName.str(), "Lobo.mesh");     

      SceneNode *node = _sceneMgr->getRootSceneNode()->
      createChildSceneNode(entity->getName());
      node->attachObject(entity);

      node->yaw(Ogre::Degree(180));

      obentity->setSceneNode(node);

      OgreBulletCollisions::StaticMeshToShapeConverter *trimeshConverter = NULL; 
      OgreBulletCollisions::CollisionShape *bodyShape = NULL;
      OgreBulletDynamics::RigidBody *rigidBody = NULL;

      trimeshConverter = new 
      OgreBulletCollisions::StaticMeshToShapeConverter(entity);
      bodyShape = trimeshConverter->createConvex();
      delete trimeshConverter;

      obentity->setCollisionShape(bodyShape);
      rigidBody = new OgreBulletDynamics::RigidBody(uniqueName.str(), _world);

      rigidBody->setShape(node, bodyShape,
         0.0 /* Restitucion */, 0.6 /* Friccion */,
         150.0 /* Masa */, Ogre::Vector3(-70 + V, 0, H + posH),  // 0,0,35
         node->_getDerivedOrientation()/* Orientacion */); 
      rigidBody->setLinearVelocity(Ogre::Vector3::ZERO);

      obentity->setRigidBody(rigidBody);  
   
      _obEntities.push_back(obentity);
      _numEntities ++;
      posH = posH + 4;
      if(i ==9){
          H = -20;
          posH = 6;
          V = -10;
      }
    }  
 }
コード例 #2
0
    void PhysicsManager::addLevelGeometry( Ogre::Entity* levelEntity, const std::vector<OgreNewt::CollisionPtr> &collisions)
    {
        RlAssert1(levelEntity);
        RlAssert1(levelEntity->getParentSceneNode());

        SceneNode* node = levelEntity->getParentSceneNode();
        //Level entity has to be attached to a scene node.
        

        // try one compound collision for the entity if there are several collisions
        OgreNewt::CollisionPtr collision;
        switch( collisions.size() )
        {
            case 0:
                break;
            case 1:
                collision = collisions[0];
                break;
            default:
                collision = OgreNewt::CollisionPtr(new OgreNewt::CollisionPrimitives::CompoundCollision(mWorld, collisions, 0));
                break;
        }

        if( collision )
        {
            OgreNewt::Body* body = new OgreNewt::Body(mWorld, collision );


            body->attachNode(node);
            body->setPositionOrientation(node->_getDerivedPosition(),
                node->_getDerivedOrientation());
            body->setMaterialGroupID(getMaterialID("level"));

            mLevelBodiesQuadTree.add(body);
            //mLevelBodies.push_back(body);
        }

        // adjust worldAABB
        Vector3 minV(mWorldAABB.getMinimum());
        Vector3 maxV(mWorldAABB.getMaximum());

        AxisAlignedBox entityAABB = levelEntity->getWorldBoundingBox(true);
        minV.makeFloor(entityAABB.getMinimum());
        maxV.makeCeil(entityAABB.getMaximum());
        mWorldAABB.setMinimum(minV - Vector3(50, 50, 50));
        mWorldAABB.setMaximum(maxV + Vector3(50, 50, 50));

        mWorld->setWorldSize(mWorldAABB);
    }
	void ControllerInput::Tick(double Tick, double Span)
    {	
		if (!IsInitialized)
			return;

		/********************* READ INPUT *********************/
		/*        This will raise the event handlers          */   
		/******************************************************/
		
		if (!oisKeyboard || !oisMouse)
			return;

		oisKeyboard->capture();
		oisMouse->capture();
				
		/********************* EXIT CASES *********************/
		/*        Don't go on if any of these match           */
		/******************************************************/
		
		if (OgreClient::Singleton->Data->IsWaiting ||
			!OgreClient::Singleton->RenderWindow ||
			!OgreClient::Singleton->RenderWindow->isVisible() ||
			!OgreClient::Singleton->RenderWindow->isActive() ||
			!OgreClient::Singleton->HasFocus ||
			Avatar == nullptr ||
			Avatar->SceneNode == nullptr)
			return;
		
		/*************** SELF TARGET MODIFIER *****************/
		/*         Process keydown of some specific keys      */
		/******************************************************/

		// update flag whether selftarget modifier key is down     
		OgreClient::Singleton->Data->SelfTarget = IsSelfTargetDown;

		/****************** CAMERA PITCH/YAW ******************/
		/*      Apply frame-based smooth camera pitch/yaw     */
		/******************************************************/	
		
		SceneNode* cameraNode = OgreClient::Singleton->CameraNode;
		Camera* camera = OgreClient::Singleton->Camera;

		if (cameraNode && camera)
		{
			// get cameranode orientation
			Quaternion orientation = cameraNode->_getDerivedOrientation();

			// save/update current pitch and yaw values
			cameraPitchCurrent = orientation.getPitch().valueRadians();
			cameraYawCurrent = orientation.getYaw().valueRadians();

			// calculate new pitch and yaw values for this step/frame
			float destPitch = cameraPitchCurrent + cameraPitchStep;
			float destYaw = cameraYawCurrent + cameraYawStep;			

			// 1. PITCH						
			if (cameraPitchDelta != 0.0f)
			{
				// apply pitchstep on camera
				cameraNode->pitch(Radian(-cameraPitchStep));	
				
				// verify pitchover
				Quaternion orientation = cameraNode->_getDerivedOrientation();
				float pitchOver = orientation.getPitch().valueRadians();
			
				// don't allow overpitching, so pitch back possibly
				if (pitchOver >= Math::HALF_PI ||
					pitchOver <= -Math::HALF_PI)
				{
					cameraNode->pitch(Radian(cameraPitchStep));
					cameraPitchDelta = 0.0f;
					cameraPitchStep = 0.0f;
				}
				else if (cameraPitchDelta > 0.0f)
				{
					cameraPitchDelta -= cameraPitchStep;
					cameraPitchDelta = ::System::Math::Max(cameraPitchDelta, 0.0f);
				}
				else if (cameraPitchDelta < 0.0f)
				{
					cameraPitchDelta -= cameraPitchStep;
					cameraPitchDelta = ::System::Math::Min(cameraPitchDelta, 0.0f);
				}			
			}
			
			// 2. YAW
			if (cameraYawDelta != 0.0f)
			{
				// apply yawstep on camera
				cameraNode->yaw(Radian(-cameraYawStep), Node::TransformSpace::TS_WORLD);

				if (cameraYawDelta > 0.0f)
				{
					cameraYawDelta -= cameraYawStep;
					cameraYawDelta = ::System::Math::Max(cameraYawDelta, 0.0f);
				}
				else if (cameraYawDelta < 0.0f)
				{
					cameraYawDelta -= cameraYawStep;
					cameraYawDelta = ::System::Math::Min(cameraYawDelta, 0.0f);
				}
			}

			// 3. ZOOM
			if (cameraZDelta != 0.0f)
			{	
				float destZ = camera->getPosition().z - cameraZStep;

				//
				if (destZ > 0.0f)
				{
					// mark as 3. person camera mode
					IsCameraFirstPerson = false;
					
					// hide 1. person overlays
					ControllerUI::PlayerOverlays::HideOverlays();

					// apply the move
					camera->moveRelative(::Ogre::Vector3(0.0f, 0.0f, -cameraZStep));
					camera->_notifyMoved();
 
					if (cameraZDelta > 0.0f)
					{									
						cameraZDelta -= cameraZStep;
						cameraZDelta = ::System::Math::Max(cameraZDelta, 0.0f);
					}
					else if (cameraZDelta < 0.0f)
					{
						cameraZDelta -= cameraZStep;
						cameraZDelta = ::System::Math::Min(cameraZDelta, 0.0f);
					}
				}
				else
				{
					// mark as 1. person camera mode
					IsCameraFirstPerson = true;

					// show 1. person overlays
					ControllerUI::PlayerOverlays::ShowOverlays();

					// apply the move to the 0.0f
					camera->moveRelative(::Ogre::Vector3(0.0f, 0.0f, -cameraZStep - destZ));
					camera->_notifyMoved();
 
					cameraZDelta = 0.0f;
				}
			}
		}

		/********************* AVATAR YAW *********************/
		/*         Apply frame-based smooth avatar yaw        */
		/******************************************************/	
		
		// YAW
		if (avatarYawDelta != 0.0f)
		{
			// apply yawstep on avatar
			OgreClient::Singleton->TryYaw(avatarYawStep);

			if (avatarYawDelta > 0.0f)
			{
				avatarYawDelta -= avatarYawStep;
				avatarYawDelta = ::System::Math::Max(avatarYawDelta, 0.0f);
			}
			else if (avatarYawDelta < 0.0f)
			{
				avatarYawDelta -= avatarYawStep;
				avatarYawDelta = ::System::Math::Min(avatarYawDelta, 0.0f);
			}
		}

		/********************* MOVEMENT INPUT *****************/
		/*  left, right, up, down keys or both mouse buttons  */
		/******************************************************/	
		
		bool isMoveByMouseOrKeysNotUsedByUI = 
			(IsMovementInput && (IsBothMouseDown || !ControllerUI::ProcessingInput));

		if (isAutoMove || isMoveByMouseOrKeysNotUsedByUI)
		{
			// get movespeed based on walk-modifier key
			MovementSpeed speed = (IsWalkKeyDown) ? MovementSpeed::Walk : MovementSpeed::Run;
			
			// get movement direction vector
			V2 direction = GetMoveVector();

			// get the height of the avatar in ROO format
			float playerheight = 0.9f * 16.0f * Avatar->SceneNode->_getWorldAABB().getSize().y;
				
			// try to do the move (might get blocked)				
			OgreClient::Singleton->TryMove(direction, (unsigned char)speed, playerheight);
		}
				
		/************** KEYBOARD ONLY FROM HERE ON ************/
		/*               exit if UI is reading it             */
		/******************************************************/

		if (ControllerUI::ProcessingInput)
			return;
		
		/******************** ROTATION KEYS *******************/
		/*             rotate left/right by keyboard          */
		/******************************************************/	
		
        // Update Angle in dataobject and possibly send a update packet                  
		if (IsRotateKeyDown)
        {									          
            // scaled base delta
            float diff = KEYROTATESPEED * (float)OgreClient::Singleton->Config->KeyRotateSpeed * (float)OgreClient::Singleton->GameTick->Span;
			
			// half rotation speed on walk
			if (IsWalkKeyDown)
				diff *= 0.5f;

            // left
            if (OISKeyboard->isKeyDown(ActiveKeyBinding->RotateLeft))
            {
				// try to yaw and yaw camera back internally if suceeded
                if (OgreClient::Singleton->TryYaw(-diff) && IsLeftMouseDown && !isMouseWentDownOnUI)
                    cameraNode->yaw(Radian(-diff), Node::TransformSpace::TS_WORLD);
            }

            // right
            if (OISKeyboard->isKeyDown(ActiveKeyBinding->RotateRight))
            {
                // try to yaw and yaw camera back internally if suceeded                   
                if (OgreClient::Singleton->TryYaw(diff) && IsLeftMouseDown && !isMouseWentDownOnUI)
                    cameraNode->yaw(Radian(diff), Node::TransformSpace::TS_WORLD);
            }
		}
		
		/**************** ACTION BUTTON KEYS ******************/
		/*       these will trigger the defined actions       */
		/******************************************************/	

		ActionButtonList^ actionButtons = OgreClient::Singleton->Data->ActionButtons;

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton01))		
			actionButtons[0]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton02))		
			actionButtons[1]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton03))		
			actionButtons[2]->Activate();
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton04))		
			actionButtons[3]->Activate();
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton05))	
			actionButtons[4]->Activate();
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton06))		
			actionButtons[5]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton07))	
			actionButtons[6]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton08))		
			actionButtons[7]->Activate();		
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton09))		
			actionButtons[8]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton10))		
			actionButtons[9]->Activate();
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton11))		
			actionButtons[10]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton12))		
			actionButtons[11]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton13))
			actionButtons[12]->Activate();
				
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton14))
			actionButtons[13]->Activate();
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton15))		
			actionButtons[14]->Activate();
				
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton16))		
			actionButtons[15]->Activate();	
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton17))		
			actionButtons[16]->Activate();
					
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton18))		
			actionButtons[17]->Activate();
				
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton19))		
			actionButtons[18]->Activate();		
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton20))		
			actionButtons[19]->Activate();		
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton21))	
			actionButtons[20]->Activate();
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton22))	
			actionButtons[21]->Activate();		
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton23))
			actionButtons[22]->Activate();
			
		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton24))
			actionButtons[23]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton25))
			actionButtons[24]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton26))
			actionButtons[25]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton27))
			actionButtons[26]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton28))
			actionButtons[27]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton29))
			actionButtons[28]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton30))
			actionButtons[29]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton31))
			actionButtons[30]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton32))
			actionButtons[31]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton33))
			actionButtons[32]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton34))
			actionButtons[33]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton35))
			actionButtons[34]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton36))
			actionButtons[35]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton37))
			actionButtons[36]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton38))
			actionButtons[37]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton39))
			actionButtons[38]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton40))
			actionButtons[39]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton41))
			actionButtons[40]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton42))
			actionButtons[41]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton43))
			actionButtons[42]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton44))
			actionButtons[43]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton45))
			actionButtons[44]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton46))
			actionButtons[45]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton47))
			actionButtons[46]->Activate();

		if (oisKeyboard->isKeyDown(ActiveKeyBinding->ActionButton48))
			actionButtons[47]->Activate();
    };