Cocos2dx 学习笔记(6) ---- 场景对象的移动

前言

  实现场景对象的移动控制,通过触摸地面实现机器人的简单移动,暂时没有动画和方向切换.

代码片段  

//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如果要应用于真正的项目,需要完善,封装的东西实在太多了,纯脚本的难道太大. :(

转载于:https://www.cnblogs.com/KevinYuen/archive/2013/03/12/2955877.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值