遇到问题集锦(无c++基础 零起点小小小菜鸟亲身经历) 转自http://blog.csdn.net/qq592116366
2015-03-11 11:15
417 查看
我的笔记若对你有帮助希望评论或者支持下。比较乱,以后再开始分类整理把(*^__^*) 嘻嘻……
1在添加新的层在原背景上面时候(模态窗口),在cocosbuilder中 应该新建为node格式 而不是layer 否则 会弹出
CCNodeLoaderMap::iterator ccNodeLoadersIterator =this->mCCNodeLoaders.find(pClassName);
assert(ccNodeLoadersIterator !=this->mCCNodeLoaders.end());
return ccNodeLoadersIterator->second;
2期待下一个问题出现,哈哈
a,问题出现了,要弹出一个新层,此层有大小以及位置。在cocosbuilder中可以设置node的锚点位置,例如设置到中间位置的锚点为anchor point -0.5,-0.5.但是经过操作发现这样设置的话 在代码中设置层的位置变得难于理解,例如 偏左上角node->setPosition(ccp(-50,
-30));
所以默认0,0 最好,将精灵都放在这个node中 在代码中设置 node位置(想要将node放在哪就放哪)。
b,对node缩放 同理 于sprite :pClickItem->setScaleX(0.1),pClickItem->setScaleY(0.1); -》 node->setScaleX(0.5),node->setScaleY(0.5);
3移除所在父类窗口(层/node)
this->removeFromParentAndCleanup(true);
4执行触摸事件及优先级
void 类名::onEnter(){
CCLog("CCAlert::onEnter()");
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,
-128, true);
CCLayer::onEnter();
}
void 类名::onExit(){
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}
boolXXX::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent){
return true;
}
void XXX::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent){
}
实验发现,同等优先级下,后添加的Layer先响应事件。
右侧点击菜单 弹出左侧,这时候左边的优先级默认为与右边相同,那么右侧就无法再执行触摸事件。
解决办法:左侧窗口优先级数值调高
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,
-100, true);
此时效果->左右均可触摸
5记录存储数据
CCUserDefault::sharedUserDefault()->setStringForKey("name","nishihou");
CCUserDefault::sharedUserDefault()->flush();//这里一定要提交写入哦,否则不会记录到xml中,下次启动游戏就获取不到value了。
//这里随便定义一个string为了验证我们的存储
std::string str="select";
//取出我们刚存储的nishihou,然后赋值给str验证下;
str= CCUserDefault::sharedUserDefault()->getStringForKey("name");
CCLog("打印str=:%s",str.c_str());
// CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key").c_str());
文件存储的地址可以使用CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str()获得。
删除数据 ,设为空即可
CCUserDefault::sharedUserDefault()->setStringForKey("key","");
CCUserDefault::sharedUserDefault()->flush();
6报错
原因:1头文件的添加是否多余2是因为有个变量重命名了
我这次犯的错误就是引用头文件时候,误把.h弄成.cpp了 找了半天 我太马虎了 呵呵
7看来真是我a原理不明确b基础不扎实
判断存储字符串的 应该用string类型 而不是写成bool if判断 我好菜呀
[cpp] view
plaincopyprint?
void SpriteSelectScene::xuannishihou(CCObject *sender)
{
CCLog("点击泥石猴菜单");
userDefault();
std::string a = CCUserDefault::sharedUserDefault()->getStringForKey("key1");
//如果 取到值 则 true 不添加左侧窗口 不执行菜单方法
if (a=="nishihou")
{
CCLog("有数据,此方法不执行");
CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key1").c_str());
return;
}
//如果取到值为空(无数据)则添加宠物到左侧窗口
else
{ //加载左侧窗口
CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());
node->setPosition(ccp(80, 200));
addChild(node,1);
CCLog("没有数据,执行添加");
}
}
8用了整整半天加1小时的时间终于把这个 “判断数据有无执行与否”的问题给弄懂了 后来在
[cpp] view
plaincopyprint?
代码 附下
[cpp] view
plaincopyprint?
void SpriteSelectScene::onNodeLoaded(CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader)
{
CCLog("onNodeLoadedonNodeLoadedonNodeLoaded");
CCSize size = CCDirector::sharedDirector()->getWinSize();
//进入游戏判断有无用户选择宠物的记录,若有默认执行上次的选择
std::string a = userDefault->getStringForKey(key_chongwu);
if(a=="selectnishihou")
{
//有数据直接加载界面
CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());
node->setPosition(ccp(80, 200));
addChild(node,1);
}
else {
CCLog("无反映");
return;
}
}
/**
选择宠物/添加宠物到左侧
@param sender <#sender description#>
*/
void SpriteSelectScene::xuannishihou(CCObject *sender)
{
std::string b = userDefault->getStringForKey(key_chongwu);
//如果 取到值 则 true 不添加左侧窗口 不执行菜单方法
if (b=="selectnishihou")
{
CCLOG("有数据不执行");
return;
}
//如果取到值为空(无数据)则添加宠物到左侧窗口
else
{ CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());
node->setPosition(ccp(80, 200));
addChild(node,1);
CCLOG("无数据,执行添加");
userDefault->setStringForKey(key_chongwu, "selectnishihou");
userDefault->flush();
CCLog("打印str=:%s");
}
}
9.2013年04月26日13:28:39
第九个问题 出现了。
XCODE 运行失败 代码提示
Couldn't register com.yourcompany.jingling with the bootstrap server. Error: unknown error code.
This generally means that another instance of this process was already running or is hung in the debugger.(lldb)
回想出现问题的原因:退出 运行时的模拟器 。
解决办法:重启机器 (别人都说重启xocde 和 模拟器最后不行 只能重启机器 )
怎样避免:养成良好习惯,执行完 项目程序 在xcode中 STOP 下。
10.知识没学会,问题不断 哇咔咔 wait 。。。see you later
2013年05月03日15:44:01 在做东西过程中发现了一个容易忽视的环节,往往带来麻烦。
在使用cocosbuilder时 其中Ignore anchor point 要勾选 那么以后其他的例如添加精灵 等等都要保持一致 不然会出现在运行时精灵位置不对的问题
11.接着等。。。
触摸遇到update() 碰撞检测与遍历数组 主要是数组有点蒙
void场景::update(float dt)
{
for(int i =0; i <数组名->count(); i++)
{
场景 * 精灵2 = (场景*)数组名->objectAtIndex(i);
if((精灵1->boundingBox()).intersectsRect(精灵2->boundingBox()))
{ int diantag = dian->getTag();
int yezitag = diantag+100;
if (getChildByTag(yezitag)!=NULL)
{
CCSprite *yezi = (CCSprite *)getChildByTag(yezitag);//强转
this->removeChild(yezi,true);
}else {
CCLog("%d========%d",diantag,yezitag);
}
_dians->removeObject(dian);
this->removeChild(dian,true);
}
else
{
// CCLog("没碰撞");
}
}
}
12 程序运行紊乱 初始化没弄明白 放在
onNodeLoaded里 例如
this->schedule(schedule_selector(YeZiScene::update));与
_yezis = CCArray::create();
for (int i=1;i<=9;i++)
{
int tag =100+i;
if (getChildByTag(tag)!=NULL)
{
CCSprite *sprite = (CCSprite *)getChildByTag(tag);//强转
_yezis->addObject(sprite);
}
}等等 顺序为 先加载游戏界面 然后加载数组 之后循环
13 通过tag获取精灵 +移除
int diantag = dian->getTag();
int yezitag = diantag+100;
if (getChildByTag(yezitag)!=NULL)
{
CCSprite *yezi = (CCSprite *)getChildByTag(yezitag);//强转
this->removeChild(yezi,true);
}else {
CCLog("%d========%d",diantag,yezitag);
}
14移动到触摸点 并且设置速度
CCPoint location=pTouch->getLocation();
//设置执行动作需要移动到的位置,参数1代表时间 2位置
float juli=ccpDistance(qiu->getPosition(),ccp(location.x,location.y));
float sudu=100.0;
CCActionInterval* actionMove =CCMoveTo::create(juli*1.0/sudu,ccp(location.x,location.y));
CCFiniteTimeAction* actionMoveDone =CCCallFuncN::create(this,
callfuncN_selector(YeZiScene::spriteMoveFinished));
qiu->runAction(CCSequence::create(actionMove, actionMoveDone,NULL)
);
}
15注意 有变量的情况下 要声明变量 例如
int diantag = dian->getTag();
int yezitag = diantag+100;
float juli=ccpDistance(qiu->getPosition(),ccp(location.x,location.y));
。。。反正老多了要这样做 要养成习惯 仔细看代码里面 大多数都是
16又是据说是 最基础的东西
有关全局和临时变量
我在头文件中声明
private:
CCSprite* ciqiu;
在.cpp中初始化处写:
CCSprite*ciqiu = (CCSprite*)getChildByTag(196);本想着
以后在用到精灵时候不需要写了,可是结果是NO
终于明白:群里说的,“你再次声明并定义了 虽然名字是一样的 但是是2个完全不同的对象啊,一个是类成员 一个是临时,临时的那个随着函数的消失就消失了,你在.h里面声明 是代表你这个类的类成员。 你在.cpp里面写的那个东西是 一个临时的变量”
解决方法:初始化中
把你前面的 CCsprite * 全部去掉。。
1在添加新的层在原背景上面时候(模态窗口),在cocosbuilder中 应该新建为node格式 而不是layer 否则 会弹出
CCNodeLoaderMap::iterator ccNodeLoadersIterator =this->mCCNodeLoaders.find(pClassName);
assert(ccNodeLoadersIterator !=this->mCCNodeLoaders.end());
return ccNodeLoadersIterator->second;
2期待下一个问题出现,哈哈
a,问题出现了,要弹出一个新层,此层有大小以及位置。在cocosbuilder中可以设置node的锚点位置,例如设置到中间位置的锚点为anchor point -0.5,-0.5.但是经过操作发现这样设置的话 在代码中设置层的位置变得难于理解,例如 偏左上角node->setPosition(ccp(-50,
-30));
所以默认0,0 最好,将精灵都放在这个node中 在代码中设置 node位置(想要将node放在哪就放哪)。
b,对node缩放 同理 于sprite :pClickItem->setScaleX(0.1),pClickItem->setScaleY(0.1); -》 node->setScaleX(0.5),node->setScaleY(0.5);
3移除所在父类窗口(层/node)
this->removeFromParentAndCleanup(true);
4执行触摸事件及优先级
void 类名::onEnter(){
CCLog("CCAlert::onEnter()");
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,
-128, true);
CCLayer::onEnter();
}
void 类名::onExit(){
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
CCLayer::onExit();
}
boolXXX::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent){
return true;
}
void XXX::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent){
}
实验发现,同等优先级下,后添加的Layer先响应事件。
右侧点击菜单 弹出左侧,这时候左边的优先级默认为与右边相同,那么右侧就无法再执行触摸事件。
解决办法:左侧窗口优先级数值调高
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,
-100, true);
此时效果->左右均可触摸
5记录存储数据
CCUserDefault::sharedUserDefault()->setStringForKey("name","nishihou");
CCUserDefault::sharedUserDefault()->flush();//这里一定要提交写入哦,否则不会记录到xml中,下次启动游戏就获取不到value了。
//这里随便定义一个string为了验证我们的存储
std::string str="select";
//取出我们刚存储的nishihou,然后赋值给str验证下;
str= CCUserDefault::sharedUserDefault()->getStringForKey("name");
CCLog("打印str=:%s",str.c_str());
// CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key").c_str());
文件存储的地址可以使用CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str()获得。
删除数据 ,设为空即可
CCUserDefault::sharedUserDefault()->setStringForKey("key","");
CCUserDefault::sharedUserDefault()->flush();
6报错
Apple Mach-O Linker (id) Error : linker command failed with exit code 1 (use -v to see invocation)
原因:1头文件的添加是否多余2是因为有个变量重命名了我这次犯的错误就是引用头文件时候,误把.h弄成.cpp了 找了半天 我太马虎了 呵呵
7看来真是我a原理不明确b基础不扎实
判断存储字符串的 应该用string类型 而不是写成bool if判断 我好菜呀
[cpp] view
plaincopyprint?
void SpriteSelectScene::xuannishihou(CCObject *sender)
{
CCLog("点击泥石猴菜单");
userDefault();
std::string a = CCUserDefault::sharedUserDefault()->getStringForKey("key1");
//如果 取到值 则 true 不添加左侧窗口 不执行菜单方法
if (a=="nishihou")
{
CCLog("有数据,此方法不执行");
CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key1").c_str());
return;
}
//如果取到值为空(无数据)则添加宠物到左侧窗口
else
{ //加载左侧窗口
CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());
node->setPosition(ccp(80, 200));
addChild(node,1);
CCLog("没有数据,执行添加");
}
}
8用了整整半天加1小时的时间终于把这个 “判断数据有无执行与否”的问题给弄懂了 后来在
[cpp] view
plaincopyprint?
代码 附下
[cpp] view
plaincopyprint?
void SpriteSelectScene::onNodeLoaded(CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader)
{
CCLog("onNodeLoadedonNodeLoadedonNodeLoaded");
CCSize size = CCDirector::sharedDirector()->getWinSize();
//进入游戏判断有无用户选择宠物的记录,若有默认执行上次的选择
std::string a = userDefault->getStringForKey(key_chongwu);
if(a=="selectnishihou")
{
//有数据直接加载界面
CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());
node->setPosition(ccp(80, 200));
addChild(node,1);
}
else {
CCLog("无反映");
return;
}
}
/**
选择宠物/添加宠物到左侧
@param sender <#sender description#>
*/
void SpriteSelectScene::xuannishihou(CCObject *sender)
{
std::string b = userDefault->getStringForKey(key_chongwu);
//如果 取到值 则 true 不添加左侧窗口 不执行菜单方法
if (b=="selectnishihou")
{
CCLOG("有数据不执行");
return;
}
//如果取到值为空(无数据)则添加宠物到左侧窗口
else
{ CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());
node->setPosition(ccp(80, 200));
addChild(node,1);
CCLOG("无数据,执行添加");
userDefault->setStringForKey(key_chongwu, "selectnishihou");
userDefault->flush();
CCLog("打印str=:%s");
}
}
9.2013年04月26日13:28:39
第九个问题 出现了。
XCODE 运行失败 代码提示
Couldn't register com.yourcompany.jingling with the bootstrap server. Error: unknown error code.
This generally means that another instance of this process was already running or is hung in the debugger.(lldb)
回想出现问题的原因:退出 运行时的模拟器 。
解决办法:重启机器 (别人都说重启xocde 和 模拟器最后不行 只能重启机器 )
怎样避免:养成良好习惯,执行完 项目程序 在xcode中 STOP 下。
10.知识没学会,问题不断 哇咔咔 wait 。。。see you later
2013年05月03日15:44:01 在做东西过程中发现了一个容易忽视的环节,往往带来麻烦。
在使用cocosbuilder时 其中Ignore anchor point 要勾选 那么以后其他的例如添加精灵 等等都要保持一致 不然会出现在运行时精灵位置不对的问题
11.接着等。。。
触摸遇到update() 碰撞检测与遍历数组 主要是数组有点蒙
void场景::update(float dt)
{
for(int i =0; i <数组名->count(); i++)
{
场景 * 精灵2 = (场景*)数组名->objectAtIndex(i);
if((精灵1->boundingBox()).intersectsRect(精灵2->boundingBox()))
{ int diantag = dian->getTag();
int yezitag = diantag+100;
if (getChildByTag(yezitag)!=NULL)
{
CCSprite *yezi = (CCSprite *)getChildByTag(yezitag);//强转
this->removeChild(yezi,true);
}else {
CCLog("%d========%d",diantag,yezitag);
}
_dians->removeObject(dian);
this->removeChild(dian,true);
}
else
{
// CCLog("没碰撞");
}
}
}
12 程序运行紊乱 初始化没弄明白 放在
onNodeLoaded里 例如
this->schedule(schedule_selector(YeZiScene::update));与
_yezis = CCArray::create();
for (int i=1;i<=9;i++)
{
int tag =100+i;
if (getChildByTag(tag)!=NULL)
{
CCSprite *sprite = (CCSprite *)getChildByTag(tag);//强转
_yezis->addObject(sprite);
}
}等等 顺序为 先加载游戏界面 然后加载数组 之后循环
13 通过tag获取精灵 +移除
int diantag = dian->getTag();
int yezitag = diantag+100;
if (getChildByTag(yezitag)!=NULL)
{
CCSprite *yezi = (CCSprite *)getChildByTag(yezitag);//强转
this->removeChild(yezi,true);
}else {
CCLog("%d========%d",diantag,yezitag);
}
14移动到触摸点 并且设置速度
CCPoint location=pTouch->getLocation();
//设置执行动作需要移动到的位置,参数1代表时间 2位置
float juli=ccpDistance(qiu->getPosition(),ccp(location.x,location.y));
float sudu=100.0;
CCActionInterval* actionMove =CCMoveTo::create(juli*1.0/sudu,ccp(location.x,location.y));
CCFiniteTimeAction* actionMoveDone =CCCallFuncN::create(this,
callfuncN_selector(YeZiScene::spriteMoveFinished));
qiu->runAction(CCSequence::create(actionMove, actionMoveDone,NULL)
);
}
15注意 有变量的情况下 要声明变量 例如
int diantag = dian->getTag();
int yezitag = diantag+100;
float juli=ccpDistance(qiu->getPosition(),ccp(location.x,location.y));
。。。反正老多了要这样做 要养成习惯 仔细看代码里面 大多数都是
16又是据说是 最基础的东西
有关全局和临时变量
我在头文件中声明
private:
CCSprite* ciqiu;
在.cpp中初始化处写:
CCSprite*ciqiu = (CCSprite*)getChildByTag(196);本想着
以后在用到精灵时候不需要写了,可是结果是NO
终于明白:群里说的,“你再次声明并定义了 虽然名字是一样的 但是是2个完全不同的对象啊,一个是类成员 一个是临时,临时的那个随着函数的消失就消失了,你在.h里面声明 是代表你这个类的类成员。 你在.cpp里面写的那个东西是 一个临时的变量”
解决方法:初始化中
把你前面的 CCsprite * 全部去掉。。
相关文章推荐
- 遇到问题集锦(无c++基础 零起点小小小菜鸟亲身经历)
- vs c++项目开发遇到的问题集锦
- 遇到了访问IIS元数据库失败的问题,亲身经历
- Eclipse与Mysql连接中遇到的一个问题,让我苦恼好久....(记录自己的菜鸟经历)
- c++基础编程函数调用时遇到的问题
- 重装系统后Myeclipse遇到的项目配置问题--一个菜鸟的经历!
- C++调试中遇到问题集锦
- Vs.Net2008中混合使用C/C++遇到的问题
- C#中调用C++写的com时遇到的问题与解决方案
- 菜鸟学习C系列——遇到的第1个问题。
- 从C++到C#,我遇到的几个问题
- 问题解决:移除了 Windows SharePoint Services with Service Pack 2 后,遇到关于"WSS_Minimal“ 的HttpException 问题解决
- NHibernate基础学习时遇到的问题
- 因为开发中遇到很多C++的问题,以后会经常来csdn寻求帮助了!
- C++编译spidermonkey遇到的一些问题
- 从C++到C#,我遇到的几个问题
- 遇到HTTP Status 500 问题
- MFC做控件弄得我苦不堪言!(我亲身经历的问题及解决办法)
- C++基础问题
- 学C++遇到的一个小问题