Exemple #1
0
bool AmfUtil::isSame(cocos2d::CCObject *thisObj, cocos2d::CCObject *thatObj) {
    if (thisObj && !thatObj) return false;
    if (!thisObj && thatObj) return false;
    if (!thisObj && !thatObj) return true;

    if (dynamic_cast<CCBool *>(thisObj) && dynamic_cast<CCBool *>(thatObj)) {
        return dynamic_cast<CCBool *>(thisObj)->getValue() == dynamic_cast<CCBool *>(thatObj)->getValue();
    } else if (dynamic_cast<CCInteger *>(thisObj) && dynamic_cast<CCInteger *>(thatObj)) {
        return dynamic_cast<CCInteger *>(thisObj)->getValue() == dynamic_cast<CCInteger *>(thatObj)->getValue();
    } else if (dynamic_cast<CCFloat *>(thisObj) && dynamic_cast<CCFloat *>(thatObj)) {
        return dynamic_cast<CCFloat *>(thisObj)->getValue() == dynamic_cast<CCFloat *>(thatObj)->getValue();
    } else if (dynamic_cast<CCDouble *>(thisObj) && dynamic_cast<CCDouble *>(thatObj)) {
        return dynamic_cast<CCDouble *>(thisObj)->getValue() == dynamic_cast<CCDouble *>(thatObj)->getValue();
    } else if (dynamic_cast<CCString *>(thisObj) && dynamic_cast<CCString *>(thatObj)) {
        return strcmp(dynamic_cast<CCString *>(thisObj)->getCString(), dynamic_cast<CCString *>(thatObj)->getCString()) == 0;
    } else if (dynamic_cast<CCDate *>(thisObj) && dynamic_cast<CCDate *>(thatObj)) {
        return dynamic_cast<CCDate *>(thisObj)->isEqual(dynamic_cast<CCDate *>(thatObj));
    } else if (dynamic_cast<AmfTraitsInfo *>(thisObj) && dynamic_cast<AmfTraitsInfo *>(thatObj)) {
        return dynamic_cast<AmfTraitsInfo *>(thisObj)->isEqual(dynamic_cast<AmfTraitsInfo *>(thatObj));
    } else if (dynamic_cast<AmfObject *>(thisObj) && dynamic_cast<AmfObject *>(thatObj)) {
        return dynamic_cast<AmfObject *>(thisObj)->isEqual(dynamic_cast<AmfObject *>(thatObj));
    } else if (dynamic_cast<AmfCoding *>(thisObj) && dynamic_cast<AmfCoding *>(thatObj)) {
        return dynamic_cast<AmfCoding *>(thisObj)->isEquals(thatObj);
    } else if (dynamic_cast<CCArray *>(thisObj) && dynamic_cast<CCArray *>(thatObj)) {
        CCArray *thisArray = dynamic_cast<CCArray *>(thisObj);
        CCArray *thatArray = dynamic_cast<CCArray *>(thatObj);
        int count = thisArray->count();
        int capacity = thisArray->capacity();
        if (count != thatArray->count() || (count == 0 && capacity != thatArray->capacity()))
            return false;
        for (int i = 0; i < count; i++) {
            if (!isSame(thisArray->objectAtIndex(i), thatArray->objectAtIndex(i)))
                return false;
        }
        return true;
    } else if (dynamic_cast<CCDictionary *>(thisObj) && dynamic_cast<CCDictionary *>(thatObj)) {
        CCDictionary *thisDict = dynamic_cast<CCDictionary *>(thisObj);
        CCDictionary *thatDict = dynamic_cast<CCDictionary *>(thatObj);
        int count = thisDict->count();
        if (count != thatDict->count())
            return false;
        CCDictElement *thisElement;
        CCDICT_FOREACH(thisDict, thisElement) {
                char const *thisKey = thisElement->getStrKey();
                CCObject *thatValue = thatDict->objectForKey(thisKey);
                if (!thatValue) return false;
                if (!isSame(thisElement->getObject(), thatValue)) return false;
            }
Exemple #2
0
bool SpriteAnimation::init(const char* plist, bool repeat)
{
	if (!CCSprite::init())
	{
		return false;
	}
    
    _paused = false;
    
	CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
	cache->addSpriteFramesWithFile(plist);
	
	CCDictionary *dict = CCDictionary::createWithContentsOfFile(plist);
	CCDictionary *framesDict = (CCDictionary*)dict->objectForKey("frames");
	
	CCArray* frameNames = framesDict->allKeys();
	std::sort(frameNames->data->arr, frameNames->data->arr + frameNames->data->num, compare);
	
	CCArray* animFrames = CCArray::createWithCapacity(framesDict->count());
	
	CCObject* frameName;
	CCARRAY_FOREACH(frameNames, frameName)
	{
		CCSpriteFrame* frame = cache->spriteFrameByName(((CCString*)frameName)->getCString());
		animFrames->addObject(frame);
	}
void LevelMgr::Init(CCLayer* layer)
{
	mGameLayer = layer;
	//¶ÁfishInfo
	const char* testPlistPath = "fish/GamePart.plist";
	std::string str1 = CCFileUtils::sharedFileUtils()->fullPathForFilename(testPlistPath);
	CCDictionary* plistDic = CCDictionary::createWithContentsOfFile(str1.c_str());
	mLevelCount = plistDic->count();
	char str[64] = {0};
	for(int i=1;i<=mLevelCount;i++)
	{
		sprintf(str,"level%d",i);
		CCDictionary* levelDic = dynamic_cast<CCDictionary*>(plistDic->objectForKey(str));
		LevelInfo levelInfo;
		strcpy(levelInfo.fishList,levelDic->valueForKey("fish")->getCString());
		strcpy(levelInfo.fishCount,levelDic->valueForKey("fishCount")->getCString());
		levelInfo.time = levelDic->valueForKey("time")->intValue();
		strcpy(levelInfo.music,levelDic->valueForKey("bgMusic")->getCString());
		CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(levelInfo.music); 
		strcpy(levelInfo.background,levelDic->valueForKey("background")->getCString());
		mLevelInfoList.push_back(levelInfo);
	}
	mMainFrame = UIMgr::Instance()->GetMainFrame();
	// Ô¤¼ÓÔØÒôÀÖºÍÒôЧ 
}
CCArray * GAFAsset::objectStatesFromConfigFrame(CCDictionary * configFrame)
{
	if (!configFrame)
	{
		return NULL;
	}
	CCDictionary * stateNodes = (CCDictionary *) configFrame->objectForKey(kFrameStateKey);
	if (!stateNodes)
	{
		return NULL;
	}
    CCArray *states = CCArray::createWithCapacity(stateNodes->count());
	
	CCDictElement* pElement = NULL;
    CCDICT_FOREACH(stateNodes, pElement)
    {
		CCDictionary * stateDictionary = (CCDictionary *)pElement->getObject();
		GAFSubobjectState * state = GAFSubobjectState::createWithStateDictionary(stateDictionary, pElement->getStrKey());
		if (state)
		{
			states->addObject(state);
		}
		else
		{
			CCLOGINFO("GAFSubobjectState cannot be created. Ignoring.");
		}
	}
void GB2ShapeCache::addShapesWithFile(const std::string &plist) {

	CCDictionary *dict = CCDictionary::createWithContentsOfFileThreadSafe(plist.c_str());
		//dictionaryWithContentsOfFileThreadSafe(plist.c_str());
	CCAssert(dict != NULL, "Shape-file not found"); // not triggered - cocos2dx delivers empty dict if non was found
    CCAssert(dict->count() != 0, "plist file empty or not existing");
	
	CCDictionary *metadataDict = (CCDictionary *)dict->objectForKey("metadata");
    int format = static_cast<CCString *>(metadataDict->objectForKey("format"))->intValue();
    ptmRatio = static_cast<CCString *>(metadataDict->objectForKey("ptm_ratio"))->floatValue();
	CCAssert(format == 1, "Format not supported");

	CCDictionary *bodyDict = (CCDictionary *)dict->objectForKey("bodies");

    b2Vec2 vertices[b2_maxPolygonVertices];

	CCDictElement* pElement = NULL;
	CCDICT_FOREACH(bodyDict, pElement)
	{
		BodyDef *bodyDef = new BodyDef();

		CCString *bodyName = ccs(pElement->getStrKey());

		CCDictionary *bodyData = (CCDictionary *)pElement->getObject();
		bodyDef->anchorPoint = CCPointFromString(static_cast<CCString *>(bodyData->objectForKey("anchorpoint"))->getCString());
		
		CCArray *fixtureList = (CCArray *)bodyData->objectForKey("fixtures");
		FixtureDef **nextFixtureDef = &(bodyDef->fixtures);
		
		CCObject *fixture = NULL;
		CCARRAY_FOREACH(fixtureList, fixture)
		{
		
			b2FixtureDef basicData;
			CCDictionary *fixtureData = (CCDictionary *)fixture;
			int callbackData = 0;

			basicData.filter.categoryBits = static_cast<CCString *>(fixtureData->objectForKey("filter_categoryBits"))->intValue();
            basicData.filter.maskBits = static_cast<CCString *>(fixtureData->objectForKey("filter_maskBits"))->intValue();
            basicData.filter.groupIndex = static_cast<CCString *>(fixtureData->objectForKey("filter_groupIndex"))->intValue();
            basicData.friction = static_cast<CCString *>(fixtureData->objectForKey("friction"))->floatValue();
            basicData.density = static_cast<CCString *>(fixtureData->objectForKey("density"))->floatValue();
            basicData.restitution = static_cast<CCString *>(fixtureData->objectForKey("restitution"))->floatValue();
            basicData.isSensor = (bool)static_cast<CCString *>(fixtureData->objectForKey("isSensor"))->intValue();
			if(fixtureData->objectForKey("id")){
				basicData.userData = static_cast<CCString *>(fixtureData->objectForKey("id"));
				callbackData = static_cast<CCString *>(fixtureData->objectForKey("id"))->intValue();
			}

			std::string fixtureType = static_cast<CCString *>(fixtureData->objectForKey("fixture_type"))->getCString();
			//CCString *fixtureType = static_cast<CCString *>(fixtureData->objectForKey("fixture_type"))->getCString();

			if (fixtureType == "POLYGON") {
				//CCDictionary *polygons = (CCDictionary *)fixtureData->objectForKey("polygons");
				CCArray *polygons = (CCArray *)fixtureData->objectForKey("polygons");
				//CCDictElement *polygon = NULL;
				CCObject *polygon = NULL;
				//CCDICT_FOREACH(polygons, polygon)
				CCARRAY_FOREACH(polygons, polygon)
				{
					FixtureDef *fix = new FixtureDef();
					fix->fixture = basicData; // copy basic data
					fix->callbackData = callbackData;

					b2PolygonShape *polyshape = new b2PolygonShape();
                    int vindex = 0;

					//CCDictionary *polygonData = (CCDictionary *)polygon->getObject();
					CCArray *polygonData = (CCArray *)polygon;

					assert(polygonData->count() <= b2_maxPolygonVertices);

					//CCDictElement *offset = NULL;
					CCObject *offset = NULL;
					//CCDICT_FOREACH(polygonData, offset)
					CCARRAY_FOREACH(polygonData, offset)
					{

						CCString *pStr = (CCString *)offset;
						CCPoint p = CCPointFromString(pStr->getCString());

						vertices[vindex].x = (p.x / ptmRatio) ; 
                        vertices[vindex].y = (p.y / ptmRatio) ; 
                        vindex++;

					}
void RequestList::useItem(CCObject* pSender)
{
    if (pSender == NULL)
    {
        return;
    }
    
    CCMenuItemImage* sender = (CCMenuItemImage*)pSender;
    CCLOG("Call for useItem for tag = %d", sender->getTag());
    
    if (sender->getTag() > _fbIncomingRequestList->count())
    {
        return;
    }
    
    std::string messageToDisplay = "";
    
    EziFBIncomingRequest* fbRequest = (EziFBIncomingRequest*)_fbIncomingRequestList->objectAtIndex(sender->getTag());
    
    if (fbRequest->isConsumed())
    {
        CCMessageBox("This item is already consumed.", "Consume Item Status");
        return;
    }
    
    
    EziSocialWrapperNS::FB_REQUEST::TYPE requestType = fbRequest->getRequestType();
    
    const char* senderName      = fbRequest->getSender()->getName();
    const char* requestTypeChar = "";
    const char* message         = "";
    
    message = fbRequest->getMessage();
    
    CCDictionary* giftDictionary = fbRequest->getDataDictionary();
    
    switch (requestType)
    {
        case EziSocialWrapperNS::FB_REQUEST::REQUEST_INVITE:
            requestTypeChar = "Invite";
            break;
            
        case EziSocialWrapperNS::FB_REQUEST::REQUEST_GIFT:
            requestTypeChar = "Gift";
            break;
            
        case EziSocialWrapperNS::FB_REQUEST::REQUEST_CHALLENGE:
            requestTypeChar = "Challenge";
            break;
            
        default:
            requestTypeChar = "Unknown";
            break;
    }
    
    // Add the request Type
    messageToDisplay.append("Request Type = ").append(requestTypeChar).append("\n");
    
    // Add the sender Name
    messageToDisplay.append("Sender = ").append(senderName).append("\n");
    
    // Add the message.
    messageToDisplay.append("Message = ").append(message).append("\n");
    
    if (giftDictionary && giftDictionary->count()>0)
    {
        CCArray* allKeys = giftDictionary->allKeys();
        if (allKeys && allKeys->count() > 0)
        {
            messageToDisplay.append("Extra/Gift items sent:\n");
            for (int i=0; i<allKeys->count(); i++)
            {
                CCString* key   = (CCString*)allKeys->objectAtIndex(i);
                CCString* value = (CCString*)giftDictionary->objectForKey(key->getCString());
                messageToDisplay.append(key->getCString()).append(": ").append(value->getCString()).append("\n");
            }
        }
        
    }
    else
    {
        messageToDisplay.append("No Extra Items were sent by sender");
    }
    
    CCMessageBox(messageToDisplay.c_str(), "Item Consumed!!! :)))");
    
    EziFBIncomingRequestManager::sharedManager()->consumeItem(fbRequest);
    
    CCScene *pScene = CCScene::create();
	RequestList *pLayer = RequestList::create();
	pScene->addChild(pLayer);
	CCDirector::sharedDirector()->replaceScene(pScene);
    
}
void RequestList::tableCellTouched(CCTableView *table, CCTableViewCell *cell)
{
    CCLOG("cell touched at index: %i", cell->getIdx());
    std::string messageToDisplay = "";
    
    EziFBIncomingRequest* fbRequest = (EziFBIncomingRequest*)_fbIncomingRequestList->objectAtIndex(cell->getIdx());
    EziSocialWrapperNS::FB_REQUEST::TYPE requestType = fbRequest->getRequestType();

    const char* senderName      = fbRequest->getSender()->getName();
    const char* requestTypeChar = "";
    const char* message         = "";
    
    message = fbRequest->getMessage();
    
    CCDictionary* giftDictionary = fbRequest->getDataDictionary();
    
    switch (requestType)
    {
        case EziSocialWrapperNS::FB_REQUEST::REQUEST_INVITE:
            requestTypeChar = "Invite";
            break;
            
        case EziSocialWrapperNS::FB_REQUEST::REQUEST_GIFT:
            requestTypeChar = "Gift";
            break;
            
        case EziSocialWrapperNS::FB_REQUEST::REQUEST_CHALLENGE:
            requestTypeChar = "Challenge";
            break;
            
        default:
            requestTypeChar = "Unknown";
            break;
    }
    
    // Add the request Type
    messageToDisplay.append("Request Type = ").append(requestTypeChar).append("\n");
    
    // Add the sender Name
    messageToDisplay.append("Sender = ").append(senderName).append("\n");
    
    // Add the message.
    messageToDisplay.append("Message = ").append(message).append("\n");
    
    if (giftDictionary && giftDictionary->count()>0)
    {
        CCArray* allKeys = giftDictionary->allKeys();
        if (allKeys && allKeys->count() > 0)
        {
            messageToDisplay.append("Extra/Gift items sent:\n");
            for (int i=0; i<allKeys->count(); i++)
            {
                CCString* key   = (CCString*)allKeys->objectAtIndex(i);
                CCString* value = (CCString*)giftDictionary->objectForKey(key->getCString());
                messageToDisplay.append(key->getCString()).append(": ").append(value->getCString()).append("\n");
            }
        }
        
    }
    else
    {
        messageToDisplay.append("No Extra Items were sent by sender");
    }
    
    CCMessageBox(messageToDisplay.c_str(), "Request Details");
}
CCArray* LoadLevelEnemies::getEnemiesListFromLayer(CCTMXTiledMap *tilemap,
		Player *player) {

	CCTMXLayer* layer = tilemap->layerNamed("enemies");

	CCSize layersize = layer->getLayerSize();

	CCLOG("%s \n", "setEnemiesTilesInformation");
	CCArray *enemieArray = CCArray::create();
	CCDictionary* enemiesDictionary = PersistenceAux::getEnemyData();
	CCLOG("Enemy data loaded");
	for (int x = 0; x < layersize.width; x++) {
		for (int y = 0; y < layersize.height; y++) {
			unsigned int tmpgid = layer->tileGIDAt(ccp(x, y));
			if (tmpgid != 0) {
				CCSprite* tile = layer->tileAt(ccp(x, y));
				CCRect box = tile->boundingBox();
				CCPoint boxsize = ccp(box.size.width, box.size.height);
				CCPoint tilePosition = ccpAdd(tile->getPosition(),
						ccpMult(boxsize, 0.5));
				layer->removeTileAt(ccp(x, y));

				// create the enemy directly
				CCDictionary* tileProperties = tilemap->propertiesForGID(
						tmpgid);
				CCLOG("%s \n", "dictionary for enemies properties");
				CCString* enemyName = (CCString*) tileProperties->objectForKey(
						"name");
				CCLOG("Enemy name %s \n", enemyName->getCString());
				CCDictionary* enemyProperties =
						(CCDictionary *) enemiesDictionary->objectForKey(
								enemyName->getCString());
				CCLOG("Enemy prop. Dictionary size %d \n",
						enemyProperties->count());
				CCLOG("Enemy Position x %d \n", tilePosition.x);

				CCLOG("************** PLIST ****************** \n");
				CCLOG("SPEED %s",
						((CCString*) enemyProperties->objectForKey("speed"))->getCString());
				CCLOG("JUMPFORCE %s",
						((CCString*) enemyProperties->objectForKey("jump"))->getCString());
				CCLOG("SIGHT %s",
						((CCString*) enemyProperties->objectForKey("sight"))->getCString());
				CCLOG("DIFICULT %s",
						((CCString*) enemyProperties->objectForKey("dificult"))->getCString());
				CCLOG("DEFAULT IMAGE %s",
						((CCString*) enemyProperties->objectForKey(
								"defaultimage"))->getCString());
				CCLOG("************** PLIST END ****************** \n");

				MeeleEnemy* enemy = MeeleEnemy::create(
						(CCString*) enemyProperties->objectForKey(
								"defaultimage"),
						(CCString*) enemyProperties->objectForKey("dificult"),
						(CCString*) enemyProperties->objectForKey("jump"),
						(CCString*) enemyProperties->objectForKey("sight"),
						(CCString*) enemyProperties->objectForKey("speed"),
						tilePosition, enemyName,
						(CCString*) enemyProperties->objectForKey("damage")
				);
				CCLOG("%s \n", "Initializing enemies");
				enemy->initMeeleEnemy(player);
				CCLOG("%s \n", "Add enemies to enemy array");
				enemieArray->addObject(enemy);
			}
		}
	}
	return enemieArray;
}
Exemple #9
0
MapItem* CData::getConfigOfMapLevel(int levelid)
{
    if(m_config_map_level_dic->count()<1)
    {
    
    Json::Reader read;
    Json::Value root;
    Json::Value data;
    
    Json::Value list;
    
    
    string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("map.json");
    CCString* str = CCString::createWithContentsOfFile(path.c_str());
    int sz = 0;
    if(read.parse(str->getCString(), root)){
        data = root["data"];
        sz = data.size();
        
        
        for (int i = 0; i < sz; i++) {
            
            
            MapItem *item = new MapItem();
//            item->autorelease();
            item->nickname = data[i]["name"].asString();
            item->desc = data[i]["desc"].asString();
            item->bid = data[i]["id"].asInt();
            item->exp = data[i]["exp"].asInt();
            item->coin = data[i]["coin"].asInt();
          //  item->itemId = root[i]["dropicon"].asInt();
            
            
            
            list = data[i]["mconfig"];
            CCDictionary* dic = CCDictionary::create();
           
            int  len =list.size();
            for (int ei = 0; ei < len; ei++)
            {
                int iiiiid = list[ei].asInt();
                configMonsterItem* hitem =CData::getCData()->getConfigOfMonster(iiiiid);
                if(hitem != NULL)
                {
                    dic->setObject(hitem, hitem->nickname);
                    
                }
                else{
                    char iii[100] = "";
                    sprintf(iii, "怪物id不存在  %d",iiiiid);
                    CCLog(iii);
                }
                
            }
            
            char chars[500] = "";
            
            int how = dic->count();
            CCArray* arr = dic->allKeys();
            switch (how) {
                case 1:
                    sprintf(chars, "【%s】",((CCString*)(arr->objectAtIndex(0)))->getCString());
                    break;
                case 2:
                    sprintf(chars, "【%s】\n【%s】",((CCString*)(arr->objectAtIndex(0)))->getCString(),((CCString*)(arr->objectAtIndex(1)))->getCString());
                    break;
                case 3:
                    sprintf(chars, "【%s】  【%s】\n【%s】",((CCString*)(arr->objectAtIndex(0)))->getCString(),((CCString*)(arr->objectAtIndex(1)))->getCString(),((CCString*)(arr->objectAtIndex(2)))->getCString());
                    break;
                    
                default:
                    if(how >= 4)
                    {
                        sprintf(chars, "【%s】  【%s】\n【%s】  【%s】",((CCString*)(arr->objectAtIndex(0)))->getCString(),
                                ((CCString*)(arr->objectAtIndex(1)))->getCString(),
                                ((CCString*)(arr->objectAtIndex(2)))->getCString(),((CCString*)(arr->objectAtIndex(3)))->getCString());
                    }
                    break;
            }
            
            item->enemydesc = chars;
            
            CCLog(item->enemydesc.c_str());
            m_config_map_level_dic->setObject(item, item->bid);
        }
        
        
    }
    }
    
    return (MapItem*)m_config_map_level_dic->objectForKey(levelid);

}
Exemple #10
0
void b2ShapeCache::addShapesWithFile(const std::string &plist, b2Vec2 vertexScale, float ptm) {
    
    CCDictionary *dict = CCDictionary::createWithContentsOfFile(plist.c_str());
    CCAssert(dict != NULL, "Shape-file not found");
    CCAssert(dict->count() != 0, "plist file empty or not existing");
    
    CCDictionary *metadataDict = (CCDictionary *)dict->objectForKey("metadata");
    int format = metadataDict->valueForKey("format")->intValue();
    ptmRatio = metadataDict->valueForKey("ptm_ratio")->floatValue();
    if (ptm <= 0)
        ptm = ptmRatio;
    CCLOG("ptmRatio = %f",ptmRatio);
    CCAssert(format == 1, "Format not supported");
    
    CCDictionary *bodyDict = (CCDictionary *)dict->objectForKey("bodies");

    b2Vec2 vertices[b2_maxPolygonVertices];
    
    CCDictElement *dictElem;
    std::string bodyName;
    CCDictionary *bodyData;
    //iterate body list
    CCDICT_FOREACH(bodyDict,dictElem )
    {
        bodyData = (CCDictionary*)dictElem->getObject();
        bodyName = dictElem->getStrKey();
        
        
        BodyDef *bodyDef = new BodyDef();
        CCPoint a = CCPointFromString(bodyData->valueForKey("anchorpoint")->getCString());
        float32 ax = (vertexScale.x >= 0) ? (float32)a.x : (float32)(1-a.x);
        float32 ay = (vertexScale.y >= 0) ? (float32)a.y : (float32)(1-a.y);
        bodyDef->anchorPoint = b2Vec2(ax, ay);
        CCArray *fixtureList = (CCArray*)(bodyData->objectForKey("fixtures"));
        FixtureDef **nextFixtureDef = &(bodyDef->fixtures);
        
        //iterate fixture list
        CCObject *arrayElem;
        CCARRAY_FOREACH(fixtureList, arrayElem)
        {
            b2FixtureDef basicData;
            CCDictionary* fixtureData = (CCDictionary*)arrayElem;
            
            basicData.filter.categoryBits = fixtureData->valueForKey("filter_categoryBits")->intValue();
            basicData.filter.maskBits = fixtureData->valueForKey("filter_maskBits")->intValue();
            basicData.filter.groupIndex = fixtureData->valueForKey("filter_groupIndex")->intValue();
            basicData.friction = fixtureData->valueForKey("friction")->floatValue();
            basicData.density = fixtureData->valueForKey("density")->floatValue();
            basicData.restitution = fixtureData->valueForKey("restitution")->floatValue();
            basicData.isSensor = fixtureData->valueForKey("isSensor")->intValue() != 0;
           
            int callbackData = fixtureData->valueForKey("userdataCbValue")->intValue();
            
            const char* fixtureType = fixtureData->valueForKey("fixture_type")->getCString();

            if (strcmp(fixtureType, "POLYGON")==0) {
                CCArray *polygonsArray = (CCArray *)(fixtureData->objectForKey("polygons"));
                
                CCObject *dicArrayElem;
                CCARRAY_FOREACH(polygonsArray, dicArrayElem)
                {
                    FixtureDef *fix = new FixtureDef();
                    fix->fixture = basicData; // copy basic data
                    fix->callbackData = callbackData;
                    
                    b2PolygonShape *polyshape = new b2PolygonShape();
                    int vindex = 0;
                    
                    CCArray *polygonArray = (CCArray*)dicArrayElem;
                    
                    assert(polygonArray->count() <= b2_maxPolygonVertices);
                    
                    CCObject *piter;
                    CCARRAY_FOREACH(polygonArray, piter)
                    {
                        CCString *verStr = (CCString*)piter;
                        CCPoint offset = CCPointFromString(verStr->getCString());
                        vertices[vindex] = b2Vec2((float32)(offset.x / ptmRatio) * vertexScale.x, (float32)(offset.y / ptmRatio) * vertexScale.y);
                        vindex++;
                    }
Exemple #11
0
void GB2ShapeCache::addShapesWithFile(const std::string &plist) {
    
	//const char *fullName = CCFileUtils::sharedFileUtils()->fullPathForFilename(plist.c_str()).c_str();
    
    CCDictionary *dict = CCDictionary::createWithContentsOfFile(plist.c_str());
    // not triggered - cocos2dx delivers empty dict if non was found

	CCAssert(dict != NULL, "Shape-file not found");
    
    CCAssert(dict->count() != 0, "plist file empty or not existing");
	
	CCDictionary *metadataDict = (CCDictionary *)dict->objectForKey("metadata");
    
    int format = static_cast<CCString *>(metadataDict->objectForKey("format"))->intValue();
    ptmRatio = static_cast<CCString *>(metadataDict->objectForKey("ptm_ratio"))->floatValue();
    CCLOG("ptmRatio = %f",ptmRatio);
	CCAssert(format == 1, "Format not supported");

    
	CCDictionary *bodyDict = (CCDictionary *)dict->objectForKey("bodies");

    b2Vec2 vertices[b2_maxPolygonVertices];
    
    CCDictElement *dictElem;
    std::string bodyName;
	CCDictionary *bodyData;
    //iterate body list
    CCDICT_FOREACH(bodyDict,dictElem )
    {
        bodyData = (CCDictionary*)dictElem->getObject();
        bodyName = dictElem->getStrKey();
        
        
        BodyDef *bodyDef = new BodyDef();
        bodyDef->anchorPoint = CCPointFromString(static_cast<CCString *>(bodyData->objectForKey("anchorpoint"))->getCString());
        CCArray *fixtureList = (CCArray*)(bodyData->objectForKey("fixtures"));
        FixtureDef **nextFixtureDef = &(bodyDef->fixtures);
        
        //iterate fixture list
        CCObject *arrayElem;
        CCARRAY_FOREACH(fixtureList, arrayElem)
        {
            b2FixtureDef basicData;
            CCDictionary* fixtureData = (CCDictionary*)arrayElem;
            
            basicData.filter.categoryBits = static_cast<CCString *>(fixtureData->objectForKey("filter_categoryBits"))->intValue();
            
            basicData.filter.maskBits = static_cast<CCString *>(fixtureData->objectForKey("filter_maskBits"))->intValue();
            basicData.filter.groupIndex = static_cast<CCString *>(fixtureData->objectForKey("filter_groupIndex"))->intValue();
            basicData.friction = static_cast<CCString *>(fixtureData->objectForKey("friction"))->floatValue();
            
            basicData.density = static_cast<CCString *>(fixtureData->objectForKey("density"))->floatValue();
            
            basicData.restitution = static_cast<CCString *>(fixtureData->objectForKey("restitution"))->floatValue();
            
            basicData.isSensor = (bool)static_cast<CCString *>(fixtureData->objectForKey("isSensor"))->intValue();
           
            CCString *cb = static_cast<CCString *>(fixtureData->objectForKey("userdataCbValue"));
            
            int callbackData = 0;

			if (cb)
				callbackData = cb->intValue();

			std::string fixtureType = static_cast<CCString *>(fixtureData->objectForKey("fixture_type"))->m_sString;

			if (fixtureType == "POLYGON") {
				CCArray *polygonsArray = (CCArray *)(fixtureData->objectForKey("polygons"));
				
                CCObject *dicArrayElem;
                CCARRAY_FOREACH(polygonsArray, dicArrayElem)
                {
                    FixtureDef *fix = new FixtureDef();
                    fix->fixture = basicData; // copy basic data
                    fix->callbackData = callbackData;
                    
                    b2PolygonShape *polyshape = new b2PolygonShape();
                    int vindex = 0;
                    
                    CCArray *polygonArray = (CCArray*)dicArrayElem;
                    
                    assert(polygonArray->count() <= b2_maxPolygonVertices);
                    
                    CCObject *piter;
                    CCARRAY_FOREACH(polygonArray, piter)
                    {
                        CCString *verStr = (CCString*)piter;
                        CCPoint offset = CCPointFromString(verStr->getCString());
                        vertices[vindex].x = (offset.x / ptmRatio) ;
                        vertices[vindex].y = (offset.y / ptmRatio) ;
                        vindex++;
                    }