Skip to content

Commit df2dd7a

Browse files
Updates to version 5 of CCB Reader
1 parent fd2cd79 commit df2dd7a

File tree

4 files changed

+263
-7
lines changed

4 files changed

+263
-7
lines changed

extensions/CCBReader/CCBAnimationManager.js

Lines changed: 156 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ cc.BuilderAnimationManager = cc.Class.extend({
3535
_autoPlaySequenceId:0,
3636

3737
_rootNode:null,
38+
_owner:null,
3839
_rootContainerSize:null,
3940

4041
_delegate:null,
@@ -46,6 +47,8 @@ cc.BuilderAnimationManager = cc.Class.extend({
4647
_documentCallbackNodes:null,
4748
_documentControllerName:"",
4849
_lastCompletedSequenceName:"",
50+
_keyframeCallbacks:[],
51+
_keyframeCallfuncs:{},
4952

5053
_animationCompleteCallbackFunc:null,
5154
_target:null,
@@ -86,6 +89,13 @@ cc.BuilderAnimationManager = cc.Class.extend({
8689
this._rootNode = rootNode;
8790
},
8891

92+
getOwner:function () {
93+
return this._owner;
94+
},
95+
setOwner:function (owner) {
96+
this._owner = owner;
97+
},
98+
8999
addDocumentCallbackNode:function(node){
90100
this._documentCallbackNodes.push(node);
91101
},
@@ -183,6 +193,63 @@ cc.BuilderAnimationManager = cc.Class.extend({
183193
}
184194
},
185195

196+
getActionForCallbackChannel:function(channel) {
197+
var lastKeyframeTime = 0;
198+
var actions = [];
199+
200+
for (var keyframe in channel.getKeyframes())
201+
{
202+
var timeSinceLastKeyframe = keyframe.getTime() - lastKeyframeTime;
203+
lastKeyframeTime = keyframe.getTime();
204+
if (timeSinceLastKeyframe > 0)
205+
{
206+
actions.push(cc.DelayTime.create(timeSinceLastKeyframe));
207+
}
208+
209+
var selectorName = keyframe.getValue()[0];
210+
var selectorTarget = keyframe.getValue()[1];
211+
212+
// Handle JS controlled timelines
213+
var callbackName = "" + selectorTarget + ":" + selectorName;
214+
var callback = _keyframeCallFuncs[callbackName];
215+
216+
if (callback)
217+
{
218+
actions.push(callback);
219+
}
220+
}
221+
222+
if (!actions.length)
223+
return null;
224+
225+
return cc.Sequence.create(actions);
226+
},
227+
getActionForSoundChannel:function(channel) {
228+
var lastKeyframeTime = 0;
229+
var actions = [];
230+
231+
for (var keyframe in channel.getKeyframes())
232+
{
233+
var timeSinceLastKeyframe = keyframe.getTime() - lastKeyframeTime;
234+
lastKeyframeTime = keyframe.getTime();
235+
if (timeSinceLastKeyframe > 0)
236+
{
237+
actions.push(cc.DelayTime.create(timeSinceLastKeyframe));
238+
}
239+
240+
var array = keyframe.getValue();
241+
var soundFile = array[0];
242+
var pitch = array[1];
243+
var pan = array[2];
244+
var gain = array[3];
245+
246+
actions.push( cc.BuilderSoundEffect.create(soundFile, pitch, pan, gain));
247+
}
248+
249+
if (!actions.length) return null;
250+
251+
return cc.Sequence.create(actions);
252+
},
186253
runAnimationsForSequenceNamed:function(name){
187254
this.runAnimations(name);
188255
},
@@ -239,7 +306,26 @@ cc.BuilderAnimationManager = cc.Class.extend({
239306
var completeAction = cc.Sequence.create(cc.DelayTime.create(seq.getDuration() + tweenDuration),
240307
cc.CallFunc.create(this._sequenceCompleted,this));
241308
this._rootNode.runAction(completeAction);
242-
// Set the running scene
309+
310+
// Playback callbacks and sounds
311+
if (seq.getCallbackChannel()) {
312+
// Build sound actions for channel
313+
var action = this.getActionForCallbackChannel(seq.getCallbackChannel());
314+
if (action)
315+
{
316+
this._rootNode.runAction(action);
317+
}
318+
}
319+
320+
if (seq.getSoundChannel()) {
321+
// Build sound actions for channel
322+
var action = this.getActionForSoundChannel(seq.getSoundChannel());
323+
if (action)
324+
{
325+
this._rootNode.runAction(action);
326+
}
327+
}
328+
// Set the running scene
243329
this._runningSequence = this._getSequence(nSeqId);
244330
},
245331

@@ -251,7 +337,9 @@ cc.BuilderAnimationManager = cc.Class.extend({
251337
setCompletedAnimationCallback:function(target,callbackFunc){
252338
this.setAnimationCompletedCallback(target,callbackFunc);
253339
},
254-
340+
setCallFunc:function(callFunc, callbackNamed) {
341+
this._keyframeCallFuncs[callbackNamed] = callFunc;
342+
},
255343
debug:function () {
256344
},
257345

@@ -288,6 +376,10 @@ cc.BuilderAnimationManager = cc.Class.extend({
288376

289377
if (propName === "rotation") {
290378
return cc.BuilderRotateTo.create(duration, keyframe1.getValue());
379+
} else if (propName === "rotationX") {
380+
return cc.BuilderRotateXTo.create(duration, keyframe1.getValue());
381+
} else if (propName === "rotationY") {
382+
return cc.BuilderRotateYTo.create(duration, keyframe1.getValue());
291383
} else if (propName === "opacity") {
292384
return cc.FadeTo.create(duration, keyframe1.getValue());
293385
} else if (propName === "color") {
@@ -328,6 +420,12 @@ cc.BuilderAnimationManager = cc.Class.extend({
328420
if(type == CCB_SCALETYPE_MULTIPLY_RESOLUTION)
329421
var resolutionScale = cc.BuilderReader.getResolutionScale();
330422
return cc.ScaleTo.create(duration,x,y);
423+
} else if( propName === "skew") {
424+
//get relative position
425+
getValueArr = keyframe1.getValue();
426+
x = getValueArr[0];
427+
y = getValueArr[1];
428+
return cc.SkewTo.create(duration,x,y);
331429
} else {
332430
cc.log("BuilderReader: Failed to create animation for property: " + propName);
333431
}
@@ -363,6 +461,13 @@ cc.BuilderAnimationManager = cc.Class.extend({
363461
y = value[1];
364462

365463
cc.setRelativeScale(node,x,y,nType,propName);
464+
} else if( propName === "skew") {
465+
getArr = this._getBaseValue(node,propName);
466+
nType = getArr[2];
467+
x = value[0];
468+
y = value[1];
469+
node.setSkewX(x);
470+
node.setSkewY(y);
366471
}else {
367472
// [node setValue:value forKey:name];
368473
// TODO only handle rotation, opacity, displayFrame, color
@@ -588,6 +693,9 @@ cc.BuilderSetSpriteFrame.create = function (spriteFrame) {
588693
return null;
589694
};
590695

696+
//
697+
// cc.BuilderRotateTo
698+
//
591699
cc.BuilderRotateTo = cc.ActionInterval.extend({
592700
_startAngle:0,
593701
_dstAngle:0,
@@ -619,4 +727,49 @@ cc.BuilderRotateTo.create = function (duration, angle) {
619727
return ret;
620728
}
621729
return null;
622-
};
730+
};
731+
732+
//
733+
// cc.BuilderRotateXTo
734+
//
735+
cc.BuilderRotateXTo = cc.ActionInterval.extend({
736+
// TODO: rotationX is not implemented in HTML5
737+
});
738+
739+
cc.BuilderRotateXTo.create = function (duration, angle) {
740+
cc.Assert(false, "rotationX not implemented in cocos2d-html5");
741+
return null;
742+
};
743+
744+
//
745+
// cc.BuilderRotateYTo
746+
//
747+
cc.BuilderRotateYTo = cc.ActionInterval.extend({
748+
// TODO: rotationX is not implemented in HTML5
749+
});
750+
751+
cc.BuilderRotateYTo.create = function (duration, angle) {
752+
cc.Assert(false, "rotationY not implemented in cocos2d-html5");
753+
return null;
754+
};
755+
756+
//
757+
// cc.BuilderSoundEffect
758+
//
759+
cc.BuilderSoundEffect = cc.ActionInstant.extend({
760+
init:function(file) {
761+
this._file = file;
762+
},
763+
update:function(dt) {
764+
cc.AudioEngine.getInstance().playEffect(this._file);
765+
}
766+
});
767+
cc.BuilderSoundEffect.create = function (file, pitch, pan, gain) {
768+
var ret = new cc.BuilderSoundEffect();
769+
if (ret) {
770+
if (ret.init(file))
771+
return ret;
772+
}
773+
return null;
774+
};
775+

extensions/CCBReader/CCBReader.js

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
THE SOFTWARE.
2525
****************************************************************************/
2626

27-
var CCB_VERSION = 4;
27+
var CCB_VERSION = 5;
2828

2929
var CCB_PROPTYPE_POSITION = 0;
3030
var CCB_PROPTYPE_SIZE = 1;
@@ -53,6 +53,7 @@ var CCB_PROPTYPE_CCBFILE = 23;
5353
var CCB_PROPTYPE_STRING = 24;
5454
var CCB_PROPTYPE_BLOCKCCCONTROL = 25;
5555
var CCB_PROPTYPE_FLOATSCALE = 26;
56+
var CCB_PROPTYPE_FLOATXY = 27;
5657

5758
var CCB_FLOAT0 = 0;
5859
var CCB_FLOAT1 = 1;
@@ -229,6 +230,7 @@ cc.BuilderReader = cc.Class.extend({
229230
readNodeGraphFromData:function (data, owner, parentSize, animationManager) {
230231
this.initWithData(data, owner);
231232
this._actionManager.setRootContainerSize(parentSize);
233+
this._actionManager.setOwner(owner);
232234

233235
this._ownerOutletNames = [];
234236
this._ownerOutletNodes = [];
@@ -508,6 +510,65 @@ cc.BuilderReader = cc.Class.extend({
508510
}
509511
},
510512

513+
_readCallbackKeyframesForSeq:function(seq) {
514+
var numKeyframes = this.readInt(false);
515+
516+
if (!numKeyframes)
517+
return true;
518+
519+
var channel = new cc.BuilderSequenceProperty();
520+
521+
for (var i = 0; i < numKeyframes; i++)
522+
{
523+
var time = this.readFloat();
524+
var callbackName = this.readCachedString();
525+
var callbackType = this.readInt(false);
526+
527+
var value = [ callbackName, callbackType];
528+
529+
var keyframe = new cc.BuilderKeyframe();
530+
keyframe.setTime(time);
531+
keyframe.setValue(value);
532+
533+
var callbackIdentifier = callbackType + ":" + callbackName;
534+
actionManager.getKeyframeCallbacks().push(callbackIdentifier);
535+
channel.getKeyframes().push(keyframe);
536+
}
537+
538+
// Assign to sequence
539+
seq.setCallbackChannel(channel);
540+
541+
return true;
542+
},
543+
544+
_readSoundKeyframesForSeq:function(seq) {
545+
var numKeyframes = this.readInt(false);
546+
547+
if (!numKeyframes) return true;
548+
549+
var channel = new cc.BuilderSequenceProperty();
550+
551+
for (var i = 0; i < numKeyframes; i++)
552+
{
553+
var time = this.readFloat();
554+
var soundFile = this.readCachedString();
555+
var pitch = this.readFloat();
556+
var pan = this.readFloat();
557+
var gain = this.readFloat();
558+
559+
var value = [soundFile, pitch, pan, gain];
560+
var keyframe = new cc.BuilderKeyframe();
561+
keyframe.setTime(time);
562+
keyframe.setValue(value);
563+
564+
channel.getKeyframes().push(keyframe);
565+
}
566+
567+
// Assign to sequence
568+
seq.setSoundChannel(channel);
569+
570+
return true;
571+
},
511572
_readSequences:function () {
512573
var sequences = this._actionManager.getSequences();
513574
var numSeqs = this.readInt(false);
@@ -517,6 +578,12 @@ cc.BuilderReader = cc.Class.extend({
517578
seq.setName(this.readCachedString());
518579
seq.setSequenceId(this.readInt(false));
519580
seq.setChainedSequenceId(this.readInt(true));
581+
582+
if (!this._readCallbackKeyframesForSeq(seq))
583+
return false;
584+
if (!this._readSoundKeyframesForSeq(seq))
585+
return false;
586+
520587
sequences.push(seq);
521588
}
522589
this._actionManager.setAutoPlaySequenceId(this.readInt(true));
@@ -549,9 +616,11 @@ cc.BuilderReader = cc.Class.extend({
549616
} else if (type == CCB_PROPTYPE_COLOR3) {
550617
var c = cc.c3(this.readByte(), this.readByte(), this.readByte());
551618
value = cc.Color3BWapper.create(c);
619+
} else if (type == CCB_PROPTYPE_FLOATXY) {
620+
value = [this.readFloat(), this.readFloat()];
552621
} else if (type == CCB_PROPTYPE_DEGREES) {
553622
value = this.readFloat();
554-
} else if (type == CCB_PROPTYPE_SCALELOCK || type == CCB_PROPTYPE_POSITION) {
623+
} else if (type == CCB_PROPTYPE_SCALELOCK || type == CCB_PROPTYPE_POSITION || type == CCB_PROPTYPE_FLOATXY) {
555624
value = [this.readFloat(), this.readFloat()];
556625
} else if (type == CCB_PROPTYPE_SPRITEFRAME) {
557626
var spriteSheet = this.readCachedString();
@@ -603,7 +672,7 @@ cc.BuilderReader = cc.Class.extend({
603672
}
604673

605674
this._jsControlled = this.readBool();
606-
675+
// no need to set if it is "jscontrolled". It is obvious.
607676
return true;
608677
},
609678

extensions/CCBReader/CCBSequence.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ cc.BuilderSequence = cc.Class.extend({
2929
_name:"",
3030
_sequenceId:0,
3131
_chainedSequenceId:0,
32+
_callbackChannel:null,
33+
_soundChannel:null,
3234

3335
ctor:function(){
3436
this._name = "";
@@ -60,7 +62,22 @@ cc.BuilderSequence = cc.Class.extend({
6062
},
6163
setChainedSequenceId:function(chainedSequenceId){
6264
this._chainedSequenceId = chainedSequenceId;
65+
},
66+
67+
getCallbackChannel:function() {
68+
return this._callbackChannel;
69+
},
70+
setCallbackChannel:function(channel) {
71+
this._callbackChannel = channel;
72+
},
73+
74+
getSoundChannel:function() {
75+
return this._soundChannel;
76+
},
77+
setSoundChannel:function(channel) {
78+
this._soundChannel = channel;
6379
}
80+
6481
});
6582

6683
cc.BuilderSequenceProperty = cc.Class.extend({

0 commit comments

Comments
 (0)