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

  • 相关阅读:
    コナン純黒のナイトメア20180715
    コナン純黒のナイトメア20180630
    コナン純黒のナイトメア20180629
    コナン純黒のナイトメア20180623
    コナン純黒のナイトメア20180622
    コナン純黒のナイトメア20180616
    コナン純黒のナイトメア20180613
    コナン純黒のナイトメア20180611
    单词乱记 20180607
    五周突破日语能力考试 单词5-2
  • 原文地址:https://www.cnblogs.com/KevinYuen/p/2955877.html
Copyright © 2011-2022 走看看