void Slot::update() {
		DBObject::update();
			
		if(_isDisplayOnStage)
		{
			Armature* child = this->getChildArmature();
			if(parent->_tweenPivot)
			{
				float pivotX = parent->_tweenPivot->x;
				float pivotY = parent->_tweenPivot->y;
				if(parent)
				{
					glm::mat4 parentMatrix = parent->_globalTransformMatrix;
					_globalTransformMatrix[3][0] += parentMatrix[0][0] * pivotX + parentMatrix[1][0] * pivotY;
					_globalTransformMatrix[3][1] += parentMatrix[0][1] * pivotX + parentMatrix[1][1] * pivotY;
				}
			}
				
			_displayBridge->updateTransform(this->_globalTransformMatrix, this->global);
			if(child)
			{
				child->getDisplay()->setTransformationMatrix(this->_globalTransformMatrix);
			}
		}
	}
	Object* Slot::getDisplay() {
		Object* display = displayList[_displayIndex];
		if(checkIfClass<Armature>(display)) 
		{
			Armature* d = (Armature*) display;
			return (Object*)d->getDisplay();
		}
		return display;
	}
	void Slot::changeDisplay(int displayIndex) {
		if(displayIndex < 0)
		{
			if(!_isHideDisplay)
			{
				_isHideDisplay = true;
				_displayBridge->removeDisplay();
			}
		}
		else
		{
			if(_isHideDisplay)
			{
				_isHideDisplay = false;
				if(this->_armature)
				{
					int in = this->_armature->getSlotIndexOf(this);
					if(in > -1) {
						_displayBridge->addDisplay(this->_armature->getDisplay(), in);
						this->_armature->_slotsZOrderChanged = true;
					}
				}
			}
				
			int length = displayList.size();
			if(displayIndex >= length && length > 0)
			{
				displayIndex = length - 1;
			}
			if(_displayIndex != displayIndex)
			{
				_displayIndex = displayIndex;
				Object* content = displayList[_displayIndex];
				if(checkIfClass<Armature>(content))
				{
					Armature* contentArmature = (Armature*) content;
					_displayBridge->setDisplay((Object*)(contentArmature->getDisplay()));
				}
				else
				{
					_displayBridge->setDisplay(content);
				}
				
				if(_displayDataList.size() > 0 && _displayIndex <= _displayDataList.size())
				{
					this->origin->copy(_displayDataList[_displayIndex]->transform);
				}
			}
		}
			
		if(!_isHideDisplay && _displayBridge->getDisplay())
		{
			if(!_isDisplayOnStage)
			{
				_isDisplayOnStage = true;
				if(getChildArmature())
				{
					getChildArmature()->getAnimation()->play();
				}
			}
		}
		else if(_isDisplayOnStage)
		{
			_isDisplayOnStage = false;
			if(getChildArmature())
			{
				getChildArmature()->getAnimation()->stop();
				getChildArmature()->getAnimation()->_lastAnimationState = 0;
			}
		}
	}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        //////////////////////////////////////////////////////////////////////////
        // super init first
        //////////////////////////////////////////////////////////////////////////

        CC_BREAK_IF(! CCLayerColor::initWithColor(ccc4(200, 200, 200, 255)));
