如图片所示,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下加个缩放就好了。。。