Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将精灵添加到节点_C++_Cocos2d X - Fatal编程技术网

C++ 将精灵添加到节点

C++ 将精灵添加到节点,c++,cocos2d-x,C++,Cocos2d X,我有一个SpritePlayer类,它保存着我的精灵 SpritePlayer.h: class SpritePlayer : public cocos2d::Node { public: SpritePlayer(); CREATE_FUNC(SpritePlayer); void InitSpritePlayer(std::string pathToSptire); cocos2d::Sprite *GetSprite(); (...) private:

我有一个
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;
}
(...)
mainsecene.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())
}
for(int i=0;i<4;i++)
{
playerPriteList[i]=&SpritePlayer();
playerSpritesList[i]->InitSpritePlayer(“ch2.png”);
这->addChild(playerPriteList[i]->GetSprite(),0);
//SpritePlayersNode->addChild(playerSpritesList[i]->GetSprite())
}
现在的问题是-如何将此精灵添加到节点?

这两条底线都会导致错误,因为我必须将
节点
传递到
addChild()
函数中。

Sprite是节点的子类,因此使用addChild没有问题。 这条线可疑:

playerSpritesList[i] = &SpritePlayer();
我将从代码中删除SpritePlayer()构造函数,因为CREATE_FUNC(SpritePlayer)创建了管理内存的默认构造函数。然后可以调用playerPriteList[i]=SpritePlayer::create()

您还可以使用_NS_CC;在SpriteLayer中(注意点结构-由于iOS/Mac上的命名空间冲突,您必须编写cocos2d::Point)


此外,对于约定函数名,应以小写字母开头:)

这样做的方式是引入一个不需要的抽象级别。角色本身可以是一个精灵,你的精灵角色实际上不是精灵,它是一个角色精灵的管理器。我通常使用以下模式

字符.h

class Character : public cocos2d::Sprite
{
 public:
  Character* createCharacterSprite(Vec2 position, std::string fileName);
 private:
  Character();
}
字符.cpp

Character* Character::createCharacterSprite(Vec2 position, std::string fileName)
{
  auto character = new Character();
  if(character && character->initWithFile(fileName))
  {
    character->autorelease();
    return character;
  }
}
for (int i = 0; i < 4; i++)
{
  auto character = Character::createCharacterSprite(characterPosition, "filename.png");
  this->addChild(character);
}
mainsecene.cpp

Character* Character::createCharacterSprite(Vec2 position, std::string fileName)
{
  auto character = new Character();
  if(character && character->initWithFile(fileName))
  {
    character->autorelease();
    return character;
  }
}
for (int i = 0; i < 4; i++)
{
  auto character = Character::createCharacterSprite(characterPosition, "filename.png");
  this->addChild(character);
}
for(int i=0;i<4;i++)
{
自动字符=字符::createCharacterSprite(characterPosition,“filename.png”);
此->添加子对象(字符);
}

通过这种方式,您可以使用“This”而不是指向实际角色精灵的指针从CharacterSprite中进行操作。定位和动画也将变得容易得多,因为在角色和主场景层之间不会有另一个节点具有可能不同的定位点。

在我发布答案之前,我想问一下为什么您没有直接从sprite继承?这将允许您使用sprite中已内置的继承初始化功能。你似乎在添加一个抽象层,目前在我看来,它似乎毫无用处。你对这个对象的意图是什么?我正在看另一个类,我在写这个时已经有了这个类。您是否建议SpriteLayer类继承自sprite?无论如何,我仍然需要将精灵转换为节点,以将其添加到场景中。精灵是一个节点,您不需要转换任何内容。我会在下面贴出你问题的答案。