好想吐槽,唉,活得大喜大悲啊。牛犊不怕虎,自己都成老牛了,还是跟牛犊一样啊。
逃课情况下,发奋了七个月考上了研究生,复试突击5道题做对了1道。啥java,c++,都不懂啊。
为了给自己找压力,学习,实习了一份工作,各种不会啊。不会领工资很是内疚的啊啊啊。
昨天解析了plist文件,把其整理一下。
<plist version="1.0">
<dict>
<key>sprites</key>
<dict>
<key>00_New_Sprite</key>
<dict>
<key>anchor</key>
<string>{0.5,0.5}</string>
<key>image</key>
<string>bg.jpg</string>
<key>position</key>
<string>{510,384}</string>
<key>rotation</key>
<string>0</string>
<key>scale</key>
<string>{1,1}</string>
<key>opacity</key>
<string>255</string>
</dict>
<key>01_New_Sprite</key>
<dict>
<key>anchor</key>
<string>{0.5,0.5}</string>
<key>image</key>
<string>sprite1.png</string>
<key>position</key>
<string>{253,238}</string>
<key>rotation</key>
<string>90</string>
<key>scale</key>
<string>{2,1}</string>
<key>opacity</key>
<string>255</string>
</dict>
<key>02_New_Sprite</key>
<dict>
<key>actorType</key>
<string>CCActor</string>
<key>anchor</key>
<string>{0.5,0.5}</string>
<key>image</key>
<string>sprite2.png</string>
<key>position</key>
<string>{851,257}</string>
<key>rotation</key>
<string>45</string>
<key>scale</key>
<string>{1,2}</string>
<key>opacity</key>
<string>255</string>
</dict>
<key>03_New_Sprite</key>
<dict>
<key>actorType</key>
<string>CCActor</string>
<key>anchor</key>
<string>{0.5,0.5}</string>
<key>image</key>
<string>sprite3.png</string>
<key>position</key>
<string>{522,528}</string>
<key>rotation</key>
<string>80</string>
<key>scale</key>
<string>{1,1}</string>
<key>opacity</key>
<string>255</string>
</dict>
</dict>
</dict>
</plist>
这是文件格式。
任务:尝试通过sprite.plist加载页面,了解CCDictionary的用法:sprite.plist中以key,value的形式列出了界面上sprite的基本属性,通过加载plist文件,读取key的值可以知道每一个sprite的位置,大小,旋转角度,透明度等加载plist文件的方法:CCDictionary *dict = CCDictionary::createWithContentsOfFile("sprite.plist".c_str());
首先想到的是一个一个解析。麻烦的要死。单个代码如下
CCArray *animal_dictionary=CCDictionary::createWithContentsOfFile("sprites.plist");
CCDictionary *content_1 = (CCDictionary*) animal_dictionary->objectForKey("sprites");
CCDictionary *content_11=(CCDictionary*) content_1->objectForKey("00_New_Sprite");
CCSprite *sprite1=CCSprite::create(content_11->valueForKey("image")->getCString());
sprite1->setPosition(CCPointFromString(content_11->valueForKey("position")->getCString()));
//sprite1->setAnchorPoint(CCPointFromString(content_11->valueForKey("anchor")->getCString()));
sprite1->setRotation((content_11->valueForKey("rotation")->getCString());
this->addChild(sprite1);
CCDictionary *content_12=(CCDictionary*)content_1->objectForKey("01_New_Sprite");
CCSprite *sprite2=CCSprite::create(content_12->valueForKey("image")->getCString());
sprite2->setPosition(CCPointFromString(content_12->valueForKey("position")->getCString()));
sprite2->setAnchorPoint(CCPointFromString(content_12->valueForKey("anchor")->getCString()));
sprite2->setRotation((float)(*content_12->valueForKey("rotation")->getCString()));
this->addChild(sprite2);
CCDictionary *content_13=(CCDictionary*)content_1->objectForKey("02_New_Sprite");
CCSprite *sprite3=CCSprite::create(content_13->valueForKey("image")->getCString());*/
........
这样要写到几年啊。用个for循环把。
但是还是麻烦啊,每个都要顾及自己的变量啊。
自己创建个Sprite类,把里面的属性放到构造函数里面。读到文件plist(
CCArray *animal_dictionary=CCDictionary::createWithContentsOfFile("sprites.plist");
)后在读一次CCDictionary *content_1 = (CCDictionary*) animal_dictionary->objectForKey("sprites");可以到达sprites目录下,也就是可以看到xx_New_Sprite一系列的名字了。这时候可以new个精灵了,因为下一步就可以进入到精灵内部类。还有个问题,进入到sprites里面后,要把此目录下的四个文件放在数组里用到语句是
CCArray *plist_array=content_1->allKeys();
plist_array->count()是数组的长度。想把每个sprite的名字取出来该怎么办呢? CCString *str=(*CCString*) plist_array->objectAtIndex(i);
这时候已经得到了下层目录的值了,也就可以理解为四个文件夹的名字了。 str->getCCString();
让sprite指向这些名字(注意四个文件夹还是目录) CCDictionary *sprite =dynamic_cast<CCDictionary>(content1->objectForKey(str->getCString));
得到的这个sprite要使用这是每个精灵的对象的指针。
然后就是创建精灵 MySprite *sprites=new MySprite(sprite,this);
把精灵的属性都放在构造函数里,这样的话,每次初始化一个精灵,每个精灵都会自动的调用自己的构造函数,完成构造。
精灵的头文件跟方法定义如下:
头文件:
#include "cocos2d.h"
using namespace cocos2d;
class MySprite:public CCSprite
{
public:
MySprite(void);
~MySprite(void);
MySprite(CCDictionary* pDict,CCLayer* pScene);
};
构造方法实现:
#include"MySprite.h"
MySprite::MySprite(void)
{
}
MySprite::~MySprite(void)
{
}
MySprite::MySprite(CCDictionary *pDict,CCLayer* pScene)
{
CCSprite::initWithFile(pDict->valueForKey("image")->getCString());
this->setAnchorPoint(CCPointFromString(pDict->valueForKey("anchor")->getCString()));
this->setRotation(pDict->valueForKey("rotation")->intValue());
//this->setScale(CCPointFromString(pDict->valueForKey("scale")->getCString()));
//this->setOpacity(pDict->valueForKey("opacity"));
this->setPosition(CCPointFromString(pDict->valueForKey("position")->getCString()));
this->setOpacity(pDict->valueForKey("opacity")->intValue());
pScene->addChild(this);
}
注意传进来的是精灵对象 指针跟Scene指针。
注意里面的思想。把方法都封装了。直接调用构造函数即可。
复习一下。