将精灵添加到节点
Adding sprite to a node
我有一个 SpritePlayer
class,里面装着我的精灵。
SpritePlayer.h:
class SpritePlayer : public cocos2d::Node
{
public:
SpritePlayer();
CREATE_FUNC(SpritePlayer);
void InitSpritePlayer(std::string pathToSptire);
cocos2d::Sprite *GetSprite();
(...)
private:
cocos2d::Sprite *_sprite;
}
SpritePlayer.cpp:
void SpritePlayer::InitSpritePlayer(std::string pathToSprite)
{
_sprite = cocos2d::Sprite::create(pathToSprite);
}
cocos2d::Sprite *SpritePlayer::GetSprite()
{
return _sprite;
}
(...)
在 MainScene.cpp
我有:
for (int i = 0; i < 4; i++)
{
playerSpritesList[i] = &SpritePlayer();
playerSpritesList[i]->InitSpritePlayer("ch2.png");
this->addChild(playerSpritesList[i]->GetSprite(), 0);
//SpritePlayersNode->addChild(playerSpritesList[i]->GetSprite())
}
现在的问题是 - 如何将此精灵添加到节点?
两条底线都会导致错误,因为我必须将 Node
传递给 addChild()
函数。
Sprite 是 Node 的子类,所以使用 addChild 没有问题。
此行可疑:
playerSpritesList[i] = &SpritePlayer();
我会从您的代码中删除 SpritePlayer() 构造函数,因为 CREATE_FUNC(SpritePlayer) 创建默认的构造函数来管理内存。然后你可以调用 playerSpritesList[i] = SpritePlayer::create();
也可以这样写USING_NS_CC;在 SpritePlayer 中(注意点结构 - 你必须写 cocos2d::Point,因为 iOS/Mac 上的命名空间冲突)。
另外,为了约定函数名称应以小写字母开头:)
您的方法是引入您不需要的抽象级别。角色本身可以是一个精灵,你拥有它的方式你的 SpriteCharacter 实际上不是一个精灵,它是一个角色精灵的经理。我通常使用以下模式。
Character.h
class Character : public cocos2d::Sprite
{
public:
Character* createCharacterSprite(Vec2 position, std::string fileName);
private:
Character();
}
Character.cpp
Character* Character::createCharacterSprite(Vec2 position, std::string fileName)
{
auto character = new Character();
if(character && character->initWithFile(fileName))
{
character->autorelease();
return character;
}
}
MainScene.cpp
for (int i = 0; i < 4; i++)
{
auto character = Character::createCharacterSprite(characterPosition, "filename.png");
this->addChild(character);
}
这样您就可以在 CharacterSprite 中使用 'this' 而不是指向实际角色精灵的指针进行操作。定位和动画也将变得容易得多,因为您的角色和 MainScene 层之间不会有另一个节点可能具有不同的锚点。
我有一个 SpritePlayer
class,里面装着我的精灵。
SpritePlayer.h:
class SpritePlayer : public cocos2d::Node
{
public:
SpritePlayer();
CREATE_FUNC(SpritePlayer);
void InitSpritePlayer(std::string pathToSptire);
cocos2d::Sprite *GetSprite();
(...)
private:
cocos2d::Sprite *_sprite;
}
SpritePlayer.cpp:
void SpritePlayer::InitSpritePlayer(std::string pathToSprite)
{
_sprite = cocos2d::Sprite::create(pathToSprite);
}
cocos2d::Sprite *SpritePlayer::GetSprite()
{
return _sprite;
}
(...)
在 MainScene.cpp
我有:
for (int i = 0; i < 4; i++)
{
playerSpritesList[i] = &SpritePlayer();
playerSpritesList[i]->InitSpritePlayer("ch2.png");
this->addChild(playerSpritesList[i]->GetSprite(), 0);
//SpritePlayersNode->addChild(playerSpritesList[i]->GetSprite())
}
现在的问题是 - 如何将此精灵添加到节点?
两条底线都会导致错误,因为我必须将 Node
传递给 addChild()
函数。
Sprite 是 Node 的子类,所以使用 addChild 没有问题。 此行可疑:
playerSpritesList[i] = &SpritePlayer();
我会从您的代码中删除 SpritePlayer() 构造函数,因为 CREATE_FUNC(SpritePlayer) 创建默认的构造函数来管理内存。然后你可以调用 playerSpritesList[i] = SpritePlayer::create();
也可以这样写USING_NS_CC;在 SpritePlayer 中(注意点结构 - 你必须写 cocos2d::Point,因为 iOS/Mac 上的命名空间冲突)。
另外,为了约定函数名称应以小写字母开头:)
您的方法是引入您不需要的抽象级别。角色本身可以是一个精灵,你拥有它的方式你的 SpriteCharacter 实际上不是一个精灵,它是一个角色精灵的经理。我通常使用以下模式。
Character.h
class Character : public cocos2d::Sprite
{
public:
Character* createCharacterSprite(Vec2 position, std::string fileName);
private:
Character();
}
Character.cpp
Character* Character::createCharacterSprite(Vec2 position, std::string fileName)
{
auto character = new Character();
if(character && character->initWithFile(fileName))
{
character->autorelease();
return character;
}
}
MainScene.cpp
for (int i = 0; i < 4; i++)
{
auto character = Character::createCharacterSprite(characterPosition, "filename.png");
this->addChild(character);
}
这样您就可以在 CharacterSprite 中使用 'this' 而不是指向实际角色精灵的指针进行操作。定位和动画也将变得容易得多,因为您的角色和 MainScene 层之间不会有另一个节点可能具有不同的锚点。