<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>survivalcontrolaspect.cpp</title> <link rel="stylesheet" type="text/css" href="../highlight.css"> </head> <body> <pre> <span class="dir">#include </span><span class="dstr">"survivalcontrolaspect.h"</span><span class="dir"></span> <span class="dir">#include </span><span class="dstr">"survivalagentaspect.h"</span><span class="dir"></span> <span class="dir">#include <zeitgeist/logserver/logserver.h> </span><span class="dir">#include <kerosin/fontserver/fontserver.h> </span><span class="dir">#include <kerosin/openglserver/openglserver.h> </span> <span class="key">using namespace </span>boost; <span class="key">using namespace </span>kerosin; <span class="key">using namespace </span>salt; <span class="key">using namespace </span>std; <span class="key">using namespace </span>zeitgeist; shared_ptr<Effector> SurvivalControlAspect::RequestEffectorInternal(shared_ptr<AgentAspect>& agent, <span class="typ">const </span>string& effectorName) { <span class="com">// always make sure, we know how to treat an agent class </span> <span class="key">if </span>(agent->GetClass()->Supports(<span class="str">"SurvivalAgentAspect"</span>)) { <span class="key">if </span>(effectorName == <span class="str">"kerosin/ForceEffector"</span>) <span class="key">return </span>CreateEffector(effectorName); } <span class="com">// no valid agentaspect/effector combination </span> <span class="key">return </span>shared_ptr<Effector>(); } boost::shared_ptr<Perceptor> SurvivalControlAspect::RequestPerceptorInternal(boost::shared_ptr<AgentAspect>& agent, <span class="typ">const </span>std::string& perceptorName) { <span class="com">// always make sure, we know how to treat an agent class </span> <span class="key">if </span>(agent->GetClass()->Supports(<span class="str">"SurvivalAgentAspect"</span>)) { <span class="key">if </span>(perceptorName ==<span class="str"> "LineSegmentPerceptor"</span>) <span class="key">return </span>CreatePerceptor(perceptorName); <span class="key">if </span>(perceptorName == <span class="str">"kerosin/VisionPerceptor"</span>) <span class="key">return </span>CreatePerceptor(perceptorName); } <span class="com">// no valid agentaspect/effector combination </span> <span class="key">return </span>shared_ptr<Perceptor>(); } <span class="com">/*bool SurvivalControlAspect::ConstructInternal() { GetLog()->Normal() << "Survival Control Aspect started..." << endl; return true; }*/</span> <span class="typ">void </span>SurvivalControlAspect::PrePhysicsUpdateInternal(<span class="typ">float </span>deltaTime) { mHealthSlow -= mSickRate*deltaTime; mHealthFast -= mSickRate*deltaTime; <span class="key">if </span>(mHealthSlow < <span class="num">0.0f</span>) { mHealthSlow = <span class="num">100.0f</span>; mDeathSlow++; } <span class="key">if </span>(mHealthFast < <span class="num">0.0f</span>) { mHealthFast = <span class="num">100.0f</span>; mDeathFast++; } <span class="com">// check if an agent is close enough to eat the food </span> shared_ptr<BaseNode> slow = shared_static_cast<BaseNode>(GetCore()->Get(<span class="str">"/usr/scene/slow"</span>)); shared_ptr<BaseNode> fast = shared_static_cast<BaseNode>(GetCore()->Get(<span class="str">"/usr/scene/fast"</span>)); shared_ptr<BaseNode> food = shared_static_cast<BaseNode>(GetCore()->Get(<span class="str">"/usr/scene/food"</span>)); Vector3f dist; <span class="typ">bool </span>slowHasIt = <span class="key">false</span>; <span class="typ">bool </span>fastHasIt = <span class="key">false</span>; dist = slow->GetWorldTransform().Pos() - food->GetWorldTransform().Pos(); <span class="key">if </span>(dist.Length() < <span class="num">2.0f</span>) { slowHasIt = <span class="key">true</span>; } dist = fast->GetWorldTransform().Pos() - food->GetWorldTransform().Pos(); <span class="key">if </span>(dist.Length() < <span class="num">2.0f</span>) { fastHasIt = <span class="key">true</span>; } <span class="key">if </span>(slowHasIt && fastHasIt) { <span class="com">// only give both half the health </span> mHealthSlow += <span class="num">50.0f</span>; mHealthFast += <span class="num">50.0f</span>; } <span class="key">else </span>{ <span class="key">if </span>(slowHasIt) mHealthSlow = <span class="num">100.0f</span>; <span class="key">if </span>(fastHasIt) mHealthFast = <span class="num">100.0f</span>; } <span class="key">if </span>(mHealthSlow > <span class="num">100.0f</span>) mHealthSlow = <span class="num">100.0f</span>; <span class="key">if </span>(mHealthFast > <span class="num">100.0f</span>) mHealthFast = <span class="num">100.0f</span>; <span class="com">// if the food was eaten, we reposition it </span> <span class="key">if </span>(slowHasIt || fastHasIt) { Vector3f newPos; newPos.x() = <span class="num">20.0f</span>*(<span class="num">1.0f</span>-<span class="num">2.0f</span>*rand()/(<span class="typ">float</span>)RAND_MAX); newPos.y() = <span class="num">1.0f</span>; newPos.z() = <span class="num">20.0f</span>*(<span class="num">1.0f</span>-<span class="num">2.0f</span>*rand()/(<span class="typ">float</span>)RAND_MAX); Matrix mat = food->GetWorldTransform(); mat.Pos() = newPos; food->SetLocalTransform(mat); <span class="com">// also set both agents to not seeking </span> shared_static_cast<SurvivalAgentAspect>(GetCore()->Get(<span class="str">"/usr/scene/slow/_agent"</span>))->SetIsSeeking(<span class="key">false</span>); shared_static_cast<SurvivalAgentAspect>(GetCore()->Get(<span class="str">"/usr/scene/fast/_agent"</span>))->SetIsSeeking(<span class="key">false</span>); } } <span class="typ">void </span>SurvivalControlAspect::OnLink() { <span class="com">// init variables </span> mDeathSlow = <span class="num">0</span>; mDeathFast = <span class="num">0</span>; mHealthSlow = <span class="num">100</span>; mHealthFast = <span class="num">100</span>; mSickRate = <span class="num">6</span>; shared_ptr<FontServer> fontServer = shared_static_cast<FontServer>(GetCore()->Get(<span class="str">"/sys/server/font"</span>)); mFont = fontServer->GetFont(<span class="str">"font/andalemo.ttf"</span>, <span class="num">14</span>); } <span class="typ">void </span>SurvivalControlAspect::RenderInternal() { shared_ptr<FontServer> fontServer = shared_static_cast<FontServer>(GetCore()->Get(<span class="str">"/sys/server/font"</span>)); <span class="key">if </span>(fontServer.get() != NULL) { fontServer->Begin(); mFont->Bind(); glColor3f(<span class="num">1</span>,<span class="num">0</span>,<span class="num">0</span>); mFont->Printf(<span class="num">0</span>, <span class="num">0</span>, <span class="str">"Slow: %03.0f (%d)"</span>, mHealthSlow, mDeathSlow); mFont->Printf(<span class="num">0</span>, <span class="num">20</span>, <span class="str">"Fast: %03.0f (%d)"</span>, mHealthFast, mDeathFast); glColor3f(<span class="num">1</span>,<span class="num">1</span>,<span class="num">1</span>); fontServer->End(); } } </pre> </body> </html> <!--HTML generated by highlight 2.0, http://www.andre-simon.de/-->