用cocosstudio制作的场景,无法读取内存

如图片所示,alivebear,sp_kiss等是csb文件中的精灵,但是断点显示无法读取内存。。。整个项目的异常中断在


求教!!!

这跟studio有毛关系。。

csb文件不是studio做的?那这个错误是怎么回事

上工程吧,

啊?什么意思?

appdelegate.cpp

 // create a scene. it's an autorelease object
    auto scene = BearMainScene::createScene();

    // run
    director->runWithScene(scene);

    return true;

.cpp文件


 #include "BearMainScene.h"
 #include "cocostudio/CocoStudio.h"
 #include "ui/CocosGUI.h"
  
  USING_NS_CC;
   
  float BearMainScene::difftime = 1.5;
  int BearMainScene::totalScore = 0;
  float BearMainScene::beginclock = 0.0;
   
  Scene* BearMainScene::createScene()
  {
      auto scene = Scene::create();
      auto layer = BearMainScene::create();
      scene->addChild(layer);
      return scene;
  }
   
  bool BearMainScene::init()
  {
      if ( !Layer::init() )
      {
          return false;
      }
   
      auto manilayer = CSLoader::createNode("MainScene.csb");                调用csb
      this->addChild(manilayer);
   
      char index;
      for (int i = 1; i < 10; i++)
      {
          std::string nodename = "ProjectNode_";
          memset(index, 0, sizeof(char) * 4);
          sprintf(index, "%d", i);
          nodename = nodename.append(index);
          auto sp_w = manilayer->getChildByName(nodename);
          bearNodeArray.pushBack(sp_w);
      }
   
      scoreText = (Text*)manilayer->getChildByName("Text_Score");
      setScore();
          
      sp_kiss = Sprite::create("m.png");
      sp_kiss->setVisible(false);
      sp_kiss->setAnchorPoint(Vec2(0.5, 0.5));
      this->addChild(sp_kiss);
   
      GetshowBear();
   
           //拉姆达表达式做碰撞监听
      auto bearListener = EventListenerTouchOneByOne::create();
      bearListener->onTouchBegan = &](Touch *touch, Event* event)
      {
          auto bearrect = Rect(0, 0, alivebear->getContentSize().width, alivebear->getContentSize().height);
          auto startpos = alivebear->convertToNodeSpace(touch->getLocation());
   
          if (bearrect.containsPoint(startpos) && alivebear->isVisible())
          {
              sp_kiss->setVisible(false);
              sp_kiss->setPosition(touch->getLocation());
              sp_kiss->setVisible(true);
              totalScore += 100;
                          //如果显示时间间隔大于0.1秒,那么分数每增长1000分,时间差减去0.1,这样子,就会随着分数的提高难度增加
              if (difftime != 0.1)
              {
                  if (totalScore % 1000 == 0)
                  {
                      difftime -= 0.1;
                  }
              }
               
              setScore();
          }
   
          return true;
      };
   
      bearListener->onTouchMoved = ](Touch *touch, Event* event){
      };
   
      bearListener->onTouchEnded = &](Touch *touch, Event* event){
   
      };
   
      _eventDispatcher->addEventListenerWithSceneGraphPriority(bearListener, alivebear);
       
      this->scheduleUpdate();
   
      return true;
  }
   
  int BearMainScene::GetRandNum()
  {
      int num = 0;
      while (1)
      {
          num = rand_0_1() * 10;
          if (num >= 0 && num < 9)
          {
              break;
         }
     }
     return num;
 }
  
 void BearMainScene::GetshowBear()
 {
     int idx = GetRandNum();
     while (idx == preBearNum)
     {
         idx = GetRandNum();
     }
     preBearNum = idx;
     std::string spritename = "Sp_bear";
     auto bearNode = bearNodeArray.at(idx);
     alivebear = bearNode->getChildByName(spritename);
     if (sp_kiss->isVisible())
     {
         sp_kiss->setVisible(false);
     }
     alivebear->setVisible(true);
 }
  
 void BearMainScene::update(float delta)
 {
     beginclock += delta;
     if (beginclock >= difftime)
     {
         beginclock = 0;
         alivebear->setVisible(false);
         GetshowBear();
     }
 }
  
  
 void BearMainScene::setScore()
 {
     char scorestr;
     memset(scorestr, 0, sizeof(scorestr));
     sprintf(scorestr, "%d", totalScore);
     scoreText->setString(scorestr);
 }

.h文件


/************************************************************************/
 /* 头文件:BearMainScene.h*/
 /************************************************************************/
  
 #ifndef __HELLOWORLD_SCENE_H__
 #define __HELLOWORLD_SCENE_H__
  
 #include "cocos2d.h"
 #include "ui/CocosGUI.h"
 USING_NS_CC;
 using namespace cocos2d::ui;
  
 class BearMainScene : public cocos2d::Layer

 {
 public:
     static cocos2d::Scene* createScene();
  
     virtual bool init();
      
    
     CREATE_FUNC(BearMainScene);
  
 public:
     int GetRandNum();
  
     void update(float delta); //帧循环
     void GetshowBear(); //获取要显示的小熊并且显示小熊
     void setScore(); //设置分数
     Vector<Node*> bearNodeArray; //存储所有的小熊列表
     Node *alivebear;    //当前显示的小熊
     Sprite *sp_kiss;  //嘴唇精灵
     Text *scoreText;  //分数控件
  
     static float beginclock;   //显示计时
     int preBearNum;    //上次显示的小熊编号
     static float difftime;     //显示时间差
     static int totalScore;   //总分数
 };
  
 #endif // __HELLOWORLD_SCENE_H__

Resource文件夹内容截图 :

整个工程就这样了。。。

你的断点在14行,断点触发时14行还没有执行,layer对象根本没有被赋值,当然是无法读取的内存了……
把断点放到15行,触发时再看layer的成员吧

谢谢啊,找了那么长时间,先是找到个空指针,然后发现原来是getChildByName里的精灵名字大小写问题,该回来后,就好了。还有个问题,vs上显示的界面不全,横是640,但是竖着只有700多(我分辨率是640*960的),手机上运行正常,这是怎么回事?

好吧,有弱智了,原因是我电脑的分辨率高是768,所以显示不全,在glView下加个缩放就好了。。。