2015-12-10 2 views
2

Я ищу помощь в создании спрайта в другом классе и файле cocos2d-x. Я использовал код с сайта cocos2d-x для подкласса спрайта и других сообщений, и это не сработало бы для меня. Я следил за учебником по системам сонара для создания отдельного класса для «птичьего» спрайта («Player» в моем случае), и у меня возникают проблемы с ошибкой при попытке передать уровень helloworld через конструктор класса Player, который принимает параметр слой. ошибка говорит: «Player :: Player (const Player &)»: невозможно преобразовать аргумент 1 из «HelloWorld * const» в «const Player &» ApocalypseWorld c: \ cocosprojects \ apocalypseworld \ classes \ helloworldscene.cpp 39 "Создание спрайта в другом файле (в классе)

вот код: Player.h:

#pragma once 
#include "cocos2d.h" 

class Player 
{ 
public: 
Player(cocos2d::Layer* layer); 

private: 
cocos2d::Sprite *player1; 
}; 

Player.cpp:

#include "Player.h" 
#include "cocostudio/CocoStudio.h" 
#include "ui/CocosGUI.h" 

USING_NS_CC; 

Player::Player(cocos2d::Layer* layer) 
{ 

    player1 = Sprite::create("PlayerHead.png"); 
    player1->setPosition(Point(200, 200)); 

    layer->addChild(player1, 100); 
} 

HelloWorldScene.h:

#ifndef __HELLOWORLD_SCENE_H__ 
#define __HELLOWORLD_SCENE_H__ 

#include "cocos2d.h" 
#include "Player.h" 

class HelloWorld : public cocos2d::Layer 
{ 
public: 
    // there's no 'id' in cpp, so we recommend returning the class instance pointer 
    static cocos2d::Scene* createScene(); 

    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone 
    virtual bool init(); 

    Player* player; 

    // implement the "static create()" method manually 
    CREATE_FUNC(HelloWorld); 
}; 

#endif // __HELLOWORLD_SCENE_H__ 

HelloWorldScene.cpp:

#include "HelloWorldScene.h" 
#include "Player.h" 
#include "cocostudio/CocoStudio.h" 
#include "ui/CocosGUI.h" 

USING_NS_CC; 

using namespace cocostudio::timeline; 

Scene* HelloWorld::createScene() 
{ 
    // 'scene' is an autorelease object 
    auto scene = Scene::create(); 

    // 'layer' is an autorelease object 
    auto layer = HelloWorld::create(); 

    // add layer as a child to scene 
    scene->addChild(layer); 

    // return the scene 
    return scene; 
} 

// on "init" you need to initialize your instance 
bool HelloWorld::init() 
{ 
    ////////////////////////////// 
    // 1. super init first 
    if (!Layer::init()) 
    { 
     return false; 
    } 

    auto rootNode = CSLoader::createNode("MainScene.csb"); 

    addChild(rootNode); 

player = new Player(this); 


return true; 

}

я получаю немного красный Squigly линия под т в:

player = new Player(this); 

в конце HelloWorldScene.cpp файла

+0

Что и почему вы хотите достичь путем подкласса класса Sprite? – Jain

+0

Поэтому я могу разделить разные спрайты на разные файлы, и поэтому я могу дать им свои собственные функции. @Jain – ElSnowman

+0

Итак, какая у вас проблема? Не могли бы вы поделиться некоторым кодом? – Jain

ответ

0

Отредактированный код:

Player.h:

#ifndef __Sample__Player__ 
#define __Sample__Player__ 

#include "cocos2d.h" 

USING_NS_CC; 

class Player : public Node 
{ 
public: 
    static Player* createPlayer(Layer* layer); 

    Sprite* head; 
}; 

#endif 

Player.cpp:

#include "Player.h" 

Player* Player::createPlayer(Layer* layer) { 
    auto ret = new (std::nothrow) Player; 
    if(ret && ret->init()) { 
     ret->autorelease(); 
     ret->head = Sprite::create("PlayerHead.png"); 
     ret->addChild(ret->head); 
     layer->addChild(ret, 100); 
     return ret; 
    } 
    CC_SAFE_RELEASE(ret); 
    return nullptr; 
} 

Затем в scene.h:

#include "Player.h" 

И в вашем scene.cpp:

auto player = Player::createPlayer(this); 
addChild(player); 
+0

Я изменил свой код на это, и я получаю красную squigly строку под «этим» в «this-> addChild (head);» и "layer-> addChild (это, 100);" говоря, что «это» может использоваться только внутри нестатической функции-члена ... » – ElSnowman

+0

ах, мой плохой. Вместо этого следует использовать ret-> addChild (head). – Makalele

+0

теперь имеют красную squiggly линию под «головой» в «head = Sprite :: create (« PlayerHead.png »); и "this-> addChild (head);" ,он говорит: «ссылка на нестатический член должна быть относительно конкретного объекта» – ElSnowman

Смежные вопросы