2013-06-18 182 views
1

我試圖創建的cocos2d-2.0-RC2-X-2.0.1滾動型類和我的意思是做更新功能的東西來實現自動滾動effect.Unfortunately,我找到了功能從來沒有被稱爲。儘管我做了很多工作,如在互聯網上搜索,逐步調試等,但我發現的可能解決方案几乎沒有什麼幫助。似乎scheduleUpdate不工作

據我所知,我的滾動型類從CCNode派生和我實現了滾動型的更新function.The聲明如下:

class ScrollView:public CCNode,public CCTouchDelegate 
{ 
    ClippingNode* visible_view; 
    CCNode* content_view; 
    //CCArray* items; 
    float row_margin; 
    float col_margin; 
    float interval_margin; 
    float last_y;//起始y方向座標 
    float interval_dis;//間隔時間段內y方向上的位移。 
    bool touch_stopped;//標識觸摸是否停止,主要用於自動滾動。 
    float up_bounder_y,down_bounder_y;//content_view的y方向座標上下限 
    int items_num; 
public: 
    static ScrollView* New(CCSize visible_view_size,float row_margin,float col_margin,float interval_margin,CCNode* background = NULL); 
    void ccTouchBegin(cocos2d::CCNode *node,const cocos2d::CCPoint &point); 
    void ccTouchMove(cocos2d::CCNode *node,const cocos2d::CCPoint &point); 
    void ccTouchEnd(cocos2d::CCNode *node,const cocos2d::CCPoint &point); 
    virtual void onEnter(); 
protected: 
    CCNode* makeCard(); 
    void initContent(); 
private: 
    ScrollView():visible_view(NULL),content_view(NULL),touch_stopped(true){} 
    virtual ~ScrollView(); 
    bool init(CCSize visible_view_size,float row_margin,float col_margin,float interval_margin,CCNode* background); 
    void update(float dt); 
}; 

這裏是更新函數的定義:

void ScrollView::update(float dt) 
{ 
    CCLOG("update"); 
    if(touch_stopped) 
    { 
     if(abs(interval_dis) < a) 
     { 
      interval_dis = 0.0f; 
      this->unscheduleUpdate(); 
     }else 
     { 
      if(interval_dis < 0) 
       interval_dis += a; 
      else 
       interval_dis -= a; 
      const float future_y = content_view->getPositionY() + interval_dis; 
      if(future_y > down_bounder_y && future_y < up_bounder_y) 
      { 
       content_view->setPositionY(interval_dis); 
      }else if(future_y <= down_bounder_y) 
      { 
       content_view->setPositionY(down_bounder_y); 
       interval_dis = 0.0f; 
      }else 
      { 
       content_view->setPositionY(up_bounder_y); 
       interval_dis = 0.0f; 
      } 
     } 
    } 
} 

因此,我可以確保PARAM的類型浮代替CCTime或ccTime這可能會導致更新函數不爲called.Moreover,我調用scheduleUpdate在類似於下列init方法:

bool ScrollView::init(CCSize visible_view_size,float row_margin,float col_margin,float interval_margin,CCNode* background) 
{ 
    visible_view = ClippingNode::New(visible_view_size); 
    CHECK_RETURN(visible_view,NULL,false); 
    visible_view->retain(); 
    content_view = CCNode::create();//node函數中已調用autorelease 
    CHECK_RETURN(content_view,NULL,false); 
    content_view->retain(); 
    this->row_margin = row_margin; 
    this->col_margin = col_margin; 
    this->interval_margin = interval_margin; 
    this->setAnchorPoint(ccp(0.5f,0.5f)); 
    this->setContentSize(visible_view_size); 
    visible_view->setPosition(0,0); 

    content_view->setAnchorPoint(ccp(0,1)); 
    content_view->setPosition(row_margin,visible_view_size.height); 
    content_view->setContentSize(CCSize(visible_view_size.width - 2 * row_margin,2 * col_margin)); 

    this->addChild(visible_view); 
    visible_view->addChild(content_view); 
    down_bounder_y = visible_view_size.height; 
    up_bounder_y = content_view->getContentSize().height > visible_view_size.height?content_view->getContentSize().height:visible_view_size.height; 
    UserData* user_data = UserData::getUserData(this,true); 
    CHECK_RETURN(user_data,NULL,false); 
    user_data->setContainer(true); 
    items_num = 0; 
    initContent(); 
    if(background) 
    { 
     background->setScaleX(visible_view_size.width/background->getContentSize().width); 
     background->setScaleY(visible_view_size.height/background->getContentSize().height); 
     background->setAnchorPoint(ccp(0.5f,0.5f)); 
     background->setPosition(visible_view_size.width/2,visible_view_size.height/2); 
     user_data = UserData::getUserData(background,true); 
     user_data->setHitable(false); 
     this->addChild(background,-1); 
    } 
    this->scheduleUpdate(); 
    return true; 
} 

通過調試,我可以保證了句「這 - > scheduleUpdate()」是invoked.In此外,我創建了一個名爲滾動型對象scroll_view並把它添加到主節點通過的addChild function.So,其中上午?我錯了任何addvice將不勝感激和感謝收看:p

+0

嘗試製作更新功能的參數cctime。 –

+0

我試過了,但沒有奏效。謝謝。 – sky

回答

4

我忘了調用CCNode::onEnter在我自己的onEnter功能。因此,我們所需要做的就是在ScrollView::onEnter中調用CCNode::onEnter。希望其他人不要像我那樣犯錯。

+0

無效的HelloWorld ::的OnEnter(){ 節點 ::的OnEnter(); this-> scheduleUpdate(); } 空隙的HelloWorld ::更新(浮動DT) { CCLOG(的 「HelloWorld ::更新」); }我的代碼就像scheduleUpdate不工作,你能告訴我你的代碼嗎?謝謝! – Dracuuula

0

不知道爲什麼你的代碼不能正常工作,但你嘗試過這樣的:

CCDirector::sharedDirector()->getScheduler()->scheduleUpdateForTarget(cocos2d::CCObject *pTarget, int nPriority, bool bPaused); 

您可以檢查節點是否響應更新()呼叫使用:

pNode->getIsRunning(); 
+1

我發現的疑難問題重新定義了的OnEnter方法,但我忘了來調用了滾動::的OnEnter功能CCNode ::的OnEnter body.So的解決方法是調用CCNode ::的OnEnter在我自己的OnEnter方法。感謝您的回覆:d – sky

2

如果你調用onEnterscheduleUpdate()可能無法正常工作。

CCDirector::sharedDirector()->getScheduler()->scheduleUpdateForTarget(this,0,false); 

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(NewGame::update),this,0.1,false);