Finished support for lap counting using checklines.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3710 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2009-07-08 12:33:22 +00:00
parent 0f47c60042
commit e8c70f73af
6 changed files with 50 additions and 8 deletions

View File

@ -33,7 +33,7 @@ CheckManager::CheckManager(const XMLNode &node)
const std::string &type = check_node->getName(); const std::string &type = check_node->getName();
if(type=="checkline") if(type=="checkline")
{ {
m_all_checks.push_back(new Checkline(*check_node)); m_all_checks.push_back(new Checkline(this, *check_node));
} }
} // for i<node.getNumNodes } // for i<node.getNumNodes
} // CheckManager } // CheckManager
@ -57,3 +57,14 @@ void CheckManager::update(float dt)
for(i=m_all_checks.begin(); i!=m_all_checks.end(); i++) for(i=m_all_checks.begin(); i!=m_all_checks.end(); i++)
(*i)->update(dt); (*i)->update(dt);
} // update } // update
// ----------------------------------------------------------------------------
/** Called when a reset-new-lap check is triggered. It re-activates all new
* lap checks.
*/
void CheckManager::activateNewLapChecks(int kart_index)
{
std::vector<CheckStructure*>::iterator i;
for(i=m_all_checks.begin(); i!=m_all_checks.end(); i++)
(*i)->activateNewLapCheck(kart_index);
} // resetNewLaps

View File

@ -35,6 +35,7 @@ public:
CheckManager(const XMLNode &node); CheckManager(const XMLNode &node);
void update(float dt); void update(float dt);
void reset(const Track &track); void reset(const Track &track);
void activateNewLapChecks(int kart_index);
}; // CheckManager }; // CheckManager
#endif #endif

View File

@ -20,11 +20,14 @@
#include "karts/kart.hpp" #include "karts/kart.hpp"
#include "modes/world.hpp" #include "modes/world.hpp"
#include "race/race_manager.hpp" #include "race/race_manager.hpp"
#include "tracks/check_manager.hpp"
#include "tracks/check_structure.hpp" #include "tracks/check_structure.hpp"
CheckStructure::CheckStructure(const XMLNode &node) CheckStructure::CheckStructure(CheckManager *check_manager,
const XMLNode &node)
{ {
m_check_manager = check_manager;
std::string type; std::string type;
node.get("type", &type); node.get("type", &type);
if(type=="new-lap") if(type=="new-lap")
@ -71,8 +74,10 @@ void CheckStructure::update(float dt)
{ {
trigger(i); trigger(i);
} }
m_previous_position[i] = xyz;
} // for i<getNumKarts } // for i<getNumKarts
} // update } // update
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** Is called when this check structure is triggered. This then can cause /** Is called when this check structure is triggered. This then can cause
* a lap to be counted, animation to be started etc. * a lap to be counted, animation to be started etc.
@ -84,7 +89,19 @@ void CheckStructure::trigger(unsigned int kart_index)
case CT_NEW_LAP : RaceManager::getWorld()->newLap(kart_index); case CT_NEW_LAP : RaceManager::getWorld()->newLap(kart_index);
m_is_active[kart_index] = false; m_is_active[kart_index] = false;
break; break;
case CT_RESET_NEW_LAP : break; case CT_RESET_NEW_LAP :
m_check_manager->activateNewLapChecks(kart_index);
break;
default: break; default: break;
} // switch m_check_type } // switch m_check_type
} // trigger } // trigger
// ----------------------------------------------------------------------------
/** If this check structure is a new-lap check, activate it again.
* \param kart_index Index of the kart for which the lap check is activated.
*/
void CheckStructure::activateNewLapCheck(int kart_index)
{
if(m_check_type==CT_NEW_LAP)
m_is_active[kart_index] = true;
} // resetNewLap

View File

@ -26,6 +26,7 @@
class XMLNode; class XMLNode;
class Track; class Track;
class CheckManager;
/** Virtual base class for a check structure. A check structure has a certain /** Virtual base class for a check structure. A check structure has a certain
* type: * type:
@ -62,10 +63,14 @@ protected:
/** Stores if this check structure is active (for a given kart). USed e.g. /** Stores if this check structure is active (for a given kart). USed e.g.
* in lap counting. */ * in lap counting. */
std::vector<bool> m_is_active; std::vector<bool> m_is_active;
private:
/** Stores a pointer to the check manager. */
CheckManager *m_check_manager;
/** The type of this checkline. */ /** The type of this checkline. */
CheckType m_check_type; CheckType m_check_type;
public: public:
CheckStructure(const XMLNode &node); CheckStructure(CheckManager *check_manager, const XMLNode &node);
virtual ~CheckStructure() {}; virtual ~CheckStructure() {};
virtual void update(float dt); virtual void update(float dt);
/** True if going from old_pos to new_pos crosses this checkline. This function /** True if going from old_pos to new_pos crosses this checkline. This function
@ -78,6 +83,7 @@ public:
virtual bool isTriggered(const Vec3 &old_pos, const Vec3 &new_pos, int indx)=0; virtual bool isTriggered(const Vec3 &old_pos, const Vec3 &new_pos, int indx)=0;
virtual void trigger(unsigned int kart_index); virtual void trigger(unsigned int kart_index);
virtual void reset(const Track &track); virtual void reset(const Track &track);
virtual void activateNewLapCheck(int kart_index);
}; // CheckStructure }; // CheckStructure
#endif #endif

View File

@ -24,7 +24,13 @@
#include "io/xml_node.hpp" #include "io/xml_node.hpp"
#include "race/race_manager.hpp" #include "race/race_manager.hpp"
Checkline::Checkline(const XMLNode &node) : CheckStructure(node) /** Constructor for a checkline.
* \param check_manager Pointer to the check manager, which is needed when
* resetting e.g. new lap counters.
* \param node XML node containing the parameters for this checkline.
*/
Checkline::Checkline(CheckManager *check_manager, const XMLNode &node)
: CheckStructure(check_manager, node)
{ {
m_previous_sign.resize(race_manager->getNumKarts()); m_previous_sign.resize(race_manager->getNumKarts());
core::vector2df p1, p2; core::vector2df p1, p2;
@ -77,4 +83,4 @@ bool Checkline::isTriggered(const Vec3 &old_pos, const Vec3 &new_pos, int indx)
result = false; result = false;
m_previous_sign[indx] = sign; m_previous_sign[indx] = sign;
return result; return result;
} // update } // isTriggered

View File

@ -26,6 +26,7 @@ using namespace irr;
#include "tracks/check_structure.hpp" #include "tracks/check_structure.hpp"
class XMLNode; class XMLNode;
class CheckManager;
/** Implements a simple checkline. It's a finite line with 2 endpoints in 2d /** Implements a simple checkline. It's a finite line with 2 endpoints in 2d
* and a minimum height (i.e. the minimum Y coordinate of the two points). * and a minimum height (i.e. the minimum Y coordinate of the two points).
@ -48,7 +49,7 @@ private:
* or to the right of the line. */ * or to the right of the line. */
std::vector<bool> m_previous_sign; std::vector<bool> m_previous_sign;
public: public:
Checkline(const XMLNode &node); Checkline(CheckManager *check_manager, const XMLNode &node);
virtual ~Checkline() {}; virtual ~Checkline() {};
virtual bool isTriggered(const Vec3 &old_pos, const Vec3 &new_pos, int indx); virtual bool isTriggered(const Vec3 &old_pos, const Vec3 &new_pos, int indx);
virtual void reset(const Track &track); virtual void reset(const Track &track);