将精灵添加到节点
问题描述:
我有一个SpritePlayer
类,它包含我的精灵。将精灵添加到节点
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()
函数。
答
你要它推出的抽象,你不需要有一个水平的方式。角色本身可以是一个精灵,你拥有它的方式你的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图层之间不会有另一个可能具有不同锚点的节点。
答
Sprite是Node的一个子类,所以使用addChild没有问题。 此行是可疑的:
playerSpritesList[i] = &SpritePlayer();
我会从你的代码中删除SpritePlayer()构造函数,因为CREATE_FUNC(SpritePlayer)创建默认之一,它管理内存。然后你可以调用playerSpritesList [i] = SpritePlayer :: create();
你也可以写USING_NS_CC;在SpritePlayer中(小心点结构 - 你必须编写cocos2d :: Point,因为iOS/Mac上的命名空间冲突)。
也为会议功能的名称应该以小写开始:)
在我发布答案之前我想问你为什么不直接从sprite继承?这将允许您使用已经构建到sprite中的继承的初始化功能。您似乎正在添加一个抽象层,目前对我而言,这看起来没有任何用处。你对这个东西有什么打算? –
我正在看另一个课程,我已经写了这个。你在暗示,SpritePlayer类应该从sprite继承吗? 无论如何,我仍然需要以某种方式将Sprite转换为Node,以将其添加到场景中。 – Sagittario
Sprite是一个节点,你不需要转换任何东西。我会在下面发布你的问题的答案。 –