本文整理汇总了C++中ogre::RaySceneQuery类的典型用法代码示例。如果您正苦于以下问题:C++ RaySceneQuery类的具体用法?C++ RaySceneQuery怎么用?C++ RaySceneQuery使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了RaySceneQuery类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1:
Ogre::Vector3 CCS::FreeCameraMode::getFirstRealHit(Ogre::Vector3 origin, Ogre::Vector3 direction)
{
Ogre::Vector3 hit = origin;
Ogre::Real minDistance = std::numeric_limits<Ogre::Real>::max();
Ogre::RaySceneQuery *raySceneQuery = mCameraCS2->getSceneManager()->createRayQuery(Ogre::Ray(origin, direction));
Ogre::RaySceneQueryResult &result = raySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator itr = result.begin();
bool intersect = false;
while (itr != result.end() /*&& !intersect*/) // ToDo: are the results ordered ??
{
if( itr->distance < minDistance // take the shorter
&& itr->movable->getParentSceneNode() != mCameraCS2->getCameraSceneNode()
&& itr->movable->getParentSceneNode() != mCameraCS2->getTargetSceneNode())
{
minDistance = itr->distance;
intersect = true;
if(itr->worldFragment)
{
hit = itr->worldFragment->singleIntersection;
}
else //if(itr->movable)
{
hit = origin + (direction * itr->distance);
}
}
itr++;
}
mCameraCS2->getSceneManager()->destroyQuery(raySceneQuery);
return hit;
}
开发者ID:LiMuBei,项目名称:ovise,代码行数:35,代码来源:CCSFreeCameraMode.cpp
示例2: mousePressed
bool BaselinePattern::mousePressed(const OIS::MouseEvent &evt, OIS::MouseButtonID id)
{
Ogre::Ray ray = OgreFramework::getSingletonPtr()->getCursorRay();
Ogre::RaySceneQuery* query = OgreFramework::getSingletonPtr()->m_pSceneMgr->createRayQuery(ray);
query->setSortByDistance(true);
Ogre::RaySceneQueryResult result = query->execute();
//Handle Selection
if (stage->selected == NULL) {
if (result.size() > 0 && result[0].movable != NULL) {
for (int i = 0; i < stage->poppies.size(); ++i)
if ( stage->poppies[i]->hasEntity( (Ogre::Entity*)result[0].movable ) ) {
stage->poppies[i]->setColor(getRandomPotColor());
stage->selected = stage->poppies[i];
stage->poppies[i]->deactivateJump();
//soundPickUp->play();
}
for (int i = 0; i < stage->pots.size(); ++i)
if (stage->pots[i]->hasEntity( (Ogre::Entity*)result[0].movable) )
stage->pots[i]->setColor(getRandomPotColor());
}
}
return true;
}
开发者ID:animekraxe,项目名称:brain-game,代码行数:27,代码来源:BaselinePattern.cpp
示例3: quickSelect
bool DemoApp::quickSelect()
{
// Create RaySceneQuery
Ogre::Ray mouseRay = mCamera->getCameraToViewportRay(static_cast<float>(mMouse->getMouseState().X.abs)/mMouse->getMouseState().width, static_cast<float>(mMouse->getMouseState().Y.abs)/mMouse->getMouseState().height);
Ogre::RaySceneQuery * mRaySceneQuery = mSceneMgr->createRayQuery(Ogre::Ray());
// Set ray
mRaySceneQuery->setRay(mouseRay);
mRaySceneQuery->setQueryTypeMask(Ogre::SceneManager::ENTITY_TYPE_MASK);
mRaySceneQuery->setSortByDistance(true);
// Ray-cast and get first hit
Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator itr = result.begin();
if((itr != result.end() && itr->movable))
{
//Get hit location
Ogre::String name = itr->movable->getName();
bool found=false;
if(name=="Box")
{
itr++;
name = itr->movable->getName();
}
for(int i=0;i<TANK_LIMIT;i++)
{
if(name=="Tank"+std::to_string(i))
{
tanks.at(i).selected=true;
if(tanks.at(i).mSelectionCircle->getParentSceneNode()!=tanks.at(i).tankNode)
tanks.at(i).tankNode->attachObject(tanks.at(i).mSelectionCircle);
if(tanks.at(i).mHealthBar->getParentSceneNode()!=tanks.at(i).tankNode)
tanks.at(i).tankNode->attachObject(tanks.at(i).mHealthBar);
found=true;
tanks.at(i).path2->setVisible(true);
}
else if(controlPressed==false)
{
tanks.at(i).selected=false;
if(tanks.at(i).mSelectionCircle->getParentSceneNode()==tanks.at(i).tankNode)
tanks.at(i).tankNode->detachObject(tanks.at(i).mSelectionCircle);
if(tanks.at(i).mHealthBar->getParentSceneNode()==tanks.at(i).tankNode)
tanks.at(i).tankNode->detachObject(tanks.at(i).mHealthBar);
tanks.at(i).path2->setVisible(false);
}
}
if(found==false)
return false;
else return true;
}
return false;
}
开发者ID:Pured,项目名称:CSCI356,代码行数:58,代码来源:Camera.cpp
示例4: collision
//-------------------------------------------------------------------------------------
///controls collision in given direction (true-front false-back)
bool Player::collision(bool goAhead){
Ogre::Ray ray = Ogre::Ray(sceneNode->getPosition(), getDirection(sceneNode->getOrientation(),goAhead));
Ogre::RaySceneQuery* mRaySceneQuery = manager->createRayQuery(ray);
Ogre::RaySceneQueryResult result = mRaySceneQuery->execute();
for(Ogre::RaySceneQueryResult::iterator it = result.begin(); it != result.end() ; ++it){
if((it->distance < farFarAway)&& (it->distance > 0)){
return true;
}
}
return false;
}
开发者ID:vavrekmichal,项目名称:OgreApp1,代码行数:14,代码来源:Player.cpp
示例5: make_pair
std::pair<DetectionResult, DetectionIterator&> ViewDetection::detectObjects() {
//Ogre::ResourceGroupManager::getSingletonPtr();
//Ogre::OverlayManager* mg = Ogre::OverlayManager::getSingletonPtr();
//Ogre::Overlay* ov = mg->getByName("TestScriptOverlay");
Ogre::RaySceneQuery* rayQuery = viewManager->createRayQuery(*detection);
rayQuery->setSortByDistance(true);
DetectionResult result = rayQuery->execute();
DetectionIterator& endOfResult = filterObjects(result);
return std::make_pair(result, endOfResult);
}
开发者ID:RichardvanRijn,项目名称:GameMinor,代码行数:13,代码来源:viewdetection.cpp
示例6: ray
const ActorVector& OgreRaySceneQuery::execute()
{
// Clear last results
mResult.clear();
Ray ray(getRayStart(), (getRayEnd() - getRayStart()).normalisedCopy());
Ogre::RaySceneQuery* query = CoreSubsystem::getSingleton().getWorld()->getSceneManager()
->createRayQuery(ray, getQueryMask());
query->execute(this);
return mResult;
}
开发者ID:BackupTheBerlios,项目名称:dsa-hl-svn,代码行数:14,代码来源:SceneQuery.cpp
示例7: CheckAndRespawnPlayers
void Game::CheckAndRespawnPlayers()
{
// When A Player is dead, he is simply invisible
for (std::vector<RenderableChar*>::iterator ite = local_players.begin(); ite != local_players.end(); ++ite) {
if ( (*ite)->getCharState() == RenderableChar::SPAWNING ) {
std::cout << "I should respawn!" << std::endl;
(*ite)->resetVelX();
(*ite)->resetVelY();
(*ite)->setCharState(RenderableChar::IDLE);
bool free = false;
Ogre::RaySceneQuery* msq;
float x;
float y;
int c = 0;
// Here, we look for a position in the level which is collision free
// TODO: IN NARROW LEVELS, THIS CAN LEAD TO INFINITE LOOPS!
do {
if (c > 20) {
x = 10.0f;
y = 10.0f;
free = true;
}
x = Ogre::Math::RangeRandom(myLevel->getObjectSide(), myLevel->getObjectSide() * (myLevel->getWidth() -1));
y = Ogre::Math::RangeRandom(myLevel->getObjectSide(), myLevel->getObjectSide() * (myLevel->getHeight()));
std::cout << "GENX: " << x << " --- GENY: " << y << std::endl;
msq = OgreFW::getSingletonPtr()->m_pSceneMgr->createRayQuery(Ogre::Ray(Ogre::Vector3(x, y, 0.0f), Ogre::Vector3::UNIT_Y));
msq->setSortByDistance(true, 3);
//Ogre::RaySceneQuery msq->setRay(Ogre::Ray( ( (*ite)->getWorldPosition() + Ogre::Vector3(0.0f, (*ite)->getAABB().getHalfSize().y, 0.0f) ), Ogre::Vector3::UNIT_Y ));
Ogre::RaySceneQueryResult& result = msq->execute();
for (Ogre::RaySceneQueryResult::iterator itr = result.begin(); itr != result.end(); ++itr) {
if ( itr->distance >= (*ite)->getAABB().getSize().x ){
free = true;
break;
}
}
c++;
} while (free != true);
(*ite)->SetPosition(Ogre::Vector3(x, y + 0.1, 0.0f));
(*ite)->setVisible(true);
msq->clearResults();
}
}
}
开发者ID:winterismute,项目名称:JumpingNinjas,代码行数:48,代码来源:Game.cpp
示例8: pSceneNode
//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
void
RenderingCanvas::querySceneNodes(Math::Real _x, Math::Real _y, I_SceneNodeVisitor& _visitor)
{
Ogre::Camera& camera = m_pCurrentCamera->getOgreCamera();
Ogre::Vector3 position;
if( camera.getParentSceneNode() )
{
position = camera.getParentSceneNode()->_getDerivedPosition();
}
else
{
position = camera.getDerivedPosition();
}
Ogre::RaySceneQuery* pSceneQuery =
m_pSceneManager->createRayQuery(camera.getCameraToViewportRay(_x, _y));
pSceneQuery->setSortByDistance(true);
Ogre::RaySceneQueryResult::const_iterator iter;
const Ogre::RaySceneQueryResult& queryResult = pSceneQuery->execute();
_visitor.begin();
for(iter = queryResult.begin(); iter != queryResult.end(); iter++)
{
const Ogre::RaySceneQueryResultEntry& result = *iter;
// Check to see if this is a scene node.
if (result.movable != NULL)
{
Ogre::SceneNode *pNode = dynamic_cast<Ogre::SceneNode*>(result.movable->getParentSceneNode());
if (pNode)
{
if (!pNode->getUserAny().isEmpty())
{
SceneNode* pRawSceneNode = Ogre::any_cast<SceneNode*>(pNode->getUserAny());
I_SceneNodeVisitor::pSceneNode_type pSceneNode(pRawSceneNode->getSelfReference().lock());
_visitor.visit(pSceneNode);
}
}
}
}
_visitor.end();
delete pSceneQuery;
}
开发者ID:SgtFlame,项目名称:indiezen,代码行数:48,代码来源:RenderingCanvas.cpp
示例9: createPalms
void createPalms(Ogre::SceneManager *mSceneMgr)
{
const int NumberOfPalms = 12;
Ogre::SceneNode* mPalmsSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
for (int k = 0; k < NumberOfPalms; k++)
{
Ogre::Vector3 RandomPos = Ogre::Vector3(rnd_(500,2500),
0,
rnd_(500,2500));
Ogre::RaySceneQuery * raySceneQuery = mSceneMgr->
createRayQuery(Ogre::Ray(RandomPos + Ogre::Vector3(0,1000000,0),
Ogre::Vector3::NEGATIVE_UNIT_Y));
Ogre::RaySceneQueryResult& qryResult = raySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment)
{
if (i->worldFragment->singleIntersection.y>105 || i->worldFragment->singleIntersection.y<20)
{
k--;
continue;
}
RandomPos.y = i->worldFragment->singleIntersection.y;
}
else
{
k--;
continue;
}
Ogre::Entity *mPalmEnt = mSceneMgr->createEntity("Palm"+Ogre::StringConverter::toString(k), "Palm.mesh");
Ogre::SceneNode *mPalmSN = mPalmsSceneNode->createChildSceneNode();
mPalmSN->rotate(Ogre::Vector3(-1,0,rnd_(-0.3,0.3)), Ogre::Degree(90));
mPalmSN->attachObject(mPalmEnt);
Ogre::Real Scale = rnd_(50,75);
mPalmSN->scale(Scale,Scale,Scale);
mPalmSN->setPosition(RandomPos);
}
}
开发者ID:coverxit,项目名称:fairytale,代码行数:45,代码来源:hydraxtest.cpp
示例10: mouseMoved
bool BaselinePattern::mouseMoved(const OIS::MouseEvent &evt)
{
Ogre::Ray ray = OgreFramework::getSingletonPtr()->getCursorRay();
Ogre::RaySceneQuery* query = OgreFramework::getSingletonPtr()->m_pSceneMgr->createRayQuery(ray);
query->setSortByDistance(true);
Ogre::RaySceneQueryResult result = query->execute();
if (stage->selected && stage->selected->getType() == Selectable::TYPE_POPPY)
for (int i = 0; i < result.size(); ++i)
if (stage->ground->hasEntity( (Entity*)result[i].movable )) {
Poppy* toMove = (Poppy*)stage->selected;
Vector3 hoverPos = ray * result[i].distance;
hoverPos.y = poppyRadius;
toMove->setPosition(hoverPos);
}
return true;
}
开发者ID:animekraxe,项目名称:brain-game,代码行数:18,代码来源:BaselinePattern.cpp
示例11: checkCameraHeight
void checkCameraHeight()
{
Ogre::RaySceneQuery *raySceneQuery =
m_sceneManager->
createRayQuery(Ogre::Ray(m_camera->getPosition() + Ogre::Vector3(0,10000,0),
Ogre::Vector3::NEGATIVE_UNIT_Y));
Ogre::RaySceneQueryResult& qryResult = raySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment)
{
if (m_camera->getPosition().y < i->worldFragment->singleIntersection.y + 30)
{
m_camera->setPosition(m_camera->getPosition().x, i->worldFragment->singleIntersection.y + 30, m_camera->getPosition().z);
}
}
delete raySceneQuery;
}
开发者ID:juanjmostazo,项目名称:ouan-tests,代码行数:18,代码来源:main.cpp
示例12: mouseReleased
bool BaselinePattern::mouseReleased(const OIS::MouseEvent &evt, OIS::MouseButtonID id)
{
Ogre::Ray ray = OgreFramework::getSingletonPtr()->getCursorRay();
Ogre::RaySceneQuery* query = OgreFramework::getSingletonPtr()->m_pSceneMgr->createRayQuery(ray);
query->setSortByDistance(true);
Ogre::RaySceneQueryResult result = query->execute();
if (stage->selected != NULL && stage->selected->getType() == Selectable::TYPE_POPPY && result.size() > 0) {
Poppy* old = (Poppy*)stage->selected;
stage->selected = NULL;
Vector3 placeDest = ray * result[0].distance;
placeDest.y = poppyRadius;
old->setPosition(placeDest);
old->activateJump();
}
return true;
}
开发者ID:animekraxe,项目名称:brain-game,代码行数:19,代码来源:BaselinePattern.cpp
示例13: finalCameraPosition
Ogre::Vector3 CCS::CollidableOrbitalCameraMode::DefaultCollisionDetectionFunction(Ogre::Vector3 cameraTargetPosition, Ogre::Vector3 cameraPosition)
{
Ogre::Vector3 finalCameraPosition (cameraPosition.x, cameraPosition.y, cameraPosition.z);
Ogre::RaySceneQuery *raySceneQuery = mCameraCS->getSceneManager()->createRayQuery(Ogre::Ray(cameraTargetPosition, cameraPosition));
// Perform the scene query
Ogre::RaySceneQueryResult &result = raySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator itr = result.begin();
// Get the results, set the camera height
if (itr != result.end() && itr->worldFragment)
{
finalCameraPosition = itr->worldFragment->singleIntersection;
}
mCameraCS->getSceneManager()->destroyQuery(raySceneQuery);
return finalCameraPosition;
}
开发者ID:Hindi,项目名称:OgreBullet,代码行数:20,代码来源:CCSCollidableOrbitalCameraMode.cpp
示例14: catch
WorldObject *RTSState::getObjectUnderRay(const Ogre::Ray &ray) const
{
EngineManager *mng = m_gameEngine->getManager();
Ogre::RaySceneQuery *query = mng->getGraphic()->getSceneManager()->createRayQuery(ray);
Ogre::RaySceneQueryResult &queryResult = query->execute();
for (Ogre::RaySceneQueryResultEntry & entry : queryResult)
{
if (entry.movable)
{
WorldObject *worldObject;
try
{
worldObject = Ogre::any_cast<WorldObject *>(entry.movable->getUserObjectBindings().getUserAny());
if (worldObject)
return worldObject;
}
catch (...) {}
}
}
mng->getGraphic()->getSceneManager()->destroyQuery(query);
return nullptr;
}
开发者ID:xabufr,项目名称:meteor-falls,代码行数:24,代码来源:RTSState.cpp
示例15: mouseReleaseEvent
void QOgreWindow::mouseReleaseEvent(QMouseEvent *e)
{
if (camMan) camMan->injectMouseUp(*e);
QPoint pos = e->pos();
Ogre::Ray mouseRay = oCam->getCameraToViewportRay(
(Ogre::Real)pos.x() / oWin->getWidth(),
(Ogre::Real)pos.y() / oWin->getHeight());
Ogre::RaySceneQuery* sceneQuery = oSceneMgr->createRayQuery(mouseRay);
sceneQuery->setSortByDistance(true);
Ogre::RaySceneQueryResult vResult = sceneQuery->execute();
for (size_t ui = 0; ui < vResult.size(); ui++)
{
if (vResult[ui].movable)
{
if (vResult[ui].movable->getMovableType().compare("Entity") == 0)
{
emit entitySelected((Ogre::Entity*)vResult[ui].movable);
}
}
}
oSceneMgr->destroyQuery(sceneQuery);
}
开发者ID:ZaibatsuTEAM,项目名称:PoneNgine,代码行数:24,代码来源:qogrewindow.cpp
示例16: Querytest
//-------------------------------------------------------------------------------------
bool RollerCoaster::Querytest()
{
Ogre::RaySceneQuery *mQuery = mSceneMgr->createRayQuery(Ogre::Ray());
Ogre::Vector3 direction =trainNode->getPosition()+
trainNode->_getDerivedOrientation()*Ogre::Vector3::UNIT_Z;
Ogre::Ray objRay( trainNode->getPosition(),direction);
mQuery->setRay(objRay);
Ogre::RaySceneQueryResult &result = mQuery->execute();
Ogre::RaySceneQueryResult::iterator iter = result.begin();
for (iter; iter!=result.end(); iter++)
{
if((*iter).movable->getName()== "mTarget")
{
return true;
}
}
mQuery->clearResults();
return false;
}
开发者ID:CyuanChen,项目名称:Roller-Coaster---computer-graphics-project-3,代码行数:25,代码来源:RollerCoaster.cpp
示例17: mouseDoubleClickEvent
void OgreWidget::mouseDoubleClickEvent(QMouseEvent *e)
{
if(e->buttons().testFlag(Qt::LeftButton))
{
Ogre::Real x = e->pos().x() / (float)width();
Ogre::Real y = e->pos().y() / (float)height();
Ogre::Ray ray = ogreCamera->getCameraToViewportRay(x, y);
Ogre::RaySceneQuery *query = ogreSceneManager->createRayQuery(ray);
Ogre::RaySceneQueryResult &queryResult = query->execute();
Ogre::RaySceneQueryResult::iterator queryResultIterator = queryResult.begin();
if(queryResultIterator != queryResult.end())
{
if(queryResultIterator->movable)
{
selectedNode = queryResultIterator->movable->getParentSceneNode();
selectedNode->showBoundingBox(true);
}
}
else
{
selectedNode->showBoundingBox(false);
selectedNode = 0;
}
ogreSceneManager->destroyQuery(query);
update();
e->accept();
}
else
{
e->ignore();
}
}
开发者ID:Orwel,项目名称:Modelisation_Aeronautique,代码行数:36,代码来源:ogrewidget.cpp
示例18: update
//.........这里部分代码省略.........
Ogre::Degree angle = getShootingAngle(targetPosition);
mTankTurretNode->lookAt(targetPosition, Ogre::Node::TransformSpace::TS_WORLD, Ogre::Vector3::NEGATIVE_UNIT_X);
//barrelDegree = angle;
if (weaponTimer > 4)
{
tnkMgr->createProjectile(mTankBodyNode->getPosition(), mTankTurretNode->_getDerivedOrientation(), angle, shootingVelocity, dmg);
weaponTimer = 0;
}
if (target->hp <= 0 || mTankBodyNode->getPosition().distance(target->getPosition()) > 600 )
currentState = WANDER;
}
case WANDER:
//wander(deltaTime);
wanderMovement(deltaTime);
break;
case SEEK:
//seek(mPowerUpSpawns[powerUpNo]->getPowerLocation(), deltaTime);
//seek(Ogre::Vector3::ZERO, deltaTime);
//seekMovement(deltaTime);
break;
case ESCAPE:
break;
case STOP:
break;
case POSSESSED: {
Ogre::Vector3 rayDest;
if (mMove < 0)
rayDest = mTankBodyNode->getOrientation() * Ogre::Vector3(-1,0,0);
else if (mMove > 0)
rayDest = mTankBodyNode->getOrientation() * Ogre::Vector3(1,0,0);
//THIS IS WHERE THE TANK IS MOVED WHEN PROCESSING
//if (rayDest != NULL)
{
Ogre::Ray shootToCheckWall = Ogre::Ray(mTankBodyNode->getPosition(), rayDest);
Ogre::RaySceneQuery* mRaySceneQuery = mSceneMgr->createRayQuery(shootToCheckWall, Ogre::SceneManager::ENTITY_TYPE_MASK);
mRaySceneQuery->setSortByDistance(true);
// Ray-cast and get first hit
Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator itr = result.begin();
bool hit = false;
for (itr = result.begin(); itr != result.end(); itr++)
{
std::string x = itr->movable->getName();
printf("Check %s \n", x.c_str());
if (x[0] == 'C' && itr->distance < 10)
{
printf("Too close to %s: %f \n", x.c_str(), (float)itr->distance);
hit = true;
}
}
if(hit == false)
{
mTankBodyNode->translate(mMove * deltaTime * mMoveSpd, 0, 0, Ogre::Node::TransformSpace::TS_LOCAL);
}
}
mTankBodyNode->yaw(Ogre::Degree(bodyRotate * deltaTime * mRotSpd));
// Rotate the tank turret
mTankTurretNode->yaw(Ogre::Degree(turretRotation * deltaTime * mRotSpd * 1.5));
turretDegree += turretRotation;
//to move barrel change barrelRotation
float barrelChange = barrelRotation * deltaTime * mRotSpd;
barrelDegree += barrelChange;
if(barrelDegree > 30)
barrelDegree = 30;
else if(barrelDegree < 0)
barrelDegree = 0;
else
mTankBarrelNode->roll(Ogre::Degree(-barrelChange));
}
break;
}
Ogre::Vector3 setpos = mTankBodyNode->getPosition();
setpos.y = 13.f;
mTankBodyNode->setPosition(setpos);
}
开发者ID:swn881,项目名称:CSCI356_JUSTDOEET,代码行数:101,代码来源:TankManager.cpp
示例19: Update
bool Player::Update(InputManager* input,
PhysicsManager* physics,
EWSManager* ews,
const OgreTransform& transform)
{
if(input->isCFGKeyPressed(InputManager::ENVWARNSYS))
{
placeEWS(ews,physics,transform);
}
cGunData* gun = nullptr;
if(_equippables[_curEquippable].equip->getIsWeapon())
{
gun = static_cast<cGunData*>(_equippables[_curEquippable].equip);
}
if(gun != nullptr)
{
bool movkey = false;
movkey = (input->isCFGKeyPressed(InputManager::FORWARD) ||
input->isCFGKeyPressed(InputManager::BACKWARD)||
input->isCFGKeyPressed(InputManager::RIGHT) ||
input->isCFGKeyPressed(InputManager::LEFT));
if(input->isMBPressed(OIS::MB_Left))
{
//shoot gun
//std::cout << "MB_Left pressed..." << std::endl;
gun->fire();
//check for collisions with enemies if first time through
if(gun->shouldDamage())
{
Ogre::SceneManager* scene = _equipNode->getCreator();
Ogre::Vector3 dir = transform.direction;
Ogre::Ray ray(transform.position,dir);
Ogre::RaySceneQuery* rayQuery = scene->createRayQuery(ray);
rayQuery->setSortByDistance(true);
Ogre::RaySceneQueryResult results = rayQuery->execute();
auto shot = [this,gun] (Ogre::RaySceneQueryResultEntry& entry)
{
if(entry.movable != nullptr)
{
std::string name = entry.movable->getName().substr(3,std::string::npos);
LevelData::BaseEntity* ent = LuaManager::getSingleton().getEntity(name);
if(ent != nullptr && (ent->getType() == LevelData::NPC || ent->getType() == LevelData::ENEMY))
{
_damageInterface->registerShotAtEnemy(gun->getGunshotData(),name);
}
}
};
std::for_each(results.begin(),results.end(),shot);
scene->destroyQuery(rayQuery);
}
}
else
{
gun->setFiring(false);
}
if(input->isCFGKeyPressed(InputManager::RELOAD))
{
gun->reload();
}
if(movkey)
{
gun->setMoving(true);
}
else
{
if(gun->isMoving())
{
gun->setMoving(false);
}
}
}
if(_damageInterface != nullptr)
{
//this clears out the added-up damage in the interface.
_health -= static_cast<int>(_damageInterface->getTotalDamagePlayer());
}
return true;
}
开发者ID:Dar13,项目名称:WastelandArchive,代码行数:90,代码来源:Player.cpp
示例20: frameStarted
bool frameStarted(const FrameEvent &e)
{
mKeyboard->capture();
// Check camera height
Ogre::RaySceneQuery *raySceneQuery =
mSceneMgr->
createRayQuery(Ogre::Ray(mCamera->getPosition() + Ogre::Vector3(0,1000000,0),
Vector3::NEGATIVE_UNIT_Y));
Ogre::RaySceneQueryResult& qryResult = raySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment)
{
if (mCamera->getPosition().y < i->worldFragment->singleIntersection.y + 30)
{
mCamera->
setPosition(mCamera->getPosition().x,
i->worldFragment->singleIntersection.y + 30,
mCamera->getPosition().z);
}
}
delete raySceneQuery;
// Change SkyX atmosphere options if needed
SkyX::AtmosphereManager::Options SkyXOptions = mSkyX->getAtmosphereManager()->getOptions();
// Time
if (!mShowInformation)
{
mSkyX->setTimeMultiplier(mTimeMultiplier);
}
else
{
mSkyX->setTimeMultiplier(0.0f);
}
if (mKeyboard->isKeyDown(OIS::KC_1) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
mSkyX->setTimeMultiplier(1.0f);
if (mKeyboard->isKeyDown(OIS::KC_1) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
mSkyX->setTimeMultiplier(-1.0f);
// Rayleigh multiplier
if (mKeyboard->isKeyDown(OIS::KC_2) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.RayleighMultiplier += e.timeSinceLastFrame*0.025f;
if (mKeyboard->isKeyDown(OIS::KC_2) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.RayleighMultiplier -= e.timeSinceLastFrame*0.025f;
// Mie multiplier
if (mKeyboard->isKeyDown(OIS::KC_3) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.MieMultiplier += e.timeSinceLastFrame*0.025f;
if (mKeyboard->isKeyDown(OIS::KC_3) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.MieMultiplier -= e.timeSinceLastFrame*0.025f;
// Exposure
if (mKeyboard->isKeyDown(OIS::KC_4) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.Exposure += e.timeSinceLastFrame*0.5f;
if (mKeyboard->isKeyDown(OIS::KC_4) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.Exposure -= e.timeSinceLastFrame*0.5f;
// Inner radius
if (mKeyboard->isKeyDown(OIS::KC_5) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.InnerRadius += e.timeSinceLastFrame*0.25f;
if (mKeyboard->isKeyDown(OIS::KC_5) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.InnerRadius -= e.timeSinceLastFrame*0.25f;
// Outer radius
if (mKeyboard->isKeyDown(OIS::KC_6) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.OuterRadius += e.timeSinceLastFrame*0.25f;
if (mKeyboard->isKeyDown(OIS::KC_6) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.OuterRadius -= e.timeSinceLastFrame*0.25f;
// Number of samples
if (mKeyboard->isKeyDown(OIS::KC_7) && mKeyBuffer < 0 &&!(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
{
SkyXOptions.NumberOfSamples ++;
mKeyBuffer = 0.25f;
}
if (mKeyboard->isKeyDown(OIS::KC_7) && mKeyBuffer < 0 && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
{
SkyXOptions.NumberOfSamples --;
mKeyBuffer = 0.25f;
}
// Height position
if (mKeyboard->isKeyDown(OIS::KC_8) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.HeightPosition += e.timeSinceLastFrame*0.05f;
if (mKeyboard->isKeyDown(OIS::KC_8) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
SkyXOptions.HeightPosition -= e.timeSinceLastFrame*0.05f;
// Time multiplier
if (mKeyboard->isKeyDown(OIS::KC_9) && !(mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
mTimeMultiplier += e.timeSinceLastFrame*0.15f;
if (mKeyboard->isKeyDown(OIS::KC_9) && (mKeyboard->isKeyDown(OIS::KC_LSHIFT) || mKeyboard->isKeyDown(OIS::KC_RSHIFT)))
mTimeMultiplier -= e.timeSinceLastFrame*0.15f;
mSkyX->getAtmosphereManager()->setOptions(SkyXOptions);
// Show/Hide information
if (mKeyboard->isKeyDown(OIS::KC_F1) && mKeyBuffer < 0)
//.........这里部分代码省略.........
开发者ID:coverxit,项目名称:fairytale,代码行数:101,代码来源:hydraxtest.cpp
注:本文中的ogre::RaySceneQuery类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论