2013-06-30 1 views
1

나는 안드로이드에 대한 Ray Wenderlich's Space Game 튜토리얼을 통해 가고있었습니다. 위대한 튜토리얼. 저는 중급 C++ 프로그래머이며 여기에서 무슨 일이 일어나고 있는지 이해하려고합니다. 그냥 이해하고 다시 작성했습니다. 매크로 제거.RayWenderlich의 CCParallaxNodeExtras.h에 대한 설명

class CCPointObject: CCObject 
{ 
protected: 
     CCPoint m_tRatio; 
     CCPoint m_tOffset; 
     CCNode *m_pChild; 
public: 

virtual CCPoint getRatio() const 
{ 
    CCLog("getRatio_CALLED"); 
    return m_tRatio; 
} 

virtual void setRatio(CCPoint newRatio) 
{ 
    CCLog("setRatio_CALLED"); 
    m_tRatio = newRatio; 
} 
    . 
    .. 
    ... 
    // similarly getChild/setChild/getOffset/setOffset is defined. The code works perfectly fine. 
}; 

void CCParallaxNodeExtras::incrementOffset(CCPoint offset,CCNode* node) 
{ 
    for(unsigned int i = 0; i < m_pParallaxArray->num; i++) 
    { 
     CCPointObject *point = (CCPointObject *)m_pParallaxArray->arr[i]; 
     CCNode * curNode = point->getChild(); 
     if(curNode->isEqual(node)) 
     { 
      point->setOffset(ccpAdd(point->getOffset(), offset)); 
      break; 
     } 
    } 
} 

올시다 :

  • 포인트 m_tOffset, m_tRatio 및 m_pChild가 해당 개체의 오프셋 및 비율의 실제 값으로 초기화하는 방법, (CCPointObject *를 위해 CCObject의 * ​​캐스팅에 의해) 초기화 될 때?
  • 나는 CCPointObject의 setOffset/getOffset 함수에서 CCLogs를 주었지만 결코 호출되지 않았으므로 어떤 setOffset/getOffset이 호출 되었습니까? CCOointject는 CCObject에서 상속 받았기 때문에 CCObject의 setOffset/getOffset이 호출되고 있을지도 모르겠지만, 내가 확인한 것처럼 CCObject에 선언 된 setOffset/getOffset은 없습니다.
  • 제가

    , ccParallaxNode.h에보고 및 거기 // 어린이의 오프셋/비 보유 어레이

    CC_SYNTHESIZE (구조체 _ccArray *를 m_pParallaxArray, ParallaxArray)

    및 _ccArray에는 CCObjects의 배열을 의미하는 CCObject **가 있고 CCObject에는 m_tOffset/m_tRatio 또는 m_pChild와 같은 변수가 없으므로 실제로 오프셋/비율이 저장되는 위치는 무엇입니까?

이러한 의문이 나를 미치게합니다. 도와주세요 !!

답변

0

1) 타입 캐스팅은 =의 오른쪽에있는 객체가 =의 왼쪽에있는 객체의 유형이라는 것을 컴파일러에 알리는 것입니다. 그래서 여기서 초기화가 일어나지 않습니다. 우리는 새로운 객체를 생성하지 않고 단지 타입 캐스팅을 사용하여 객체가 해당 클래스에 속한다고 가정합니다. 다음

2)는 있지만, 로그를 넣어 않았다 어디

class CCPointObject : CCObject 
{ 
    CC_SYNTHESIZE(CCPoint, m_tRatio, Ratio) 
    CC_SYNTHESIZE(CCPoint, m_tOffset, Offset) 
    CC_SYNTHESIZE(CCNode *,m_pChild, Child) // weak ref 

    static CCPointObject * pointWithCCPoint(CCPoint ratio, CCPoint offset) 
    { 
     CCPointObject *pRet = new CCPointObject(); 
     pRet->initWithCCPoint(ratio, offset); 
     pRet->autorelease(); 
     return pRet; 
    } 
    bool initWithCCPoint(CCPoint ratio, CCPoint offset) 
    { 
     m_tRatio = ratio; 
     m_tOffset = offset; 
     m_pChild = NULL; 
     return true; 
    } 
}; 

그나마 정확히 알고 CCPointObject 클래스의 정의입니다. setOffsetgetOffset은 매크로 CC_SYNTHESIZE에 암시 적으로 정의되어 있습니다. 의심의 여지없이 이러한 함수가 호출됩니다. 그렇지 않으면 컴파일러가 오류를 발생 시키거나 런타임 중에 응용 프로그램이 중단됩니다. 여기에) CC_SYNTHESIZE(struct _ccArray *, m_pParallaxArray, ParallaxArray) m_pParallaxArray

3 각 CCPointObject 시차 노드의 정확히 한 아이, 즉 정보를 보유하고 CCPointObject를 저장하는 데 사용됩니다 당신은 CCPointObject 클래스의 정의를 볼 수있는 아이 자체 m_pChildm_pChildm_tRatio

참조 CCParallaxNodeExtras.cppCCParallaxNode.cpp

+0

많은 많은 감사합니다 Souandios, 그 많은 도움이되었습니다. – BitKnight

+0

이제 CCparallaxNode.cpp를 살펴보면 CCPointObject 클래스가 있고 실제로 m_pParallaxArray는 CCPointObject를 저장합니다. 내가 이해할 수없는 것은 CCPointObject가 CCParallaxNodeExtras에서 보이지 않는다는 것입니다.cpp는 액세스를 얻기 위해 데이터 멤버를 동일하게 유지하는 다른 CCPointObject를 선언합니다 (변수 이름도 동일하지만 멤버 함수가 정확히 동일하지 않음). 그리고 캐스팅 한 후 원래 CCPointObject의 객체를 제공합니다. 내말은, 우리가 그걸 정말로 할 수 있을까? 같은 이름과 데이터 멤버를 가진 클래스를 다시 정의하고 원본 개체를 가져 오기 위해 형 변환합니다. – BitKnight

+0

그게 내가 모르는 C++의 개념인가? 우리가 이것을 할 수 있다면 전체 클래스 (멤버 함수 포함)의 구조가 같아서는 안됩니다. – BitKnight