2015-03-17 5 views
0

Я работаю над простым многоразовым пользовательским слоем в Cocos2d-html5 для управления классическим непрерывным скроллером. Я изначально создал это в своем основном игровом слое, где я получил его работу, но когда я переместил его на свой собственный фон BackgroundScroller, все работает, за исключением того, что Schedule, независимо от того, установлен ли он из основного слоя или в методе внутри BackgroundScroller, функция «scroll» «никогда не вызывается.График настройки в пользовательском слое и обратном вызове Not Firing

Что может привести к регистрации графика, но не к пожару? Это вопрос о масштабах? Должен ли я планировать событие на BackgroundScroller или внутри кода, который его создает?

onEnter: function(){ 
    var self = this; 
    this._super(); 

    winSize = cc.director.getWinSize(); 
    centerPos = cc.p(winSize.width/2, winSize.height/2); 

    bs = new BackgroundScroller("https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-9/1014377_10153225997278888_209146662968373758_n.jpg?oh=287c045d5b8752581f8bdce968312c5c&oe=55BBA0B3&__gda__=1437658479_65b312f58967c3e1bd0ddb07260395cb", 
winSize, centerPos, BackgroundScroller.Speeds.MEDIUM_SLOW); 
     this.addChild(bs); 
     bs.startScroll(); 
    } 

Вот код в BackgrounScroller пользовательского слоя:

var BackgroundScroller = cc.Layer.extend(/** @lends cc.Layer# */ { 
    _bgSprites: [], 
/* This is the interesting bit */ 
    startScroll: function(scrollSpeed) { 
    scrollSpeed = scrollSpeed || this.scrollSpeed; 
    cc.log('Start Scroll:' + scrollSpeed); 
    this.schedule(this.scroll, scrollSpeed); 
    this.scheduleUpdate(); 
    }, 
    scroll: function(dt) { 
    debugger; 
    for (var i = 0; i < this._bgSprites.length; i++) { 
     var bgSprite = this._bgSprites[i]; 
     bgSprite.setPositionX(bgSprite.getPosition().x - 1); 
     this.checkIsOffEdge(bgSprite); 
    } 
    }, 
    ctor: function(bgSpriteOrCallbackFunction, winSize, centerPos, scrollSpeed) { 
    this._super(); 

    this.scrollSpeed = scrollSpeed; 
    this.winSize = winSize || cc.director.getWinSize(); 
    this.centerPos = centerPos || cc.p(this.winSize.width/2, this.winSize.height/2); 

    if (typeof bgSpriteOrCallbackFunction == "function") { 
     this.setupBackgroundSprite = bgSpriteOrCallbackFunction; 
    } else { 
     this.bgSpriteName = bgSpriteOrCallbackFunction; 
    } 

    this._bgSprites = []; 
    }, 
    onEnter: function() { 
    this.setupBackgroundSprites(); 
    }, 
    stopScroll: function() { 
    this.pause(); 
    }, 
    /** 
    * Sets up sprites with either the Background sprite name or the callback function specified in the ctor. 
    * @returns void 
    */ 
    setupBackgroundSprites: function() { 
    cc.log("Setup background sprites"); 
    this.totalBgWidth = 0; 
    var bgSpriteWidth = 0; 
    while (this.totalBgWidth < this.winSize.width * 2) { 
     var bgSprite = this.setupBackgroundSprite(); 
     this._bgSprites.push(bgSprite); 
     bgSprite.setAnchorPoint(0, 0); 
     bgSpriteWidth = bgSprite.getBoundingBox().width; 
     this.addChild(bgSprite); 
     this.totalBgWidth += bgSpriteWidth; 
     this.maximumBgExtent = this.totalBgWidth - bgSpriteWidth; 
     var posN = (this._bgSprites.length - 1) * bgSprite.getBoundingBox().width; // Stack them left to right 
     bgSprite.setPositionX(posN); 
    } 

    cc.log("BgSprites in background sprites:" + this._bgSprites); 
    }, 
    setupBackgroundSprite: function() { 
    var bgSprite = new cc.Sprite(this.bgSpriteName) 
    return bgSprite; 
    }, 
    checkIsOffEdge: function(sprite) { 
    var spriteBB = sprite.getBoundingBox(); 
    if (spriteBB.x + spriteBB.width < 0) { 
     sprite.setPositionX(this.maximumBgExtent - 1); 
    } 
    } 
}); 

BackgroundScroller.Speeds = { 
    "SLOW": 0.5, 
    "MEDIUM_SLOW": 0.005, 
    "MEDIUM": 0.001, 
    "MEDIUM_FAST": 0.0005, 
    "FAST": 0.0001 
}; 
+0

Вы уверены, что функция 'onEnter' выполняется? Я думал, что это только для «Сцена», а не для «Света». –

ответ

0

Я понял это. Я инкапсулировал все, кроме расписания на уровне BackgroundScroller. В MainLayer я устанавливаю расписание, и он вызывает «прокрутку» на BackgroundScroller.

Я все еще не уверен, почему он не работал, но это имеет смысл - родительский слой - это то, где все это логику должно управляться в любом случае.