//**************************************************************************** //* MODULE: Gel/Components //* FILENAME: VelocityComponent.cpp //* OWNER: SPG //* CREATION DATE: 7/10/03 //**************************************************************************** // The CEmptyComponent class is an skeletal version of a component // It is intended that you use this as the basis for creating new // components. // To create a new component called "Watch", (CWatchComponent): // - copy emptycomponent.cpp/.h to watchcomponent.cpp/.h // - in both files, search and replace "Empty" with "Watch", preserving the case // - in WatchComponent.h, update the CRCD value of CRC_WATCH // - in CompositeObjectManager.cpp, in the CCompositeObjectManager constructor, add: // RegisterComponent(CRC_WATCH, CWatchComponent::s_create); // - and add the include of the header // #include // - Add it to build\gel.mkf, like: // $(NGEL)/components/WatchComponent.cpp\ // - Fill in the OWNER (yourself) and the CREATION DATE (today's date) in the .cpp and the .h files // - Insert code as needed and remove generic comments // - remove these comments // - add comments specfic to the component, explaining its usage #include #include #include #include #include #include #include namespace Obj { /******************************************************************/ /* */ /* */ /******************************************************************/ // s_create is what is registered with the component factory // object, (currently the CCompositeObjectManager) // s_create returns a CBaseComponent*, as it is to be used // by factor creation schemes that do not care what type of // component is being created // ** after you've finished creating this component, be sure to // ** add it to the list of registered functions in the // ** CCompositeObjectManager constructor CBaseComponent* CVelocityComponent::s_create() { return static_cast< CBaseComponent* >( new CVelocityComponent ); } /******************************************************************/ /* */ /* */ /******************************************************************/ // All components set their type, which is a unique 32-bit number // (the CRC of their name), which is used to identify the component CVelocityComponent::CVelocityComponent() : CBaseComponent() { SetType( CRC_VELOCITY ); } /******************************************************************/ /* */ /* */ /******************************************************************/ CVelocityComponent::~CVelocityComponent() { } /******************************************************************/ /* */ /* */ /******************************************************************/ // InitFromStructure is passed a Script::CStruct that contains a // number of parameters to initialize this component // this currently is the contents of a node // but you can pass in anything you like. void CVelocityComponent::InitFromStructure( Script::CStruct* pParams ) { Mth::Vector vel; pParams->GetVector(CRCD(0xc4c809e, "vel"), &vel, Script::ASSERT); GetObject()->SetVel( vel ); } /******************************************************************/ /* */ /* */ /******************************************************************/ // RefreshFromStructure is passed a Script::CStruct that contains a // number of parameters to initialize this component // this currently is the contents of a node // but you can pass in anything you like. void CVelocityComponent::RefreshFromStructure( Script::CStruct* pParams ) { // Default to just calline InitFromStructure() // but if that does not handle it, then will need to write a specific // function here. // The user might only want to update a single field in the structure // and we don't want to be asserting becasue everything is missing //InitFromStructure(pParams); } /******************************************************************/ /* */ /* */ /******************************************************************/ void CVelocityComponent::Finalize() { mp_suspend_component = GetSuspendComponentFromObject( GetObject() ); } /******************************************************************/ /* */ /* */ /******************************************************************/ void CVelocityComponent::Hide( bool should_hide ) { } /******************************************************************/ /* */ /* */ /******************************************************************/ // The component's Update() function is called from the CCompositeObject's // Update() function. That is called every game frame by the CCompositeObjectManager // from the s_logic_code function that the CCompositeObjectManager registers // with the task manger. void CVelocityComponent::Update() { GameNet::Manager* gamenet_man = GameNet::Manager::Instance(); if (gamenet_man->InNetGame() || !mp_suspend_component->SkipLogic()) { Mth::Vector pos, cur_pos, vel; cur_pos = GetObject()->GetPos(); vel = GetObject()->GetVel(); pos = cur_pos + ( GetObject()->GetVel() * 0.5f * Tmr::FrameLength()); GetObject()->SetPos( pos ); } } /******************************************************************/ /* */ /* */ /******************************************************************/ // Given the "Checksum" of a script command, then possibly handle it // if it's a command that this component will handle CBaseComponent::EMemberFunctionResult CVelocityComponent::CallMemberFunction( uint32 Checksum, Script::CStruct* pParams, Script::CScript* pScript ) { switch ( Checksum ) { default: return CBaseComponent::MF_NOT_EXECUTED; } // the "default" case of the switch statement handles // unrecognized functions; if we make it down here, // that means that the component already handled it // somehow return CBaseComponent::MF_TRUE; } /******************************************************************/ /* */ /* */ /******************************************************************/ void CVelocityComponent::GetDebugInfo(Script::CStruct *p_info) { Dbg_MsgAssert(p_info,("NULL p_info sent to CVelocityComponent::GetDebugInfo")); // Add any script components to the p_info structure, // and they will be displayed in the script debugger (qdebug.exe) // you will need to add the names to debugger_names.q, if they are not existing checksums // we call the base component's GetDebugInfo, so we can add info from the common base component CBaseComponent::GetDebugInfo(p_info); } /******************************************************************/ /* */ /* */ /******************************************************************/ }