//==========================================================================//
// Ogre A* Example - December 2009 //
// //
// Author: Daniel Soltyka //
// E-Mail: dsoltyka [at] gmail [dot] com //
// //
// This example demonstrates the A* pathfinding algorithm in a 3D //
// environment. //
// //
// Modified A* routines based off of A* Algorithm Implementation using STL //
// by Justin Heyes-Jones. //
// //
// Original Routines can be found at http://www.heyes-jones.com/astar.html //
//==========================================================================//
#include "OgreAStarExample.h"
OgreAStarExample::OgreAStarExample()
{
// create world map
mMap = new WorldMap();
}
// Create our scene
void OgreAStarExample::createScene()
{
// set default lighting
mSceneMgr->setAmbientLight(ColourValue(1.0f, 1.0f, 1.0f));
mEntity = mSceneMgr->createEntity("Robot", "robot.mesh");
mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("RobotNode", Vector3(0.0f , 0.0f, 0.0f));
mNode->attachObject(mEntity);
Entity* ent;
SceneNode* node;
// create ground
Plane plane(Vector3::UNIT_Y,0);
MeshManager::getSingleton().createPlane("ground",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
2560,2560,20,20,true,1,5,5,Vector3::UNIT_Z);
ent = mSceneMgr->createEntity("GroundEntity", "ground");
node = mSceneMgr->getRootSceneNode()->createChildSceneNode("GroundNode", Vector3(640.0f, 0.0f, 640.0f));
node->attachObject(ent);
ent->setMaterialName("Examples/BumpyMetal");
std::stringstream ss;
// create walls by iterating through our world map and placing cube objects appropriately
for (int y = 0; y < mMap->GetHeight(); y++)
{
for (int x = 0; x < mMap->GetWidth(); x++)
{
if (mMap->GetTile(x,y) == 9)
{
// generate entity name using x,y coords
ss << x;
string temp_x = ss.str();
ss << y;
string temp_y = ss.str();
string entityName = "Cube" + temp_x + "x" + temp_y;
ent = mSceneMgr->createEntity( entityName, "cube.mesh");
node = mSceneMgr->getRootSceneNode()->createChildSceneNode("CubeNode" + temp_x + "x" + temp_y, Vector3((x * 64.0f), 50.0f, (y * 64.0f)));
node->attachObject(ent);
ent->setMaterialName("Examples/Rockwall");
node->setScale(0.64f, 1.0f, 0.64f);
}
}
}
// create start and end markers
ent = mSceneMgr->createEntity("Start", "cube.mesh");
node = mSceneMgr->getRootSceneNode()->createChildSceneNode("StartNode", Vector3(0.0f, 0.0f, 0.0f));
node->attachObject(ent);
ent->setMaterialName("Examples/RustySteel");
node->setScale(0.64f, 1.0f, 0.64f);
ent = mSceneMgr->createEntity("End", "cube.mesh");
node = mSceneMgr->getRootSceneNode()->createChildSceneNode("EndNode", Vector3(0.0f, 0.0f, 0.0f));
node->attachObject(ent);
ent->setMaterialName("Examples/RustySteel");
node->setScale(0.64f, 1.0f, 0.64f);
// set the camera to look out at our handiwork
mCamera->setPosition(90.0f, 1280.0f, 535.0f);
mCamera->setAutoTracking(true,mNode);
}
// Create our frame listener
void OgreAStarExample::createFrameListener()
{
mFrameListener= new DefaultFrameListener(mWindow, mCamera, mSceneMgr, mNode, mEntity, mMap, mPathFinder);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}