//		CC_BREAK_IF(! CCLayerColor::initWithColor(ccc4(0, 0, 0, 255)));

		CCSize size = CCDirector::sharedDirector()->getWinSize();
		
		weaponIndex = 0;

		BatchNodeManager::sharedBatchNodeManager()->initWithLayer(this, "TEST_ARMATURE");

		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Zombie_f/Zombie", "", "zombie.png", "zombie.plist", "zombie.xml");
		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Knight_f/Knight", "", "knight.png", "knight.plist", "knight.xml");
 		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("cyborg", "", "cyborg.png", "cyborg.plist", "cyborg.xml");
 
 		// if the png, plist, xml is same, you can use param _useExistFileInfo
 		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("armInside", "cyborg", "", "", "");
 		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("armOutside", "cyborg", "", "", "");
 		
		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("circle_in_circle_stage3", "", "loading.png", "loading.plist", "loading.xml");
		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Cattail", "", "Cattail.png", "Cattail.plist", "Cattail.xml");
 		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Zombie_ladder", "", "zombie_ladder.png", "zombie_ladder.plist", "zombie_ladder.xml");
		
		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("Zombie_ladder", "", "zombie_ladder.png", "zombie_ladder.plist", "zombie_ladder.xml");

		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("bird", "", "bird.png", "bird.plist", "bird.xml");


		ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("weapon", "", "weapon.png", "weapon.plist", "weapon.xml");


		armatures = new CCArray();

		Armature *armature = NULL;

		//! use BATCHNODE_VERTEXZ you can change display in different batchnode
		BatchNodeManager::sharedBatchNodeManager()->getBatchNode("knight.png")->setRenderType(BATCHNODE_VERTEXZ);
		BatchNodeManager::sharedBatchNodeManager()->getBatchNode("cyborg.png")->setRenderType(BATCHNODE_VERTEXZ);
		BatchNodeManager::sharedBatchNodeManager()->getBatchNode("zombie.png")->setRenderType(BATCHNODE_VERTEXZ);

		armature = Armature::create("cyborg");
		armature->getAnimation()->play("run");
		armature->getDisplay()->setPosition(ccp(size.width/2 + 130, size.height/2));		
		armature->setZOrder(2);
		armature->setAnimationCallback(this);
		armatures->addObject(armature);

		armature = Armature::create("Zombie_f/Zombie");
		armature->getAnimation()->play("run");
		armature->getDisplay()->setPosition(ccp(size.width/2 + 100, size.height/2));
		armature->setZOrder(1);
		armatures->addObject(armature);
		

		armature = Armature::create("Knight_f/Knight");
		armature->getAnimation()->play("run");
		armature->getDisplay()->setPosition(ccp(size.width/2 + 50, size.height/2));
		armatures->addObject(armature);

		armature = Armature::create("Knight_f/Knight");
		armature->getAnimation()->play("run");
		armature->getDisplay()->setPosition(ccp(size.width/2 - 150, size.height/2));
		armature->getBone("weapon")->addSpriteDisplay("weapon_f-sword2.png", "weapon.png", 0);
		armatures->addObject(armature);

		
// 		armature = Armature::create("circle_in_circle_stage3");
// 		armature->getAnimation()->play("loading");
// 		armature->getDisplay()->setPosition(ccp(size.width/2, size.height/2));		
// 		armatures->addObject(armature);



		armature = Armature::create("Cattail");
		armature->getAnimation()->play("anim_shooting");
		armature->getDisplay()->setPosition(ccp(size.width/2 + 50, size.height/2 - 100));
		armatures->addObject(armature);

		armature = Armature::create("Zombie_ladder");
		armature->getAnimation()->play("anim_placeladder", 0, 50, 1, TWEEN_EASING_MAX);
		armature->getAnimation()->setAnimationScale(3);
		armature->getDisplay()->setPosition(ccp(size.width/2 - 230, size.height/2 -100));		
		armatures->addObject(armature);

		armature = Armature::create("bird");
		armature->getAnimation()->play("changeColor");
		armature->getDisplay()->setPosition(ccp(size.width/2 - 230, size.height/2 + 100));		
		armatures->addObject(armature);

// 		for (int i = 0; i<500; i++)
// 		{
// 			Armature *armature = Armature::create("Knight_f/Knight");
// 			armature->getAnimation()->play("run");
// 			armature->getDisplay()->setPosition(ccp(30 + (i%20)*(size.width/21), 30 + (i/20)*20));
// 			armatures->addObject(armature);
// 		}


		scheduleUpdate();
        

        bRet = true;
    } while (0);

    return bRet;
}