Question

Je fais un jeu de blackjack dans cocos2d-x Voici le code suivant de la même chose où je m'écrase mais je ne peux pas dire pourquoi cela se passe ce qui ne va pas mal?J'ai essayé plusieurs choses qui pensent que la crash pourrait être à cause de la fuite de mémoire de chaîne ou de quelque chose

ccsprite * _big= ccsprite :: créatewithspritriteframename (PTR);

Voici le fichier CPP de la carte qui hérite CCSPRITE

carte.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");
}

L'intialisation des cartes est selon cette

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;
            }
          }

L'accident que je reçois est sur la ligne d'initwithspriteframename, mais cela ne se produit pas fréquemment

Était-ce utile?

La solution

h Fichier:

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();
};

fichier 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); 
}

et pour votre pont, de ma compréhension,

CCArray::createWithCapacity(52);

sera un meilleur choix.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top