Player.h文件:
class Player:public CCNode{
public:
Player();
~Player();
CREATE_FUNC(Player);
virtual bool init();
void setOthersRole(int rolenum);
void initOthers(float x, float y,int userseat, int playerseat,std::string playername, std::string gender);
private:
CCSprite* role;
CCSprite* bar;
};
```
Player.cpp
#include "Player.h"
#include "Constants.h"
#define UNI_PLAYER_HEIGHT 80
Player::Player(){
}
Player::~Player(){
}
bool Player::init(){
bool bRet = false;
do {
bRet = true;
} while (0);
return bRet;
}
void Player::initOthers(float x, float y, int userseat, int playerseat, std::string playername, std::string gender){
bar = CCSprite::createWithSpriteFrameName("bar.png");
bar->retain();
bar->setPosition(ccp(x, y-UNI_PLAYER_HEIGHT));
role=CCSprite::create();
role->setPosition(ccp(bar->getPositionX()+40, bar->getPositionY()));
addChild(role);
addChild(bar);
}
void Player::setOthersRole(int rolenum){
switch(rolenum){
case 1:
role->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("police.png"));
break;
case 2:
role->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("killer.png"));
break;
default:
role->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("people.png"));
break;
}
}
```
然后在GameScene.cpp文件里,先初始化一组Player:
others = CCArray::create();
CC_SAFE_RETAIN(others);
for(int i=0;i<14;i++){
Player* p = Player::create();
addChild(p);
others->addObject(p);
}
```
然后在update里根据socket传来的json设置每个player(省略了json的处理):
void GameScene::waitforother(){
std::string s = CCUserDefault::sharedUserDefault()->getStringForKey("seatid");
seatid = s.c_str();
for (int i=0; iobjectAtIndex(atoi(id.c_str())-1);
CCSprite* seat=(CCSprite*) seatsarray->objectAtIndex(atoi(id.c_str())-1);
p->initOthers(seat->getPositionX()+(seat->getContentSize()).width/2, seat->getPositionY()+(seat->getContentSize()).height/2, atoi(seatid), atoi(id.c_str()), name.c_str()==NULL?"":name.c_str(), sex.c_str()==NULL?"":sex.c_str());
}
}
```
之后再在update里根据不同的条件,调用player的setOthersRole:
for (int i=0; iobjectAtIndex(atoi(id.c_str())-1);
p->setOthersRole(playerrole);
}
```
但这时就会在Player的setOthersRole方法里报:EXC_BAD_ACCESS错误(见附图)
本来在initOthers方法里已经create过role了,不知道为什么会成了Null。另外player其他成员变量,如bar,如果是放置player的init方法里create的话,在后面的initOthers里也会是null,报exc_bad_access的问题。感觉好像从others这个ccarray里取出的Player对象,成员变量在其他方法里调用总会成为null。请帮忙看看,本人没有c++基础,不知道是不是哪里的成员变量管理不合适。
之前也断断续续的描述过一些该问题:
http://www.cocoachina.com/bbs/read.php?tid=196167
不知道是不是同一个原因。