由于不一致,无法跟踪崩溃
Not able to trace the crash because of inconsistency
我正在 cocos2d-x 中制作一个二十一点游戏,这是以下代码,我崩溃了,但无法理解为什么会发生这种情况,出了什么问题?我尝试了几件事,认为崩溃可能是因为字符串内存泄漏或其他原因
CCSprite* _big = CCSprite::createWithSpriteFrameName(ptr);
这是继承CCSprite的卡cpp文件
卡.cpp
#include "Card.h"
Card::Card() {
}
Card::~Card() {
}
void Card::init(int value, int suit) {
mValue = value;
mSuit = suit;
mGameValue = 0;
UnHide();
}
void Card::UnHide() {
mHidden = false;
//if(this)
//this->removeAllChildrenWithCleanup(true);
//this->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("card"));
this->initWithSpriteFrameName("card");
char strName[64]={0};
//memset ( strName, 0, sizeof ( strName ));
switch(mSuit){
case 0: sprintf(strName,"%s","club_big");break;
case 1: sprintf(strName,"%s","diamond_big");break;
case 2: sprintf(strName,"%s","spade_big");break;
case 3: sprintf(strName,"%s","heart_big");break;
default :
break;
}
const char *ptr = strdup(strName);
CCSprite* _big = CCSprite::createWithSpriteFrameName(ptr);
delete ptr;
// CCSprite* big = CCSprite::create(strName);
_big->setPosition(ccp(55, 44));
this->addChild(_big);
switch(mSuit){
case 0: sprintf(strName,"%s","club");break;
case 1: sprintf(strName,"%s","diamond");break;
case 2: sprintf(strName,"%s","spade");break;
case 3: sprintf(strName,"%s","heart");break;
default :
break;
}
const char *_ptr = strdup(strName);
CCSprite* _small = CCSprite::createWithSpriteFrameName(_ptr);
delete _ptr;
// CCSprite* small = CCSprite::create(str);
_small->setPosition(ccp(16, 82));
this->addChild(_small);
if(mSuit==0 || mSuit==2){
switch(mValue){
case 1: sprintf(strName,"%s","blacka");mGameValue = 1;break;
case 2: sprintf(strName,"%s","black2");mGameValue = mValue;break;
case 3: sprintf(strName,"%s","black3");mGameValue = mValue;break;
case 4: sprintf(strName,"%s","black4");mGameValue = mValue;break;
case 5: sprintf(strName,"%s","black5");mGameValue = mValue;break;
case 6: sprintf(strName,"%s","black6");mGameValue = mValue;break;
case 7: sprintf(strName,"%s","black7");mGameValue = mValue;break;
case 8: sprintf(strName,"%s","black8");mGameValue = mValue;break;
case 9: sprintf(strName,"%s","black9");mGameValue = mValue;break;
case 10: sprintf(strName,"%s","black10");mGameValue = mValue;break;
case 11: sprintf(strName,"%s","blackj");mGameValue = 10;break;
case 12: sprintf(strName,"%s","blackq");mGameValue = 10;break;
case 13: sprintf(strName,"%s","blackk");mGameValue = 10;break;
default :
break;
}
}
else {
switch(mValue){
case 1: sprintf(strName,"%s","reda");mGameValue = 1;break;
case 2: sprintf(strName,"%s","red2");mGameValue = mValue;break;
case 3: sprintf(strName,"%s","red3");mGameValue = mValue;break;
case 4: sprintf(strName,"%s","red4");mGameValue = mValue;break;
case 5: sprintf(strName,"%s","red5");mGameValue = mValue;break;
case 6: sprintf(strName,"%s","red6");mGameValue = mValue;break;
case 7: sprintf(strName,"%s","red7");mGameValue = mValue;break;
case 8: sprintf(strName,"%s","red8");mGameValue = mValue;break;
case 9: sprintf(strName,"%s","red9");mGameValue = mValue;break;
case 10: sprintf(strName,"%s","red10");mGameValue = mValue;break;
case 11: sprintf(strName,"%s","redj");mGameValue = 10;break;
case 12: sprintf(strName,"%s","redq");mGameValue = 10;break;
case 13: sprintf(strName,"%s","redk");mGameValue = 10;break;
default :
break;
}
}
const char *_ptrr = strdup(strName);
CCSprite* _num = CCSprite::createWithSpriteFrameName(_ptrr);
delete _ptrr;
// CCSprite* _num = CCSprite::create(strName);
_num->setPosition(ccp(18, 108));
this->addChild(_num);
}
void Card::Hide() {
mHidden = true;
this->removeAllChildrenWithCleanup(true);
this->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("deck"));
//this->initWithSpriteFrameName("deck");
}
卡的初始化是按照这个
for (int suit = 0; suit < 4; suit++) {
for (int value = 0; value < 13; value++) {
Card* card = new Card;
//card->init
card->init(value+1, suit);
mCard[suit*13 + value] = card;
}
}
我得到的崩溃是在initWithSpriteFrameName的行上,但它并不经常发生
h 文件:
class Card : public cocos2d::Node
{
public:
int mValue;
int mSuit;
bool mHidden;
int mGameValue;
CCSprite* front;
CCSprite* back;
static Card* create();
bool init(int value, int suit);
void UnHide();
void Hide();
};
CPP 文件
Card* Card::create(int value, int suit){
Card* card = new Card();
if(card && card->init(value, suit)){
card->autorelease();
return card;
}
else{
CC_SAFE_DELETE(card);
return NULL;
}
}
bool Card::init(int value, int suit) {
if(CCNode::init()){
mValue = value;
mSuit = suit;
mGameValue = 0;
//create your front and back sprite here as what you did in Unhide
CCSprite* back = blablabla;
CCSprite* front = blablabla;
//add them as a child of current node
this->addChild(back);
this->addChild(front);
this->UnHide();
return true;
}
return false;
}
void Card::UnHide() {
back->setVisible(false);
front->setVisible(true);
}
void Card::Hide() {
back->setVisible(true);
front->setVisible(false);
}
对于你的甲板,据我所知,
CCArray::createWithCapacity(52);
将是一个更好的选择。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 光线跟踪器灯光反射错误
- 人脸跟踪arduino代码的优化
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- Qt 5.9中的QML崩溃-帮助读取堆栈跟踪
- 如何获取崩溃的DLL的堆栈跟踪?
- 由于不一致,无法跟踪崩溃
- WinDbg堆栈跟踪显示了malloc的崩溃点
- 在c++中绘制填充立方体,崩溃,没有有用的错误可以跟踪
- 崩溃后如何处理"impossible"堆栈跟踪?
- 在没有安装Visual Studio的情况下获得Windows崩溃的堆栈跟踪?(c++)
- 来自回溯的堆栈跟踪未显示导致多线程环境下崩溃的方法
- 如何保护或跟踪指针容易崩溃