前言
实现场景对象的移动控制,通过触摸地面实现机器人的简单移动,暂时没有动画和方向切换.
代码片段
//SceneObject.h // 场景对象动作标签 typedef enum { ESAT_MOVE, // 移动 ESAT_ACTION, // 动作 ESAT_FORCE32 = 0x7FFFFFFF } EnSceneObjectActionTag; class CSceneObject : public CCSprite { public: virtual ~CSceneObject(); CREATE_FUNC( CSceneObject ); public: // 移动到指定位置 void moveToNodePosition( const CCPoint& pt, float speed ); protected: // 移动结束 void onMovedDone( CCNode* sender ); // 帧更新 virtual void update(float delta); // 后期扩展接口 private: // 后期增加属性集合 }; //SceneObject.cpp // 移动到指定位置 void CSceneObject::moveToNodePosition( const CCPoint& pt, float speed ) { // 当前移动终止 CCAction* pMoveAction = getActionByTag( ESAT_MOVE ); if( pMoveAction ) { stopAction( pMoveAction ); } // 移动距离计算 float dx = getPosition().x - pt.x; float dy = getPosition().y - pt.y; float distance = sqrt(dx*dx + dy*dy); // 新的移动 CCCallFuncN * actionMoveDone = CCCallFuncN::create( this, callfuncN_selector(CSceneObject::onMovedDone)); pMoveAction = runAction( CCSequence::create( CCMoveTo::create( distance/speed, pt ), actionMoveDone, NULL) ); if( pMoveAction ) { pMoveAction->setTag( ESAT_MOVE ); // 开启帧更新(用于刷新Z排序) scheduleUpdate(); } } // 移动结束 void CSceneObject::onMovedDone( CCNode* sender ) { CCLOG( "Move done!" ); // 移动终止 stopActionByTag( ESAT_MOVE ); // 关闭帧更新 unscheduleUpdate(); } // 帧更新 void CSceneObject::update( float delta ) { // 如果在移动状态 if( getActionByTag(ESAT_MOVE) ) { CObjectLayer* pLayer = dynamic_cast<CObjectLayer*>( getParent() ); if( pLayer ) { pLayer->reorderSceneObject( this ); } } }
脚本中的使用:
local objectLayer = bind_scene:getObjectLayer(); local object = objectLayer:getObject( 1 ); if object then object:moveToNodePosition( Location, 128 ); end
总结
Cocos2dx如果要应用于真正的项目,需要完善,封装的东西实在太多了,纯脚本的难道太大. :(