前言
实现场景对象的移动控制,通过触摸地面实现机器人的简单移动,暂时没有动画和方向切换.
代码片段
//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如果要应用于真正的项目,需要完善,封装的东西实在太多了,纯脚本的难道太大. :(