2012-08-28 2 views
1

나는 세 가지 클래스 Tree, FruitBasket을 가지고 있습니다. 각자 (각 클래스에는 자체 이 있음)을 통해 액세스하는 자체 CCSprite 회원이 있습니다. 또한 각 클래스에는 CCSprite의 텍스처, 위치 및 기타 CCSprite 관련 항목을 설정하는 draw() 메서드가 있습니다. 이 클래스의 인스턴스를 만들 때, 메인 레이어에 항상이 각각의 스프라이트가 addChild() 필요합니다. 실제로 아무 문제가 없지만 각 draw() 메서드는 기본 레이어에 addChild() 메서드를 처리하는 메서드가 될 것이기를 바랍니다.클래스에서 메인 씬/레이어에 액세스

내 코드는 다음과 같다 :

// Tree.cpp 
#include "Tree.h" 
#include "cocos2d.h" 

using namespace cocos2d; 

Tree::Tree() { 
    draw(); 
} 

CCSprite * Tree:getSprite() { 
    return m_TreeSprite; 
} 
void Tree::draw() { 
    m_TreeSprite = CCSprite::create("tree.png"); 
    m_TreeSprite -> setPosition (100, 100); 
} 

/* 
* The other classes have similar structure. Will take a long long post if I write them all. 
*/ 

// MainLayer.cpp 
void MainLayer::drawScreenObjects() { 
    m_Tree = Tree(); 
    this -> addChild(m_Tree.getSprite()); 

    m_Basket = Basket(); 
    this -> addChild(m_Basket.getSprite()); 
} 

draw() 방법이 유사한 볼 수 있도록 내가 원하는 : 내가 생각하고

void Tree::draw() { 
    m_TreeSprite = CCSprite::create("tree.png"); 
    m_TreeSprite -> setPosition(100, 100); 
    MainLayer -> addChild(m_TreeSprite); 
} 

솔루션의

  1. 입니다 MainLayer에 대한 참조를 모든 클래스에 전달하고 멤버 변수에 해당 참조를 보관합니다.
  2. 모든 클래스를 CCNode에서 상속 받아 자신의 자식을 가질 수 있도록합니다.

다른 가능한 솔루션은 무엇입니까? 나는 현재 설치가 더럽고 불안정하다고 느낍니다. 미리 감사드립니다.

+0

아마 트리 : : drawOnParent (CCNode * 부모) {부모 -> addChild (m_TreeSprite) ;}? –

+0

@ m.ding 작동 할 수도 있지만'Tree'의 생성자에서 클래스 자체에서'draw()'를 호출하려고합니다. 이를 사용하여 클래스에 'MainLayer'에 대한 참조를 전달해야합니다. MainLayer에'CCSprite'를 추가하는 것을 포함하여 인스턴스를 만들 때이 클래스들이 스스로 설정하는 모든 것을하기를 원합니다. – alxcyl

+0

조금 길어서 대답으로 게시합니다. –

답변

1

나는 정말로 C++을 모르지만 아마도 MainLayer를 매개 변수로 사용하여 생성자를 만들고 매개 변수로 addChild를 호출 해보십시오. 참조를 보유하기 위해 구성원 변수가 필요하지 않을 경우 removeFromParentAndCleanup을 대신 호출 할 수 있습니다.

또한 현재 MainLayer에 대한 참조를 보유하는 싱글 톤 객체를 만들 수 있습니다. 그러면 어디에서든지 싱글 톤을 호출 할 수 있지만 더 비싸다고 들립니다. 나는 당신의 # 1 해결책과 함께 갈 것입니다.

0

방법에 대해 :

MainLayer.h 초기화에

public: 
static MainLayer* me = 0; 

MainLayer.cpp() 드로우에서 다음

MainLayer::me = this; 

()

if(MainLayer::me){ 
    MainLayer::me->addChild(); 
} 
+0

그것은 정적 변수이므로 내 애플 리케이션 주위에 MainLayer에 대한 참조를 전달할 필요가 없다는 것을 의미합니까? 또한, 이것은 자바의 정적 물건에 대한 내 경험에서 오는 것이지만'draw()'도'정적 '으로 선언 할 필요가 없습니까? – alxcyl

+0

아니요, 분명히 기억할 수는 없지만 비슷한 코드를 사용했습니다. 당신은 무승부() 방법은 정적 일 필요가 없습니다. –

+0

알겠습니다. 고마워요. 그것을 시도 할 때 여기에 다시 올거야. – alxcyl

관련 문제