mirror of https://github.com/axmolengine/axmol.git
Merge branch 'v3' of https://github.com/super626/cocos2d-x into v3
This commit is contained in:
commit
1581396810
7
AUTHORS
7
AUTHORS
|
@ -752,7 +752,9 @@ Developers:
|
|||
|
||||
hanjukim
|
||||
Fixed a bug that color and opacity settings were not applied when invoking Label::alignText.
|
||||
|
||||
Fixed the bug that FileUtils:getStringFromFile() may return a unterminated string
|
||||
Skip BOM in DataReaderHelper::addDataFromJsonCache()
|
||||
|
||||
bagobor
|
||||
Fixed a memory leak in AssetsManager::uncompress.
|
||||
Code format fix and small optimizations in cocostudio/CCActionNode.cpp.
|
||||
|
@ -892,6 +894,9 @@ Developers:
|
|||
kyokomi
|
||||
Fix the bug that UIButton doesn't support TTF font
|
||||
Fix a but of TextReader
|
||||
|
||||
gin0606
|
||||
Add a new line at the end of a file
|
||||
|
||||
Retired Core Developers:
|
||||
WenSheng Yang
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
cocos2d-x-3.2 ???
|
||||
[NEW] Node: added getName(), setName(), getChildByName(), enumerateChildren()
|
||||
[NEW] Label: support setting line height and additional kerning of label that not using system font
|
||||
|
||||
[FIX] FileUtils: getStringFromFile may return a unterminated string
|
||||
[FIX] UIButton: doesn't support TTF font
|
||||
|
||||
cocos2d-x-3.2-alpha0 Jun.17 2014
|
||||
|
|
|
@ -100,6 +100,8 @@ endif()
|
|||
if(MINGW)
|
||||
add_definitions(-DGLEW_STATIC)
|
||||
add_definitions(-D__SSIZE_T)
|
||||
set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lws2_32")
|
||||
set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lws2_32")
|
||||
endif()
|
||||
|
||||
|
||||
|
|
|
@ -40,6 +40,28 @@
|
|||
/* End PBXAggregateTarget section */
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
0634A4D0194B19E400E608AF /* CCActionTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4C5194B19E400E608AF /* CCActionTimeline.cpp */; };
|
||||
0634A4D1194B19E400E608AF /* CCActionTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4C5194B19E400E608AF /* CCActionTimeline.cpp */; };
|
||||
0634A4D2194B19E400E608AF /* CCActionTimeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4C6194B19E400E608AF /* CCActionTimeline.h */; };
|
||||
0634A4D3194B19E400E608AF /* CCActionTimeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4C6194B19E400E608AF /* CCActionTimeline.h */; };
|
||||
0634A4D4194B19E400E608AF /* CCActionTimelineCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4C7194B19E400E608AF /* CCActionTimelineCache.cpp */; };
|
||||
0634A4D5194B19E400E608AF /* CCActionTimelineCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4C7194B19E400E608AF /* CCActionTimelineCache.cpp */; };
|
||||
0634A4D6194B19E400E608AF /* CCActionTimelineCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4C8194B19E400E608AF /* CCActionTimelineCache.h */; };
|
||||
0634A4D7194B19E400E608AF /* CCActionTimelineCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4C8194B19E400E608AF /* CCActionTimelineCache.h */; };
|
||||
0634A4D8194B19E400E608AF /* CCFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4C9194B19E400E608AF /* CCFrame.cpp */; };
|
||||
0634A4D9194B19E400E608AF /* CCFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4C9194B19E400E608AF /* CCFrame.cpp */; };
|
||||
0634A4DA194B19E400E608AF /* CCFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CA194B19E400E608AF /* CCFrame.h */; };
|
||||
0634A4DB194B19E400E608AF /* CCFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CA194B19E400E608AF /* CCFrame.h */; };
|
||||
0634A4DC194B19E400E608AF /* CCNodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4CB194B19E400E608AF /* CCNodeReader.cpp */; };
|
||||
0634A4DD194B19E400E608AF /* CCNodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4CB194B19E400E608AF /* CCNodeReader.cpp */; };
|
||||
0634A4DE194B19E400E608AF /* CCNodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CC194B19E400E608AF /* CCNodeReader.h */; };
|
||||
0634A4DF194B19E400E608AF /* CCNodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CC194B19E400E608AF /* CCNodeReader.h */; };
|
||||
0634A4E0194B19E400E608AF /* CCTimeLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4CD194B19E400E608AF /* CCTimeLine.cpp */; };
|
||||
0634A4E1194B19E400E608AF /* CCTimeLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0634A4CD194B19E400E608AF /* CCTimeLine.cpp */; };
|
||||
0634A4E2194B19E400E608AF /* CCTimeLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CE194B19E400E608AF /* CCTimeLine.h */; };
|
||||
0634A4E3194B19E400E608AF /* CCTimeLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CE194B19E400E608AF /* CCTimeLine.h */; };
|
||||
0634A4E4194B19E400E608AF /* CCTimelineMacro.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CF194B19E400E608AF /* CCTimelineMacro.h */; };
|
||||
0634A4E5194B19E400E608AF /* CCTimelineMacro.h in Headers */ = {isa = PBXBuildFile; fileRef = 0634A4CF194B19E400E608AF /* CCTimelineMacro.h */; };
|
||||
06CAAAC5186AD7E50012A414 /* TriggerObj.h in Headers */ = {isa = PBXBuildFile; fileRef = 06CAAAC1186AD63B0012A414 /* TriggerObj.h */; };
|
||||
06CAAAC6186AD7E60012A414 /* TriggerObj.h in Headers */ = {isa = PBXBuildFile; fileRef = 06CAAAC1186AD63B0012A414 /* TriggerObj.h */; };
|
||||
06CAAAC7186AD7E90012A414 /* TriggerObj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 06CAAAC0186AD63B0012A414 /* TriggerObj.cpp */; };
|
||||
|
@ -1887,6 +1909,17 @@
|
|||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
0634A4C5194B19E400E608AF /* CCActionTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCActionTimeline.cpp; sourceTree = "<group>"; };
|
||||
0634A4C6194B19E400E608AF /* CCActionTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCActionTimeline.h; sourceTree = "<group>"; };
|
||||
0634A4C7194B19E400E608AF /* CCActionTimelineCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCActionTimelineCache.cpp; sourceTree = "<group>"; };
|
||||
0634A4C8194B19E400E608AF /* CCActionTimelineCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCActionTimelineCache.h; sourceTree = "<group>"; };
|
||||
0634A4C9194B19E400E608AF /* CCFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFrame.cpp; sourceTree = "<group>"; };
|
||||
0634A4CA194B19E400E608AF /* CCFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCFrame.h; sourceTree = "<group>"; };
|
||||
0634A4CB194B19E400E608AF /* CCNodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCNodeReader.cpp; sourceTree = "<group>"; };
|
||||
0634A4CC194B19E400E608AF /* CCNodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCNodeReader.h; sourceTree = "<group>"; };
|
||||
0634A4CD194B19E400E608AF /* CCTimeLine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCTimeLine.cpp; sourceTree = "<group>"; };
|
||||
0634A4CE194B19E400E608AF /* CCTimeLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTimeLine.h; sourceTree = "<group>"; };
|
||||
0634A4CF194B19E400E608AF /* CCTimelineMacro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTimelineMacro.h; sourceTree = "<group>"; };
|
||||
06CAAABC186AD63B0012A414 /* TriggerBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TriggerBase.cpp; sourceTree = "<group>"; };
|
||||
06CAAABD186AD63B0012A414 /* TriggerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TriggerBase.h; sourceTree = "<group>"; };
|
||||
06CAAABE186AD63B0012A414 /* TriggerMng.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TriggerMng.cpp; sourceTree = "<group>"; };
|
||||
|
@ -2934,6 +2967,24 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
0634A4C4194B19E400E608AF /* ActionTimeline */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0634A4C5194B19E400E608AF /* CCActionTimeline.cpp */,
|
||||
0634A4C6194B19E400E608AF /* CCActionTimeline.h */,
|
||||
0634A4C7194B19E400E608AF /* CCActionTimelineCache.cpp */,
|
||||
0634A4C8194B19E400E608AF /* CCActionTimelineCache.h */,
|
||||
0634A4C9194B19E400E608AF /* CCFrame.cpp */,
|
||||
0634A4CA194B19E400E608AF /* CCFrame.h */,
|
||||
0634A4CB194B19E400E608AF /* CCNodeReader.cpp */,
|
||||
0634A4CC194B19E400E608AF /* CCNodeReader.h */,
|
||||
0634A4CD194B19E400E608AF /* CCTimeLine.cpp */,
|
||||
0634A4CE194B19E400E608AF /* CCTimeLine.h */,
|
||||
0634A4CF194B19E400E608AF /* CCTimelineMacro.h */,
|
||||
);
|
||||
path = ActionTimeline;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1551A334158F2AB200E66CFE = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -3590,6 +3641,7 @@
|
|||
1A8C5946180E930E00EF57C3 /* cocostudio */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0634A4C4194B19E400E608AF /* ActionTimeline */,
|
||||
50FCEB6818C72017004AD434 /* WidgetReader */,
|
||||
06CAAAC1186AD63B0012A414 /* TriggerObj.h */,
|
||||
06CAAABC186AD63B0012A414 /* TriggerBase.cpp */,
|
||||
|
@ -4916,6 +4968,7 @@
|
|||
50ABBE731925AB6F00A911A9 /* CCEventListenerMouse.h in Headers */,
|
||||
1A570063180BC5A10088DEC7 /* CCAction.h in Headers */,
|
||||
1A570067180BC5A10088DEC7 /* CCActionCamera.h in Headers */,
|
||||
0634A4DA194B19E400E608AF /* CCFrame.h in Headers */,
|
||||
1A57006B180BC5A10088DEC7 /* CCActionCatmullRom.h in Headers */,
|
||||
1A57006F180BC5A10088DEC7 /* CCActionEase.h in Headers */,
|
||||
1A570073180BC5A10088DEC7 /* CCActionGrid.h in Headers */,
|
||||
|
@ -5020,6 +5073,7 @@
|
|||
1A570294180BCCAB0088DEC7 /* CCAnimation.h in Headers */,
|
||||
50ABBD421925AB0000A911A9 /* CCMathBase.h in Headers */,
|
||||
1A570298180BCCAB0088DEC7 /* CCAnimationCache.h in Headers */,
|
||||
0634A4DE194B19E400E608AF /* CCNodeReader.h in Headers */,
|
||||
50FCEB9D18C72017004AD434 /* ImageViewReader.h in Headers */,
|
||||
B29594C81926D61F003EEF37 /* CCObjLoader.h in Headers */,
|
||||
50ABBE911925AB6F00A911A9 /* CCPlatformMacros.h in Headers */,
|
||||
|
@ -5080,6 +5134,7 @@
|
|||
1AD71DCF180E26E600808F54 /* CCControlLoader.h in Headers */,
|
||||
50ABBE7B1925AB6F00A911A9 /* CCEventMouse.h in Headers */,
|
||||
1AD71DD3180E26E600808F54 /* CCLabelBMFontLoader.h in Headers */,
|
||||
0634A4D6194B19E400E608AF /* CCActionTimelineCache.h in Headers */,
|
||||
1AD71DD7180E26E600808F54 /* CCLabelTTFLoader.h in Headers */,
|
||||
1AD71DDB180E26E600808F54 /* CCLayerColorLoader.h in Headers */,
|
||||
503DD8F91926B0DB00CD74DD /* CCIMEDispatcher.h in Headers */,
|
||||
|
@ -5148,6 +5203,7 @@
|
|||
50ABBE3F1925AB6F00A911A9 /* CCDataVisitor.h in Headers */,
|
||||
1AD71EDF180E26E600808F54 /* Slot.h in Headers */,
|
||||
1AD71EE3180E26E600808F54 /* SlotData.h in Headers */,
|
||||
0634A4E2194B19E400E608AF /* CCTimeLine.h in Headers */,
|
||||
1AD71EE7180E26E600808F54 /* spine-cocos2dx.h in Headers */,
|
||||
1AD71EE9180E26E600808F54 /* spine.h in Headers */,
|
||||
1AAF536C180E3374000584C8 /* HttpClient.h in Headers */,
|
||||
|
@ -5179,6 +5235,7 @@
|
|||
50ABBE371925AB6F00A911A9 /* CCConsole.h in Headers */,
|
||||
1A8C59A1180E930E00EF57C3 /* CCArmature.h in Headers */,
|
||||
1A8C59A5180E930E00EF57C3 /* CCArmatureAnimation.h in Headers */,
|
||||
0634A4D2194B19E400E608AF /* CCActionTimeline.h in Headers */,
|
||||
1A8C59A9180E930E00EF57C3 /* CCArmatureDataManager.h in Headers */,
|
||||
50ABC00B1926664800A911A9 /* CCDevice.h in Headers */,
|
||||
2905FA7A18CF08D100240AA3 /* UISlider.h in Headers */,
|
||||
|
@ -5217,6 +5274,7 @@
|
|||
50ABBD951925AB4100A911A9 /* CCGLProgramState.h in Headers */,
|
||||
1A8C59F1180E930E00EF57C3 /* CCSpriteFrameCacheHelper.h in Headers */,
|
||||
1A8C59F5180E930E00EF57C3 /* CCSSceneReader.h in Headers */,
|
||||
0634A4E4194B19E400E608AF /* CCTimelineMacro.h in Headers */,
|
||||
1A8C59F9180E930E00EF57C3 /* CCTransformHelp.h in Headers */,
|
||||
1A8C59FD180E930E00EF57C3 /* CCTween.h in Headers */,
|
||||
1A8C5A05180E930E00EF57C3 /* CCUtilMath.h in Headers */,
|
||||
|
@ -5380,6 +5438,7 @@
|
|||
2AC795EA1862875D005EC8E1 /* BoundingBoxAttachment.h in Headers */,
|
||||
503DD8F01926736A00CD74DD /* CCStdC.h in Headers */,
|
||||
46A170FF1807CECB005B8026 /* CCPhysicsContact.h in Headers */,
|
||||
0634A4D3194B19E400E608AF /* CCActionTimeline.h in Headers */,
|
||||
50ABBDA21925AB4100A911A9 /* CCGroupCommand.h in Headers */,
|
||||
503DD8EF1926736A00CD74DD /* CCPlatformDefine.h in Headers */,
|
||||
46A171041807CECB005B8026 /* CCPhysicsShape.h in Headers */,
|
||||
|
@ -5392,6 +5451,7 @@
|
|||
46A170FD1807CECB005B8026 /* CCPhysicsBody.h in Headers */,
|
||||
2905FA6118CF08D100240AA3 /* UILayoutParameter.h in Headers */,
|
||||
B29594C51926D61F003EEF37 /* CCMesh.h in Headers */,
|
||||
0634A4DB194B19E400E608AF /* CCFrame.h in Headers */,
|
||||
50ABBE9C1925AB6F00A911A9 /* CCRef.h in Headers */,
|
||||
50ABBD961925AB4100A911A9 /* CCGLProgramState.h in Headers */,
|
||||
46A171061807CECB005B8026 /* CCPhysicsWorld.h in Headers */,
|
||||
|
@ -5403,6 +5463,7 @@
|
|||
50ABBEC21925AB6F00A911A9 /* CCValue.h in Headers */,
|
||||
2905FA5518CF08D100240AA3 /* UIImageView.h in Headers */,
|
||||
50ABBECA1925AB6F00A911A9 /* firePngData.h in Headers */,
|
||||
0634A4E3194B19E400E608AF /* CCTimeLine.h in Headers */,
|
||||
50ABBE401925AB6F00A911A9 /* CCDataVisitor.h in Headers */,
|
||||
1A570064180BC5A10088DEC7 /* CCAction.h in Headers */,
|
||||
06CAAACE186AD7FA0012A414 /* TriggerBase.h in Headers */,
|
||||
|
@ -5460,6 +5521,7 @@
|
|||
1A57011E180BC90D0088DEC7 /* CCGrabber.h in Headers */,
|
||||
1A570122180BC90D0088DEC7 /* CCGrid.h in Headers */,
|
||||
50FCEBBA18C72017004AD434 /* TextAtlasReader.h in Headers */,
|
||||
0634A4D7194B19E400E608AF /* CCActionTimelineCache.h in Headers */,
|
||||
5034CA2E191D591100CE6051 /* ccShader_PositionTextureA8Color.frag in Headers */,
|
||||
50ABBD5B1925AB0000A911A9 /* Vec2.h in Headers */,
|
||||
50ABBD411925AB0000A911A9 /* CCMath.h in Headers */,
|
||||
|
@ -5543,6 +5605,7 @@
|
|||
50ABBE2A1925AB6F00A911A9 /* CCAutoreleasePool.h in Headers */,
|
||||
1A57030F180BCF190088DEC7 /* CCComponent.h in Headers */,
|
||||
1A570313180BCF190088DEC7 /* CCComponentContainer.h in Headers */,
|
||||
0634A4DF194B19E400E608AF /* CCNodeReader.h in Headers */,
|
||||
1A087AEB1860400400196EF5 /* edtaa3func.h in Headers */,
|
||||
2905FA6518CF08D100240AA3 /* UIListView.h in Headers */,
|
||||
50FCEBAA18C72017004AD434 /* LoadingBarReader.h in Headers */,
|
||||
|
@ -5664,6 +5727,7 @@
|
|||
1A9DCA2A180E6955007A3AD4 /* CCGLBufferedNode.h in Headers */,
|
||||
1A01C69F18F57BE800EFE3A6 /* CCString.h in Headers */,
|
||||
1A01C69118F57BE800EFE3A6 /* CCDictionary.h in Headers */,
|
||||
0634A4E5194B19E400E608AF /* CCTimelineMacro.h in Headers */,
|
||||
1A8C598E180E930E00EF57C3 /* CCActionFrame.h in Headers */,
|
||||
1A8C5992180E930E00EF57C3 /* CCActionFrameEasing.h in Headers */,
|
||||
5034CA36191D591100CE6051 /* ccShader_PositionTexture.frag in Headers */,
|
||||
|
@ -6100,6 +6164,7 @@
|
|||
1A01C6A418F58F7500EFE3A6 /* CCNotificationCenter.cpp in Sources */,
|
||||
46A170EA1807CECA005B8026 /* CCPhysicsJoint.cpp in Sources */,
|
||||
5027253C190BF1B900AAF4ED /* cocos2d.cpp in Sources */,
|
||||
0634A4D4194B19E400E608AF /* CCActionTimelineCache.cpp in Sources */,
|
||||
50ABC0611926664800A911A9 /* CCCommon.mm in Sources */,
|
||||
50ABBDB11925AB4100A911A9 /* ccShaders.cpp in Sources */,
|
||||
46A170EF1807CECA005B8026 /* CCPhysicsWorld.cpp in Sources */,
|
||||
|
@ -6218,6 +6283,7 @@
|
|||
1A5702EE180BCE750088DEC7 /* CCTMXLayer.cpp in Sources */,
|
||||
50ABBE691925AB6F00A911A9 /* CCEventListenerFocus.cpp in Sources */,
|
||||
1A5702F2180BCE750088DEC7 /* CCTMXObjectGroup.cpp in Sources */,
|
||||
0634A4DC194B19E400E608AF /* CCNodeReader.cpp in Sources */,
|
||||
1A5702F6180BCE750088DEC7 /* CCTMXTiledMap.cpp in Sources */,
|
||||
1A5702FA180BCE750088DEC7 /* CCTMXXMLParser.cpp in Sources */,
|
||||
50ABBD5C1925AB0000A911A9 /* Vec3.cpp in Sources */,
|
||||
|
@ -6306,6 +6372,7 @@
|
|||
1AD71EE5180E26E600808F54 /* spine-cocos2dx.cpp in Sources */,
|
||||
1AAF536A180E3374000584C8 /* HttpClient.cpp in Sources */,
|
||||
50ABC0631926664800A911A9 /* CCDevice.mm in Sources */,
|
||||
0634A4E0194B19E400E608AF /* CCTimeLine.cpp in Sources */,
|
||||
1AAF5372180E3374000584C8 /* SocketIO.cpp in Sources */,
|
||||
50ABBE1F1925AB6F00A911A9 /* atitc.cpp in Sources */,
|
||||
1AAF5376180E3374000584C8 /* WebSocket.cpp in Sources */,
|
||||
|
@ -6348,6 +6415,7 @@
|
|||
2905FA7C18CF08D100240AA3 /* UIText.cpp in Sources */,
|
||||
50FCEB9F18C72017004AD434 /* LayoutReader.cpp in Sources */,
|
||||
50ABC0211926664800A911A9 /* CCGLView.cpp in Sources */,
|
||||
0634A4D8194B19E400E608AF /* CCFrame.cpp in Sources */,
|
||||
1A8C59C7180E930E00EF57C3 /* CCComRender.cpp in Sources */,
|
||||
50ABC00D1926664800A911A9 /* CCFileUtils.cpp in Sources */,
|
||||
1A8C59CB180E930E00EF57C3 /* CCDataReaderHelper.cpp in Sources */,
|
||||
|
@ -6362,6 +6430,7 @@
|
|||
1A8C59D7180E930E00EF57C3 /* CCDisplayFactory.cpp in Sources */,
|
||||
50ABBD601925AB0000A911A9 /* Vec4.cpp in Sources */,
|
||||
1A8C59DB180E930E00EF57C3 /* CCDisplayManager.cpp in Sources */,
|
||||
0634A4D0194B19E400E608AF /* CCActionTimeline.cpp in Sources */,
|
||||
2905FA6218CF08D100240AA3 /* UIListView.cpp in Sources */,
|
||||
1A8C59DF180E930E00EF57C3 /* CCInputDelegate.cpp in Sources */,
|
||||
1A8C59E3180E930E00EF57C3 /* CCProcessBase.cpp in Sources */,
|
||||
|
@ -6556,6 +6625,7 @@
|
|||
3EA0FB6C191C841D00B170C8 /* UIVideoPlayerIOS.mm in Sources */,
|
||||
1A570062180BC5A10088DEC7 /* CCAction.cpp in Sources */,
|
||||
1A570066180BC5A10088DEC7 /* CCActionCamera.cpp in Sources */,
|
||||
0634A4D9194B19E400E608AF /* CCFrame.cpp in Sources */,
|
||||
1A57006A180BC5A10088DEC7 /* CCActionCatmullRom.cpp in Sources */,
|
||||
1A57006E180BC5A10088DEC7 /* CCActionEase.cpp in Sources */,
|
||||
50ABBD8C1925AB4100A911A9 /* CCGLProgram.cpp in Sources */,
|
||||
|
@ -6564,6 +6634,7 @@
|
|||
B37510811823ACA100B3BA6A /* CCPhysicsJointInfo_chipmunk.cpp in Sources */,
|
||||
2905FA8D18CF08D100240AA3 /* UIWidget.cpp in Sources */,
|
||||
B29594B51926D5EC003EEF37 /* CCMeshCommand.cpp in Sources */,
|
||||
0634A4D5194B19E400E608AF /* CCActionTimelineCache.cpp in Sources */,
|
||||
50ABBE7E1925AB6F00A911A9 /* CCEventTouch.cpp in Sources */,
|
||||
50FCEB9818C72017004AD434 /* CheckBoxReader.cpp in Sources */,
|
||||
50ABBE6E1925AB6F00A911A9 /* CCEventListenerKeyboard.cpp in Sources */,
|
||||
|
@ -6623,6 +6694,7 @@
|
|||
50ABBD9C1925AB4100A911A9 /* ccGLStateCache.cpp in Sources */,
|
||||
1A5701E7180BCB8C0088DEC7 /* CCTransition.cpp in Sources */,
|
||||
50ABC01E1926664800A911A9 /* CCThread.cpp in Sources */,
|
||||
0634A4D1194B19E400E608AF /* CCActionTimeline.cpp in Sources */,
|
||||
1A5701EB180BCB8C0088DEC7 /* CCTransitionPageTurn.cpp in Sources */,
|
||||
1A5701EF180BCB8C0088DEC7 /* CCTransitionProgress.cpp in Sources */,
|
||||
1A5701F8180BCBAD0088DEC7 /* CCMenu.cpp in Sources */,
|
||||
|
@ -6680,6 +6752,7 @@
|
|||
50ABBDB61925AB4100A911A9 /* CCTexture2D.cpp in Sources */,
|
||||
1A570355180BD0B00088DEC7 /* ioapi.cpp in Sources */,
|
||||
1A570359180BD0B00088DEC7 /* unzip.cpp in Sources */,
|
||||
0634A4E1194B19E400E608AF /* CCTimeLine.cpp in Sources */,
|
||||
1AD71DAA180E26E600808F54 /* CCBAnimationManager.cpp in Sources */,
|
||||
50ABBD881925AB4100A911A9 /* CCCustomCommand.cpp in Sources */,
|
||||
50ABBE941925AB6F00A911A9 /* CCProfiling.cpp in Sources */,
|
||||
|
@ -6826,6 +6899,7 @@
|
|||
2905FA7518CF08D100240AA3 /* UIScrollView.cpp in Sources */,
|
||||
1A8C5A0E180E930E00EF57C3 /* DictionaryHelper.cpp in Sources */,
|
||||
1ABA68AF1888D700007D1BB4 /* CCFontCharMap.cpp in Sources */,
|
||||
0634A4DD194B19E400E608AF /* CCNodeReader.cpp in Sources */,
|
||||
50ABBE7A1925AB6F00A911A9 /* CCEventMouse.cpp in Sources */,
|
||||
50ABBD981925AB4100A911A9 /* CCGLProgramStateCache.cpp in Sources */,
|
||||
B6B26344193884D60088FE25 /* CCAnimation3D.cpp in Sources */,
|
||||
|
|
|
@ -804,6 +804,10 @@
|
|||
29080DE4191B595E0066F8DF /* UIWidgetAddNodeTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29080D89191B595E0066F8DF /* UIWidgetAddNodeTest.cpp */; };
|
||||
29080DE5191B595E0066F8DF /* UIWidgetAddNodeTest_Editor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29080D8B191B595E0066F8DF /* UIWidgetAddNodeTest_Editor.cpp */; };
|
||||
29080DE6191B595E0066F8DF /* UIWidgetAddNodeTest_Editor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29080D8B191B595E0066F8DF /* UIWidgetAddNodeTest_Editor.cpp */; };
|
||||
38FA2E73194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38FA2E71194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp */; };
|
||||
38FA2E74194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38FA2E71194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp */; };
|
||||
38FA2E76194AECF800FF2BE4 /* ActionTimeline in Resources */ = {isa = PBXBuildFile; fileRef = 38FA2E75194AECF800FF2BE4 /* ActionTimeline */; };
|
||||
38FA2E77194AECF800FF2BE4 /* ActionTimeline in Resources */ = {isa = PBXBuildFile; fileRef = 38FA2E75194AECF800FF2BE4 /* ActionTimeline */; };
|
||||
3E92EA821921A1400094CD21 /* Sprite3DTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E92EA801921A1400094CD21 /* Sprite3DTest.cpp */; };
|
||||
3E92EA831921A1400094CD21 /* Sprite3DTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E92EA801921A1400094CD21 /* Sprite3DTest.cpp */; };
|
||||
3E92EA851921A7720094CD21 /* Sprite3DTest in Resources */ = {isa = PBXBuildFile; fileRef = 3E92EA841921A7720094CD21 /* Sprite3DTest */; };
|
||||
|
@ -1840,6 +1844,9 @@
|
|||
29080D8A191B595E0066F8DF /* UIWidgetAddNodeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIWidgetAddNodeTest.h; sourceTree = "<group>"; };
|
||||
29080D8B191B595E0066F8DF /* UIWidgetAddNodeTest_Editor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UIWidgetAddNodeTest_Editor.cpp; sourceTree = "<group>"; };
|
||||
29080D8C191B595E0066F8DF /* UIWidgetAddNodeTest_Editor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIWidgetAddNodeTest_Editor.h; sourceTree = "<group>"; };
|
||||
38FA2E71194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ActionTimelineTestScene.cpp; sourceTree = "<group>"; };
|
||||
38FA2E72194AEBE100FF2BE4 /* ActionTimelineTestScene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActionTimelineTestScene.h; sourceTree = "<group>"; };
|
||||
38FA2E75194AECF800FF2BE4 /* ActionTimeline */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ActionTimeline; path = "../tests/cpp-tests/Resources/ActionTimeline"; sourceTree = "<group>"; };
|
||||
3E92EA801921A1400094CD21 /* Sprite3DTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Sprite3DTest.cpp; path = Sprite3DTest/Sprite3DTest.cpp; sourceTree = "<group>"; };
|
||||
3E92EA811921A1400094CD21 /* Sprite3DTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Sprite3DTest.h; path = Sprite3DTest/Sprite3DTest.h; sourceTree = "<group>"; };
|
||||
3E92EA841921A7720094CD21 /* Sprite3DTest */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Sprite3DTest; path = "../tests/cpp-tests/Resources/Sprite3DTest"; sourceTree = "<group>"; };
|
||||
|
@ -2541,6 +2548,7 @@
|
|||
1AC359B418CECF0B00F37B72 /* ExtensionsTest */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
38FA2E70194AEBE100FF2BE4 /* CocoStudioActionTimelineTest */,
|
||||
1AC359B518CECF0B00F37B72 /* CocosBuilderTest */,
|
||||
1AC359DC18CECF0B00F37B72 /* CocoStudioArmatureTest */,
|
||||
1AC359DF18CECF0B00F37B72 /* CocoStudioComponentsTest */,
|
||||
|
@ -3240,6 +3248,7 @@
|
|||
1AC35CA818CED83500F37B72 /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
38FA2E75194AECF800FF2BE4 /* ActionTimeline */,
|
||||
B2507B6A192589AF00FA4972 /* Shaders3D */,
|
||||
3E92EA841921A7720094CD21 /* Sprite3DTest */,
|
||||
3EA0FB5D191B92F100B170C8 /* cocosvideo.mp4 */,
|
||||
|
@ -3757,6 +3766,15 @@
|
|||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
38FA2E70194AEBE100FF2BE4 /* CocoStudioActionTimelineTest */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
38FA2E71194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp */,
|
||||
38FA2E72194AEBE100FF2BE4 /* ActionTimelineTestScene.h */,
|
||||
);
|
||||
path = CocoStudioActionTimelineTest;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3E92EA7D1921A0C60094CD21 /* Sprite3DTest */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -4383,6 +4401,7 @@
|
|||
1AC35CE018CED84500F37B72 /* configs in Resources */,
|
||||
1AC35CE618CED84500F37B72 /* effect2.ogg in Resources */,
|
||||
1AC35CFA18CED84500F37B72 /* Misc in Resources */,
|
||||
38FA2E76194AECF800FF2BE4 /* ActionTimeline in Resources */,
|
||||
1AC35D0418CED84500F37B72 /* Shaders in Resources */,
|
||||
1AC35CD818CED84500F37B72 /* CocosBuilderExample.ccbresourcelog in Resources */,
|
||||
B2507B6B192589AF00FA4972 /* Shaders3D in Resources */,
|
||||
|
@ -4451,6 +4470,7 @@
|
|||
1AC35CF318CED84500F37B72 /* Hello.png in Resources */,
|
||||
1AC35C8F18CECF1400F37B72 /* Icon-152.png in Resources */,
|
||||
1AC35CE718CED84500F37B72 /* effect2.ogg in Resources */,
|
||||
38FA2E77194AECF800FF2BE4 /* ActionTimeline in Resources */,
|
||||
1AC35C9718CECF1400F37B72 /* Icon-80.png in Resources */,
|
||||
1AC35CEB18CED84500F37B72 /* fileLookup.plist in Resources */,
|
||||
1AC35CFD18CED84500F37B72 /* music.mid in Resources */,
|
||||
|
@ -4686,6 +4706,7 @@
|
|||
1AC35C2B18CECF0C00F37B72 /* PerformanceLabelTest.cpp in Sources */,
|
||||
1AC35C0118CECF0C00F37B72 /* TableViewTestScene.cpp in Sources */,
|
||||
1AC35C4B18CECF0C00F37B72 /* ShaderTest2.cpp in Sources */,
|
||||
38FA2E73194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp in Sources */,
|
||||
1AC35C6518CECF0C00F37B72 /* UnitTest.cpp in Sources */,
|
||||
29080DC9191B595E0066F8DF /* UISceneManager_Editor.cpp in Sources */,
|
||||
1AC35B3F18CECF0C00F37B72 /* Bug-458.cpp in Sources */,
|
||||
|
@ -4729,6 +4750,7 @@
|
|||
29080D8E191B595E0066F8DF /* CocosGUIScene.cpp in Sources */,
|
||||
1AC35BFA18CECF0C00F37B72 /* WebSocketTest.cpp in Sources */,
|
||||
1AC35BF218CECF0C00F37B72 /* EditBoxTest.cpp in Sources */,
|
||||
38FA2E74194AEBE100FF2BE4 /* ActionTimelineTestScene.cpp in Sources */,
|
||||
1AC35B3A18CECF0C00F37B72 /* Bug-1174.cpp in Sources */,
|
||||
1AC35BE418CECF0C00F37B72 /* CCControlColourPickerTest.cpp in Sources */,
|
||||
29080DD4191B595E0066F8DF /* UITextAtlasTest.cpp in Sources */,
|
||||
|
|
|
@ -13,4 +13,4 @@
|
|||
#include <agile.h>
|
||||
#include <concrt.h>
|
||||
#include <collection.h>
|
||||
#include "App.xaml.h"
|
||||
#include "App.xaml.h"
|
||||
|
|
|
@ -138,4 +138,4 @@ protected:
|
|||
|
||||
NS_CC_END
|
||||
|
||||
#endif //__CCCAMERA_ACTION_H__
|
||||
#endif //__CCCAMERA_ACTION_H__
|
||||
|
|
|
@ -201,4 +201,4 @@ Animation* Animation::clone() const
|
|||
return a;
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -237,4 +237,4 @@ void AnimationCache::addAnimationsWithFile(const std::string& plist)
|
|||
}
|
||||
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -160,4 +160,4 @@ FontAtlas * FontCharMap::createFontAtlas()
|
|||
return tempAtlas;
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -240,6 +240,7 @@ Label::Label(FontAtlas *atlas /* = nullptr */, TextHAlignment hAlignment /* = Te
|
|||
TextVAlignment vAlignment /* = TextVAlignment::TOP */,bool useDistanceField /* = false */,bool useA8Shader /* = false */)
|
||||
: _reusedLetter(nullptr)
|
||||
, _commonLineHeight(0.0f)
|
||||
, _additionalKerning(0.0f)
|
||||
, _lineBreakWithoutSpaces(false)
|
||||
, _maxLineWidth(0)
|
||||
, _labelWidth(0)
|
||||
|
@ -719,19 +720,30 @@ void Label::sortAllChildren()
|
|||
|
||||
void Label::enableGlow(const Color4B& glowColor)
|
||||
{
|
||||
if(! _useDistanceField)
|
||||
return;
|
||||
_currLabelEffect = LabelEffect::GLOW;
|
||||
_effectColor = glowColor;
|
||||
_effectColorF.r = _effectColor.r / 255.0f;
|
||||
_effectColorF.g = _effectColor.g / 255.0f;
|
||||
_effectColorF.b = _effectColor.b / 255.0f;
|
||||
_effectColorF.a = _effectColor.a / 255.0f;
|
||||
updateShaderProgram();
|
||||
if (_currentLabelType == LabelType::TTF)
|
||||
{
|
||||
if (_fontConfig.distanceFieldEnabled == false)
|
||||
{
|
||||
auto config = _fontConfig;
|
||||
config.outlineSize = 0;
|
||||
config.distanceFieldEnabled = true;
|
||||
setTTFConfig(config);
|
||||
_contentDirty = true;
|
||||
}
|
||||
_currLabelEffect = LabelEffect::GLOW;
|
||||
_effectColor = glowColor;
|
||||
_effectColorF.r = _effectColor.r / 255.0f;
|
||||
_effectColorF.g = _effectColor.g / 255.0f;
|
||||
_effectColorF.b = _effectColor.b / 255.0f;
|
||||
_effectColorF.a = _effectColor.a / 255.0f;
|
||||
updateShaderProgram();
|
||||
}
|
||||
}
|
||||
|
||||
void Label::enableOutline(const Color4B& outlineColor,int outlineSize /* = -1 */)
|
||||
{
|
||||
CCASSERT(_currentLabelType == LabelType::STRING_TEXTURE || _currentLabelType == LabelType::TTF, "Only supported system font and TTF!");
|
||||
|
||||
_effectColor = outlineColor;
|
||||
_effectColorF.r = _effectColor.r / 255.0f;
|
||||
_effectColorF.g = _effectColor.g / 255.0f;
|
||||
|
@ -1098,7 +1110,9 @@ void Label::visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t pare
|
|||
|
||||
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
|
||||
|
||||
setOrderOfArrival(0);
|
||||
// FIX ME: Why need to set _orderOfArrival to 0??
|
||||
// Please refer to https://github.com/cocos2d/cocos2d-x/pull/6920
|
||||
// setOrderOfArrival(0);
|
||||
}
|
||||
|
||||
void Label::setSystemFontName(const std::string& systemFont)
|
||||
|
@ -1163,9 +1177,38 @@ Sprite * Label::getLetter(int letterIndex)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
int Label::getCommonLineHeight() const
|
||||
void Label::setLineHeight(float height)
|
||||
{
|
||||
return _textSprite ? 0 : _commonLineHeight;
|
||||
CCASSERT(_currentLabelType != LabelType::STRING_TEXTURE, "Not supported system font!");
|
||||
|
||||
if (_commonLineHeight != height)
|
||||
{
|
||||
_commonLineHeight = height;
|
||||
_contentDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
float Label::getLineHeight() const
|
||||
{
|
||||
CCASSERT(_currentLabelType != LabelType::STRING_TEXTURE, "Not supported system font!");
|
||||
return _textSprite ? 0.0f : _commonLineHeight;
|
||||
}
|
||||
|
||||
void Label::setAdditionalKerning(float space)
|
||||
{
|
||||
CCASSERT(_currentLabelType != LabelType::STRING_TEXTURE, "Not supported system font!");
|
||||
if (_additionalKerning != space)
|
||||
{
|
||||
_additionalKerning = space;
|
||||
_contentDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
float Label::getAdditionalKerning() const
|
||||
{
|
||||
CCASSERT(_currentLabelType != LabelType::STRING_TEXTURE, "Not supported system font!");
|
||||
|
||||
return _additionalKerning;
|
||||
}
|
||||
|
||||
void Label::computeStringNumLines()
|
||||
|
@ -1247,6 +1290,8 @@ void Label::updateDisplayedOpacity(GLubyte parentOpacity)
|
|||
|
||||
void Label::setTextColor(const Color4B &color)
|
||||
{
|
||||
CCASSERT(_currentLabelType == LabelType::TTF || _currentLabelType == LabelType::STRING_TEXTURE, "Only supported system font and ttf!");
|
||||
|
||||
_textColor = color;
|
||||
_textColorF.r = _textColor.r / 255.0f;
|
||||
_textColorF.g = _textColor.g / 255.0f;
|
||||
|
|
|
@ -91,6 +91,7 @@ public:
|
|||
|
||||
/** Creates a label with an initial string,font file,font size, dimension in points, horizontal alignment and vertical alignment.
|
||||
* @warning Not support font name.
|
||||
* @warning Cache textures for each different font size or font file.
|
||||
*/
|
||||
static Label * createWithTTF(const std::string& text, const std::string& fontFile, float fontSize,
|
||||
const Size& dimensions = Size::ZERO, TextHAlignment hAlignment = TextHAlignment::LEFT,
|
||||
|
@ -98,6 +99,8 @@ public:
|
|||
|
||||
/** Create a label with TTF configuration
|
||||
* @warning Not support font name.
|
||||
* @warning Cache textures for each different font file when enable distance field.
|
||||
* @warning Cache textures for each different font size or font file when disable distance field.
|
||||
*/
|
||||
static Label* createWithTTF(const TTFConfig& ttfConfig, const std::string& text, TextHAlignment alignment = TextHAlignment::LEFT, int maxLineWidth = 0);
|
||||
|
||||
|
@ -136,6 +139,17 @@ public:
|
|||
|
||||
virtual const std::string& getString() const override { return _originalUTF8String; }
|
||||
|
||||
/** Sets the text color of the label
|
||||
* Only support for TTF and system font
|
||||
* @warning Different from the color of Node.
|
||||
*/
|
||||
virtual void setTextColor(const Color4B &color);
|
||||
/** Returns the text color of this label
|
||||
* Only support for TTF and system font
|
||||
* @warning Different from the color of Node.
|
||||
*/
|
||||
const Color4B& getTextColor() const { return _textColor;}
|
||||
|
||||
/**
|
||||
* Enable shadow for the label
|
||||
*
|
||||
|
@ -193,22 +207,34 @@ public:
|
|||
/** update content immediately.*/
|
||||
virtual void updateContent();
|
||||
|
||||
/** Sets the text color
|
||||
*
|
||||
*/
|
||||
virtual void setTextColor(const Color4B &color);
|
||||
|
||||
const Color4B& getTextColor() const { return _textColor;}
|
||||
|
||||
virtual Sprite * getLetter(int lettetIndex);
|
||||
|
||||
/** clip upper and lower margin for reduce height of label.
|
||||
*/
|
||||
void setClipMarginEnabled(bool clipEnabled) { _clipEnabled = clipEnabled; }
|
||||
bool isClipMarginEnabled() const { return _clipEnabled; }
|
||||
// font related stuff
|
||||
int getCommonLineHeight() const;
|
||||
|
||||
|
||||
/** Sets the line height of the label
|
||||
@warning Not support system font
|
||||
@since v3.2.0
|
||||
*/
|
||||
void setLineHeight(float height);
|
||||
/** Returns the line height of this label
|
||||
@warning Not support system font
|
||||
*/
|
||||
float getLineHeight() const;
|
||||
|
||||
/** Sets the additional kerning of the label
|
||||
@warning Not support system font
|
||||
@since v3.2.0
|
||||
*/
|
||||
void setAdditionalKerning(float space);
|
||||
/** Returns the additional kerning of this label
|
||||
@warning Not support system font
|
||||
@since v3.2.0
|
||||
*/
|
||||
float getAdditionalKerning() const;
|
||||
|
||||
// string related stuff
|
||||
int getStringNumLines() const { return _currNumLines;}
|
||||
int getStringLength() const;
|
||||
|
@ -247,6 +273,8 @@ public:
|
|||
CC_DEPRECATED_ATTRIBUTE virtual void setFontDefinition(const FontDefinition& textDefinition);
|
||||
CC_DEPRECATED_ATTRIBUTE const FontDefinition& getFontDefinition() const { return _fontDefinition; }
|
||||
|
||||
CC_DEPRECATED_ATTRIBUTE int getCommonLineHeight() const { return getLineHeight();}
|
||||
|
||||
protected:
|
||||
void onDraw(const Mat4& transform, bool transformUpdated);
|
||||
|
||||
|
@ -331,6 +359,7 @@ protected:
|
|||
Rect _reusedRect;
|
||||
int _limitShowCount;
|
||||
|
||||
float _additionalKerning;
|
||||
float _commonLineHeight;
|
||||
bool _lineBreakWithoutSpaces;
|
||||
int * _horizontalKernings;
|
||||
|
|
|
@ -384,7 +384,7 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
|
|||
continue;
|
||||
}
|
||||
|
||||
nextFontPositionX += charAdvance + kernings[i];
|
||||
nextFontPositionX += charAdvance + kernings[i] + theLabel->_additionalKerning;
|
||||
|
||||
if (longestLine < nextFontPositionX)
|
||||
{
|
||||
|
|
|
@ -1210,6 +1210,11 @@ void Node::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t paren
|
|||
}
|
||||
|
||||
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
|
||||
|
||||
// FIX ME: Why need to set _orderOfArrival to 0??
|
||||
// Please refer to https://github.com/cocos2d/cocos2d-x/pull/6920
|
||||
// reset for next frame
|
||||
// _orderOfArrival = 0;
|
||||
}
|
||||
|
||||
Mat4 Node::transform(const Mat4& parentTransform)
|
||||
|
|
|
@ -74,4 +74,4 @@ private:
|
|||
};
|
||||
NS_CC_END
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -162,7 +162,9 @@ void SpriteBatchNode::visit(Renderer *renderer, const Mat4 &parentTransform, uin
|
|||
draw(renderer, _modelViewTransform, flags);
|
||||
|
||||
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
|
||||
setOrderOfArrival(0);
|
||||
// FIX ME: Why need to set _orderOfArrival to 0??
|
||||
// Please refer to https://github.com/cocos2d/cocos2d-x/pull/6920
|
||||
// setOrderOfArrival(0);
|
||||
|
||||
CC_PROFILER_STOP_CATEGORY(kProfilerCategoryBatchSprite, "CCSpriteBatchNode - visit");
|
||||
}
|
||||
|
|
|
@ -110,4 +110,4 @@ protected:
|
|||
|
||||
NS_CC_END
|
||||
|
||||
#endif //__CCTMX_OBJECT_GROUP_H__
|
||||
#endif //__CCTMX_OBJECT_GROUP_H__
|
||||
|
|
|
@ -178,6 +178,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\gles\prebuilt\*.*" "$(Ou
|
|||
<ClCompile Include="..\3d\CCAnimate3D.cpp" />
|
||||
<ClCompile Include="..\3d\CCAnimation3D.cpp" />
|
||||
<ClCompile Include="..\3d\CCBundle3D.cpp" />
|
||||
<ClCompile Include="..\3d\CCBundleReader.cpp" />
|
||||
<ClCompile Include="..\3d\CCMesh.cpp" />
|
||||
<ClCompile Include="..\3d\CCMeshSkin.cpp" />
|
||||
<ClCompile Include="..\3d\CCObjLoader.cpp" />
|
||||
|
@ -356,6 +357,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\gles\prebuilt\*.*" "$(Ou
|
|||
<ClInclude Include="..\3d\CCAnimationCurve.h" />
|
||||
<ClInclude Include="..\3d\CCBundle3D.h" />
|
||||
<ClInclude Include="..\3d\CCBundle3DData.h" />
|
||||
<ClInclude Include="..\3d\CCBundleReader.h" />
|
||||
<ClInclude Include="..\3d\CCMesh.h" />
|
||||
<ClInclude Include="..\3d\CCMeshSkin.h" />
|
||||
<ClInclude Include="..\3d\CCObjLoader.h" />
|
||||
|
|
|
@ -580,6 +580,9 @@
|
|||
<ClCompile Include="..\3d\CCSprite3DMaterial.cpp">
|
||||
<Filter>3d</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\3d\CCBundleReader.cpp">
|
||||
<Filter>3d</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\physics\CCPhysicsBody.h">
|
||||
|
@ -1180,6 +1183,9 @@
|
|||
<ClInclude Include="..\3d\CCSprite3DMaterial.h">
|
||||
<Filter>3d</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\3d\CCBundleReader.h">
|
||||
<Filter>3d</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\math\Mat4.inl">
|
||||
|
|
|
@ -27,7 +27,22 @@
|
|||
#include "base/ccMacros.h"
|
||||
#include "platform/CCFileUtils.h"
|
||||
#include "renderer/CCGLProgram.h"
|
||||
#include "CCBundleReader.h"
|
||||
#include "base/CCData.h"
|
||||
|
||||
#define BUNDLE_TYPE_SCENE 1
|
||||
#define BUNDLE_TYPE_NODE 2
|
||||
#define BUNDLE_TYPE_ANIMATIONS 3
|
||||
#define BUNDLE_TYPE_ANIMATION 4
|
||||
#define BUNDLE_TYPE_ANIMATION_CHANNEL 5
|
||||
#define BUNDLE_TYPE_MODEL 10
|
||||
#define BUNDLE_TYPE_MATERIAL 16
|
||||
#define BUNDLE_TYPE_EFFECT 18
|
||||
#define BUNDLE_TYPE_CAMERA 32
|
||||
#define BUNDLE_TYPE_LIGHT 33
|
||||
#define BUNDLE_TYPE_MESH 34
|
||||
#define BUNDLE_TYPE_MESHPART 35
|
||||
#define BUNDLE_TYPE_MESHSKIN 36
|
||||
|
||||
NS_CC_BEGIN
|
||||
|
||||
|
@ -58,27 +73,6 @@ void getChildMap(std::map<int, std::vector<int> >& map, SkinData* skinData, cons
|
|||
}
|
||||
}
|
||||
|
||||
void getChildMapT(std::map<std::string, std::vector<std::string> >& map, const SkinData* skinData, const rapidjson::Value& val)
|
||||
{
|
||||
if (!skinData)
|
||||
return;
|
||||
|
||||
if (!val.HasMember("children"))
|
||||
return;
|
||||
|
||||
std::string parent_name = val["id"].GetString();
|
||||
const rapidjson::Value& children = val["children"];
|
||||
for (rapidjson::SizeType i = 0; i < children.Size(); i++)
|
||||
{
|
||||
const rapidjson::Value& child = children[i];
|
||||
std::string child_name = child["id"].GetString();
|
||||
|
||||
map[parent_name].push_back(child_name);
|
||||
|
||||
getChildMapT(map, skinData, child);
|
||||
}
|
||||
}
|
||||
|
||||
Bundle3D* Bundle3D::_instance = nullptr;
|
||||
|
||||
Bundle3D* Bundle3D::getInstance()
|
||||
|
@ -93,30 +87,108 @@ void Bundle3D::destroyInstance()
|
|||
CC_SAFE_DELETE(_instance);
|
||||
}
|
||||
|
||||
void Bundle3D::clearBuffer()
|
||||
{
|
||||
CC_SAFE_DELETE_ARRAY(_jsonBuffer);
|
||||
CC_SAFE_DELETE(_binaryBuffer);
|
||||
}
|
||||
|
||||
bool Bundle3D::load(const std::string& path)
|
||||
{
|
||||
if (_path == path)
|
||||
return true;
|
||||
|
||||
getModelPath(path);
|
||||
getModelRelativePath(path);
|
||||
|
||||
bool ret = false;
|
||||
std::string ext = path.substr(path.length() - 4, 4);
|
||||
std::transform(ext.begin(), ext.end(), ext.begin(), tolower);
|
||||
if (ext == ".c3t")
|
||||
{
|
||||
_isBinary = false;
|
||||
ret = loadJson(path);
|
||||
}
|
||||
else if (ext == ".c3b")
|
||||
{
|
||||
_isBinary = true;
|
||||
ret = loadBinary(path);
|
||||
}
|
||||
else
|
||||
{
|
||||
CCLOGINFO("%s is invalid file formate", path);
|
||||
}
|
||||
|
||||
ret?(_path = path):(_path = "");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadMeshData(const std::string& id, MeshData* meshdata)
|
||||
{
|
||||
if (_isBinary)
|
||||
{
|
||||
return loadMeshDataBinary(meshdata);
|
||||
}
|
||||
else
|
||||
{
|
||||
return loadMeshDataJson(meshdata);
|
||||
}
|
||||
}
|
||||
|
||||
bool Bundle3D::loadSkinData(const std::string& id, SkinData* skindata)
|
||||
{
|
||||
if (_isBinary)
|
||||
{
|
||||
return loadSkinDataBinary(skindata);
|
||||
}
|
||||
else
|
||||
{
|
||||
return loadSkinDataJson(skindata);
|
||||
}
|
||||
}
|
||||
|
||||
bool Bundle3D::loadMaterialData(const std::string& id, MaterialData* materialdata)
|
||||
{
|
||||
if (_isBinary)
|
||||
{
|
||||
return loadMaterialDataBinary(materialdata);
|
||||
}
|
||||
else
|
||||
{
|
||||
return loadMaterialDataJson(materialdata);
|
||||
}
|
||||
}
|
||||
|
||||
bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animationdata)
|
||||
{
|
||||
if (_isBinary)
|
||||
{
|
||||
return loadAnimationDataBinary(animationdata);
|
||||
}
|
||||
else
|
||||
{
|
||||
return loadAnimationDataJson(animationdata);
|
||||
}
|
||||
}
|
||||
|
||||
bool Bundle3D::loadJson(const std::string& path)
|
||||
{
|
||||
std::string strFileString = FileUtils::getInstance()->getStringFromFile(path);
|
||||
ssize_t size = strFileString.length();
|
||||
CC_SAFE_DELETE_ARRAY(_documentBuffer);
|
||||
_documentBuffer = new char[size + 1];
|
||||
memcpy(_documentBuffer, strFileString.c_str(), size);
|
||||
_documentBuffer[size] = '\0';
|
||||
if (_document.ParseInsitu<0>(_documentBuffer).HasParseError())
|
||||
CC_SAFE_DELETE_ARRAY(_jsonBuffer);
|
||||
_jsonBuffer = new char[size + 1];
|
||||
memcpy(_jsonBuffer, strFileString.c_str(), size);
|
||||
_jsonBuffer[size] = '\0';
|
||||
if (_document.ParseInsitu<0>(_jsonBuffer).HasParseError())
|
||||
{
|
||||
assert(0);
|
||||
CC_SAFE_DELETE_ARRAY(_documentBuffer);
|
||||
_path = "";
|
||||
CC_SAFE_DELETE_ARRAY(_jsonBuffer);
|
||||
return false;
|
||||
}
|
||||
_path = path;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadMeshData(const std::string& id, MeshData* meshdata)
|
||||
bool Bundle3D::loadMeshDataJson(MeshData* meshdata)
|
||||
{
|
||||
meshdata->resetData();
|
||||
|
||||
|
@ -160,15 +232,15 @@ bool Bundle3D::loadMeshData(const std::string& id, MeshData* meshdata)
|
|||
const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i];
|
||||
|
||||
meshdata->attribs[i].size = mesh_vertex_attribute_val["size"].GetUint();
|
||||
meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * parseGLTypeSize(mesh_vertex_attribute_val["type"].GetString());
|
||||
meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4;
|
||||
meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val["type"].GetString());
|
||||
meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val["attribute"].GetString());
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadSkinData(const std::string& id, SkinData* skindata)
|
||||
bool Bundle3D::loadSkinDataJson(SkinData* skindata)
|
||||
{
|
||||
if (!_document.HasMember("skin")) return false;
|
||||
|
||||
|
@ -205,7 +277,7 @@ bool Bundle3D::loadSkinData(const std::string& id, SkinData* skindata)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadMaterialData(const std::string& id, MaterialData* materialdata)
|
||||
bool Bundle3D::loadMaterialDataJson(MaterialData* materialdata)
|
||||
{
|
||||
if (!_document.HasMember("material"))
|
||||
return false;
|
||||
|
@ -223,7 +295,7 @@ bool Bundle3D::loadMaterialData(const std::string& id, MaterialData* materialdat
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animationdata)
|
||||
bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata)
|
||||
{
|
||||
if (!_document.HasMember("animation")) return false;
|
||||
|
||||
|
@ -282,6 +354,290 @@ bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animati
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadBinary(const std::string& path)
|
||||
{
|
||||
// get file data
|
||||
CC_SAFE_DELETE(_binaryBuffer);
|
||||
_binaryBuffer = new Data();
|
||||
*_binaryBuffer = FileUtils::getInstance()->getDataFromFile(path);
|
||||
if (_binaryBuffer->isNull())
|
||||
{
|
||||
CCLOGINFO(false, "Failed to read file: %s", path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create bundle reader
|
||||
CC_SAFE_DELETE(_bundleReader);
|
||||
_bundleReader = BundleReader::create((char*)_binaryBuffer->getBytes(), _binaryBuffer->getSize());
|
||||
|
||||
// Read identifier info
|
||||
char identifier[] = { 'C', '3', 'B', '\0'};
|
||||
char sig[4];
|
||||
if (_bundleReader->read(sig, 1, 4) != 4 || memcmp(sig, identifier, 4) != 0)
|
||||
{
|
||||
CCLOGINFO(false, "Invalid identifier: %s", path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read version
|
||||
unsigned char ver[2];
|
||||
if (_bundleReader->read(ver, 1, 2) != 2 || ver[0] != 0 || ver[1] != 1)
|
||||
{
|
||||
CCLOGINFO(false, "Unsupported version: (%d, %d)", ver[0], ver[1]);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read ref table size
|
||||
if (_bundleReader->read(&_referenceCount, 4, 1) != 1)
|
||||
{
|
||||
CCLOGINFO("Failed to read ref table size '%s'.", path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read all refs
|
||||
CC_SAFE_DELETE_ARRAY(_references);
|
||||
_references = new Reference[_referenceCount];
|
||||
for (unsigned int i = 0; i < _referenceCount; ++i)
|
||||
{
|
||||
if ((_references[i].id = _bundleReader->readString()).empty() ||
|
||||
_bundleReader->read(&_references[i].type, 4, 1) != 1 ||
|
||||
_bundleReader->read(&_references[i].offset, 4, 1) != 1)
|
||||
{
|
||||
CCLOGINFO("Failed to read ref number %d for bundle '%s'.", i, path.c_str());
|
||||
CC_SAFE_DELETE_ARRAY(_references);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadMeshDataBinary(MeshData* meshdata)
|
||||
{
|
||||
if (!seekToFirstType(BUNDLE_TYPE_MESH))
|
||||
return false;
|
||||
|
||||
meshdata->resetData();
|
||||
|
||||
// read mesh data
|
||||
if (_bundleReader->read(&meshdata->attribCount, 4, 1) != 1 || meshdata->attribCount < 1)
|
||||
{
|
||||
CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
meshdata->attribs.resize(meshdata->attribCount);
|
||||
for (ssize_t i = 0; i < meshdata->attribCount; i++)
|
||||
{
|
||||
unsigned int vUsage, vSize;
|
||||
if (_bundleReader->read(&vUsage, 4, 1) != 1 || _bundleReader->read(&vSize, 4, 1) != 1)
|
||||
{
|
||||
CCLOGINFO("Failed to read meshdata: usage or size '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
meshdata->attribs[i].size = vSize;
|
||||
meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4;
|
||||
meshdata->attribs[i].type = GL_FLOAT;
|
||||
meshdata->attribs[i].vertexAttrib = vUsage;
|
||||
}
|
||||
|
||||
// Read vertex data
|
||||
if (_bundleReader->read(&meshdata->vertexSizeInFloat, 4, 1) != 1 || meshdata->vertexSizeInFloat == 0)
|
||||
{
|
||||
CCLOGINFO("Failed to read meshdata: vertexSizeInFloat '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
meshdata->vertex.resize(meshdata->vertexSizeInFloat);
|
||||
if (_bundleReader->read(&meshdata->vertex[0], 4, meshdata->vertexSizeInFloat) != meshdata->vertexSizeInFloat)
|
||||
{
|
||||
CCLOGINFO("Failed to read meshdata: vertex element '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read index data
|
||||
unsigned int meshPartCount = 1;
|
||||
//_bundleReader->read(&meshPartCount, 4, 1);
|
||||
|
||||
for (unsigned int i = 0; i < meshPartCount; ++i)
|
||||
{
|
||||
unsigned int nIndexCount;
|
||||
if (_bundleReader->read(&nIndexCount, 4, 1) != 1)
|
||||
{
|
||||
CCLOGINFO("Failed to read meshdata: nIndexCount '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
meshdata->numIndex = nIndexCount;
|
||||
meshdata->indices.resize(meshdata->numIndex);
|
||||
if (_bundleReader->read(&meshdata->indices[0], 2, meshdata->numIndex) != nIndexCount)
|
||||
{
|
||||
CCLOGINFO("Failed to read meshdata: indices '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadSkinDataBinary(SkinData* skindata)
|
||||
{
|
||||
if (!seekToFirstType(BUNDLE_TYPE_MESHSKIN))
|
||||
return false;
|
||||
|
||||
skindata->resetData();
|
||||
|
||||
// transform
|
||||
float bindShape[16];
|
||||
if (!_bundleReader->readMatrix(bindShape))
|
||||
{
|
||||
CCLOGINFO("Failed to read SkinData: bindShape matrix '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// bone count
|
||||
unsigned int boneNum;
|
||||
if (!_bundleReader->read(&boneNum))
|
||||
{
|
||||
CCLOGINFO("Failed to read SkinData: boneNum '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// bone names and bind pos
|
||||
float bindpos[16];
|
||||
for (unsigned int i = 0; i < boneNum; i++)
|
||||
{
|
||||
skindata->boneNames.push_back(_bundleReader->readString());
|
||||
if (!_bundleReader->readMatrix(bindpos))
|
||||
{
|
||||
CCLOGINFO("Failed to load SkinData: bindpos '%s'.", _path.c_str());
|
||||
return NULL;
|
||||
}
|
||||
skindata->inverseBindPoseMatrices.push_back(bindpos);
|
||||
}
|
||||
|
||||
// bind shape
|
||||
bindShape[16];
|
||||
_bundleReader->readMatrix(bindShape);
|
||||
|
||||
// read parent and child relationship map
|
||||
float transform[16];
|
||||
unsigned int linkNum;
|
||||
_bundleReader->read(&linkNum);
|
||||
for (unsigned int i = 0; i < linkNum; ++i)
|
||||
{
|
||||
std::string id = _bundleReader->readString();
|
||||
int index = skindata->getBoneNameIndex(id);
|
||||
|
||||
if (index >= 0 && skindata->rootBoneIndex < 0)
|
||||
skindata->rootBoneIndex = index;
|
||||
|
||||
std::string parentid = _bundleReader->readString();
|
||||
int parentIndex = skindata->getBoneNameIndex(parentid);
|
||||
|
||||
if (!_bundleReader->readMatrix(transform))
|
||||
{
|
||||
CCLOGINFO("Failed to load SkinData: transform '%s'.", _path.c_str());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (parentIndex < 0 || index < 0)
|
||||
continue;
|
||||
|
||||
skindata->boneChild[parentIndex].push_back(index);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadMaterialDataBinary(MaterialData* materialdata)
|
||||
{
|
||||
if (!seekToFirstType(BUNDLE_TYPE_MATERIAL))
|
||||
return false;
|
||||
|
||||
std::string texturePath = _bundleReader->readString();
|
||||
if (texturePath.empty())
|
||||
{
|
||||
CCLOGINFO("Failed to read Materialdata: texturePath is empty '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
materialdata->texturePath = _modelRelativePath + texturePath;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Bundle3D::loadAnimationDataBinary(Animation3DData* animationdata)
|
||||
{
|
||||
if (!seekToFirstType(BUNDLE_TYPE_ANIMATIONS))
|
||||
return false;
|
||||
|
||||
animationdata->_rotationKeys.clear();
|
||||
animationdata->_scaleKeys.clear();
|
||||
animationdata->_translationKeys.clear();
|
||||
|
||||
std::string id = _bundleReader->readString();
|
||||
|
||||
if (!_bundleReader->read(&animationdata->_totalTime))
|
||||
{
|
||||
CCLOGINFO("Failed to read AnimationData: totalTime '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned int animNum;
|
||||
if (!_bundleReader->read(&animNum))
|
||||
{
|
||||
CCLOGINFO("Failed to read AnimationData: animNum '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < animNum; ++i)
|
||||
{
|
||||
std::string boneName = _bundleReader->readString();
|
||||
unsigned int keyframeNum;
|
||||
if (!_bundleReader->read(&keyframeNum))
|
||||
{
|
||||
CCLOGINFO("Failed to read AnimationData: keyframeNum '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
for (unsigned int j = 0; j < keyframeNum; ++j)
|
||||
{
|
||||
float keytime;
|
||||
if (!_bundleReader->read(&keytime))
|
||||
{
|
||||
CCLOGINFO("Failed to read AnimationData: keytime '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
Quaternion rotate;
|
||||
if (_bundleReader->read(&rotate, 4, 4) != 4)
|
||||
{
|
||||
CCLOGINFO("Failed to read AnimationData: rotate '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
animationdata->_rotationKeys[boneName].push_back(Animation3DData::QuatKey(keytime, rotate));
|
||||
|
||||
Vec3 scale;
|
||||
if (_bundleReader->read(&scale, 4, 3) != 3)
|
||||
{
|
||||
CCLOGINFO("Failed to read AnimationData: scale '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
animationdata->_scaleKeys[boneName].push_back(Animation3DData::Vec3Key(keytime, scale));
|
||||
|
||||
Vec3 position;
|
||||
if (_bundleReader->read(&position, 4, 3) != 3)
|
||||
{
|
||||
CCLOGINFO("Failed to read AnimationData: position '%s'.", _path.c_str());
|
||||
return false;
|
||||
}
|
||||
animationdata->_translationKeys[boneName].push_back(Animation3DData::Vec3Key(keytime, position));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
GLenum Bundle3D::parseGLType(const std::string& str)
|
||||
{
|
||||
if (str == "GL_FLOAT")
|
||||
|
@ -299,23 +655,6 @@ GLenum Bundle3D::parseGLType(const std::string& str)
|
|||
}
|
||||
}
|
||||
|
||||
unsigned int Bundle3D::parseGLTypeSize(const std::string& str)
|
||||
{
|
||||
if (str == "GL_FLOAT")
|
||||
{
|
||||
return sizeof(float);
|
||||
}
|
||||
else if (str == "GL_UNSIGNED_INT")
|
||||
{
|
||||
return sizeof(unsigned int);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Bundle3D::parseGLProgramAttribute(const std::string& str)
|
||||
{
|
||||
if (str == "VERTEX_ATTRIB_POSITION")
|
||||
|
@ -349,7 +688,7 @@ unsigned int Bundle3D::parseGLProgramAttribute(const std::string& str)
|
|||
}
|
||||
}
|
||||
|
||||
void Bundle3D::getModelPath(const std::string& path)
|
||||
void Bundle3D::getModelRelativePath(const std::string& path)
|
||||
{
|
||||
int index = path.find_last_of('/');
|
||||
std::string fullModelPath;
|
||||
|
@ -366,19 +705,44 @@ void Bundle3D::getModelPath(const std::string& path)
|
|||
}
|
||||
}
|
||||
|
||||
Reference* Bundle3D::seekToFirstType(unsigned int type)
|
||||
{
|
||||
// for each Reference
|
||||
for (unsigned int i = 0; i < _referenceCount; ++i)
|
||||
{
|
||||
Reference* ref = &_references[i];
|
||||
if (ref->type == type)
|
||||
{
|
||||
// Found a match
|
||||
if (_bundleReader->seek(ref->offset, SEEK_SET) == false)
|
||||
{
|
||||
CCLOGINFO("Failed to seek to object '%s' in bundle '%s'.", ref->id.c_str(), _path.c_str());
|
||||
return NULL;
|
||||
}
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Bundle3D::Bundle3D()
|
||||
:_isBinary(false)
|
||||
,_modelRelativePath("")
|
||||
,_documentBuffer(nullptr)
|
||||
,_path("")
|
||||
:_isBinary(false),
|
||||
_modelRelativePath(""),
|
||||
_jsonBuffer(NULL),
|
||||
_path(""),
|
||||
_referenceCount(0),
|
||||
_bundleReader(NULL),
|
||||
_references(NULL),
|
||||
_binaryBuffer(NULL)
|
||||
{
|
||||
|
||||
}
|
||||
Bundle3D::~Bundle3D()
|
||||
{
|
||||
CC_SAFE_DELETE_ARRAY(_documentBuffer);
|
||||
CC_SAFE_DELETE_ARRAY(_jsonBuffer);
|
||||
CC_SAFE_DELETE_ARRAY(_bundleReader);
|
||||
CC_SAFE_DELETE_ARRAY(_references);
|
||||
CC_SAFE_DELETE(_binaryBuffer);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_CC_END
|
||||
|
|
|
@ -36,6 +36,9 @@
|
|||
#include "json/document.h"
|
||||
|
||||
NS_CC_BEGIN
|
||||
class BundleReader;
|
||||
class Animation3D;
|
||||
class Data;
|
||||
|
||||
/**
|
||||
* Defines a bundle file that contains a collection of assets. Mesh, Material, MeshSkin, Animation
|
||||
|
@ -51,6 +54,8 @@ public:
|
|||
|
||||
static void destroyInstance();
|
||||
|
||||
void clearBuffer();
|
||||
|
||||
/**
|
||||
* load a file. You must load a file first, then call loadMeshData, loadSkinData, and so on
|
||||
* @param path File to be loaded
|
||||
|
@ -81,17 +86,75 @@ public:
|
|||
* @param id The ID of the animation, load the first animation in the bundle if it is empty
|
||||
*/
|
||||
bool loadAnimationData(const std::string& id, Animation3DData* animationdata);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
bool loadJson(const std::string& path);
|
||||
|
||||
bool loadMeshDataJson(MeshData* meshdata);
|
||||
|
||||
bool loadSkinDataJson(SkinData* skindata);
|
||||
|
||||
bool loadMaterialDataJson(MaterialData* materialdata);
|
||||
|
||||
bool loadAnimationDataJson(Animation3DData* animationdata);
|
||||
|
||||
/**
|
||||
* load data in binary
|
||||
* @param path The c3b file path
|
||||
*/
|
||||
bool loadBinary(const std::string& path);
|
||||
|
||||
/**
|
||||
* load mesh data in binary
|
||||
* @param meshdata The mesh data pointer
|
||||
*/
|
||||
bool loadMeshDataBinary(MeshData* meshdata);
|
||||
|
||||
/**
|
||||
* load skin data in binary
|
||||
* @param skindata The skin data pointer
|
||||
*/
|
||||
bool loadSkinDataBinary(SkinData* skindata);
|
||||
|
||||
/**
|
||||
* load material data in binary
|
||||
* @param materialdata The material pointer
|
||||
*/
|
||||
bool loadMaterialDataBinary(MaterialData* materialdata);
|
||||
|
||||
/**
|
||||
* load animation data in binary
|
||||
* @param animationdata The animation data pointer
|
||||
*/
|
||||
bool loadAnimationDataBinary(Animation3DData* animationdata);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* get define data type
|
||||
* @param str The type in string
|
||||
*/
|
||||
GLenum parseGLType(const std::string& str);
|
||||
|
||||
unsigned int parseGLTypeSize(const std::string& str);
|
||||
|
||||
/**
|
||||
* get vertex attribute type
|
||||
* @param str The type in string
|
||||
*/
|
||||
unsigned int parseGLProgramAttribute(const std::string& str);
|
||||
|
||||
// get model path
|
||||
void getModelPath(const std::string& path);
|
||||
/*
|
||||
* get model path
|
||||
* @param str Full path of model file
|
||||
*/
|
||||
void getModelRelativePath(const std::string& path);
|
||||
|
||||
/*
|
||||
* set the read position in buffer to the target type
|
||||
* @param The data type
|
||||
*/
|
||||
Reference* seekToFirstType(unsigned int type);
|
||||
|
||||
protected:
|
||||
CC_CONSTRUCTOR_ACCESS:
|
||||
Bundle3D();
|
||||
~Bundle3D();
|
||||
|
@ -102,11 +165,15 @@ protected:
|
|||
|
||||
std::string _modelRelativePath;
|
||||
|
||||
char* _documentBuffer;
|
||||
char* _jsonBuffer;
|
||||
std::string _path;
|
||||
|
||||
rapidjson::Document _document;
|
||||
|
||||
BundleReader* _bundleReader;
|
||||
unsigned int _referenceCount;
|
||||
Reference* _references;
|
||||
Data* _binaryBuffer;
|
||||
|
||||
bool _isBinary;
|
||||
};
|
||||
|
||||
|
|
|
@ -34,7 +34,27 @@
|
|||
|
||||
NS_CC_BEGIN
|
||||
|
||||
/**mesh vertex attribute*/
|
||||
// vertex usage elements.
|
||||
enum Vertex_Usage
|
||||
{
|
||||
Vertex_Usage_POSITION = 1,
|
||||
Vertex_Usage_NORMAL = 2,
|
||||
Vertex_Usage_COLOR = 3,
|
||||
Vertex_Usage_TANGENT = 4,
|
||||
Vertex_Usage_BINORMAL = 5,
|
||||
Vertex_Usage_BLENDWEIGHTS = 6,
|
||||
Vertex_Usage_BLENDINDICES = 7,
|
||||
Vertex_Usage_TEXCOORD0 = 8,
|
||||
Vertex_Usage_TEXCOORD1 = 9,
|
||||
Vertex_Usage_TEXCOORD2 = 10,
|
||||
Vertex_Usage_TEXCOORD3 = 11,
|
||||
Vertex_Usage_TEXCOORD4 = 12,
|
||||
Vertex_Usage_TEXCOORD5 = 13,
|
||||
Vertex_Usage_TEXCOORD6 = 14,
|
||||
Vertex_Usage_TEXCOORD7 = 15
|
||||
};
|
||||
|
||||
//mesh vertex attribute
|
||||
struct MeshVertexAttrib
|
||||
{
|
||||
//attribute size
|
||||
|
@ -47,7 +67,6 @@ struct MeshVertexAttrib
|
|||
int attribSizeBytes;
|
||||
};
|
||||
|
||||
/**mesh data*/
|
||||
struct MeshData
|
||||
{
|
||||
std::vector<float> vertex;
|
||||
|
@ -79,25 +98,17 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/**skin data*/
|
||||
struct SkinData
|
||||
{
|
||||
std::vector<std::string> skinBoneNames; //skin bones affect skin
|
||||
std::vector<std::string> nodeBoneNames; //node bones don't affect skin, all bones [skinBone, nodeBone]
|
||||
std::vector<Mat4> inverseBindPoseMatrices; //bind pose of skin bone, only for skin bone
|
||||
std::vector<Mat4> skinBoneOriginMatrices; // original bone transform, for skin bone
|
||||
std::vector<Mat4> nodeBoneOriginMatrices; // original bone transform, for node bone
|
||||
std::vector<std::string> boneNames;
|
||||
std::vector<Mat4> inverseBindPoseMatrices; //bind pose of bone
|
||||
|
||||
//bone child info, both skinbone and node bone
|
||||
std::map<int, std::vector<int> > boneChild;//key parent, value child
|
||||
int rootBoneIndex;
|
||||
void resetData()
|
||||
{
|
||||
skinBoneNames.clear();
|
||||
nodeBoneNames.clear();
|
||||
boneNames.clear();
|
||||
inverseBindPoseMatrices.clear();
|
||||
skinBoneOriginMatrices.clear();
|
||||
nodeBoneOriginMatrices.clear();
|
||||
boneChild.clear();
|
||||
rootBoneIndex = -1;
|
||||
}
|
||||
|
@ -105,30 +116,22 @@ struct SkinData
|
|||
int getBoneNameIndex(const std::string& name)const
|
||||
{
|
||||
int i = 0;
|
||||
for (auto iter : skinBoneNames)
|
||||
for( const auto &item : boneNames )
|
||||
{
|
||||
if ((iter) == name)
|
||||
if (item == name)
|
||||
return i;
|
||||
i++;
|
||||
}
|
||||
for(auto iter : nodeBoneNames)
|
||||
{
|
||||
if (iter == name)
|
||||
return i;
|
||||
i++;
|
||||
else
|
||||
++i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**material data*/
|
||||
struct MaterialData
|
||||
{
|
||||
std::string texturePath;
|
||||
};
|
||||
|
||||
/**animation data*/
|
||||
struct Animation3DData
|
||||
{
|
||||
public:
|
||||
|
@ -198,6 +201,17 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class Reference
|
||||
{
|
||||
public:
|
||||
std::string id;
|
||||
unsigned int type;
|
||||
unsigned int offset;
|
||||
|
||||
Reference(){};
|
||||
|
||||
~Reference(){};
|
||||
};
|
||||
NS_CC_END
|
||||
|
||||
#endif //__CC_BUNDLE_3D_DATA_H__
|
||||
|
|
|
@ -0,0 +1,211 @@
|
|||
#include "CCBundleReader.h"
|
||||
#include "platform/CCFileUtils.h"
|
||||
|
||||
NS_CC_BEGIN
|
||||
|
||||
BundleReader::~BundleReader()
|
||||
{
|
||||
close();
|
||||
};
|
||||
|
||||
BundleReader* BundleReader::create(char* lpbuffer, unsigned int length)
|
||||
{
|
||||
if (lpbuffer)
|
||||
{
|
||||
BundleReader* stream = new BundleReader();
|
||||
stream->init(lpbuffer, length);
|
||||
return stream;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void BundleReader::close()
|
||||
{
|
||||
CC_SAFE_DELETE(m_buffer);
|
||||
}
|
||||
|
||||
size_t BundleReader::read(void* ptr, size_t size, size_t count)
|
||||
{
|
||||
if (!m_buffer || eof())
|
||||
return 0;
|
||||
|
||||
size_t validCount;
|
||||
size_t validLength = m_length - m_position;
|
||||
size_t needLength = size*count;
|
||||
char* ptr1 = (char*)ptr;
|
||||
if(validLength <= needLength)
|
||||
{
|
||||
validCount = validLength/size;
|
||||
size_t readLength = size*validCount;
|
||||
memcpy(ptr1,(char*)m_buffer+m_position,readLength);
|
||||
ptr1 += readLength;
|
||||
m_position += readLength;
|
||||
readLength = validLength - readLength;
|
||||
if(readLength>0)
|
||||
{
|
||||
memcpy(ptr1,(char*)m_buffer+m_position,readLength);
|
||||
m_position += readLength;
|
||||
validCount+=1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(ptr1,(char*)m_buffer+m_position,needLength);
|
||||
m_position += needLength;
|
||||
validCount = count;
|
||||
}
|
||||
//*ptr1 = 0;
|
||||
|
||||
return validCount;
|
||||
}
|
||||
|
||||
char* BundleReader::readLine(int num,char* line)
|
||||
{
|
||||
if (!m_buffer)
|
||||
return 0;
|
||||
|
||||
//char* str = new char[num];
|
||||
char* buffer = (char*)m_buffer+m_position;
|
||||
|
||||
char* p = line;
|
||||
char c;
|
||||
size_t readNum = 0;
|
||||
while((c=*buffer) != 10 && readNum < (size_t)num && m_position<(long int)m_length)
|
||||
{
|
||||
*p = c;
|
||||
p++;
|
||||
buffer++;
|
||||
m_position++;
|
||||
readNum++;
|
||||
}
|
||||
*p = '\0';
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
size_t BundleReader::write(const void* ptr, size_t size, size_t count)
|
||||
{
|
||||
if (!m_buffer)
|
||||
return 0;
|
||||
|
||||
size_t validCount;
|
||||
size_t validLength = m_length - m_position;
|
||||
size_t needLength = size*count;
|
||||
const char* ptr1 = (const char*)ptr;
|
||||
if (validLength <= needLength)
|
||||
{
|
||||
validCount = validLength / size;
|
||||
size_t readLength = size * validCount;
|
||||
memcpy((char*)m_buffer + m_position, ptr1, readLength);
|
||||
ptr1 += readLength;
|
||||
m_position += readLength;
|
||||
readLength = validLength - readLength;
|
||||
if(readLength > 0)
|
||||
{
|
||||
memcpy((char*)m_buffer+m_position, ptr1, readLength);
|
||||
m_position += readLength;
|
||||
validCount += 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy((char*)m_buffer + m_position, ptr1, needLength);
|
||||
m_position += needLength;
|
||||
validCount = count;
|
||||
}
|
||||
|
||||
return validCount;
|
||||
}
|
||||
|
||||
bool BundleReader::eof()
|
||||
{
|
||||
if (!m_buffer)
|
||||
return true;
|
||||
return ((size_t)tell()) >= length();
|
||||
}
|
||||
|
||||
size_t BundleReader::length()
|
||||
{
|
||||
return m_length;
|
||||
}
|
||||
|
||||
long int BundleReader::tell()
|
||||
{
|
||||
if (!m_buffer)
|
||||
return -1;
|
||||
return m_position;
|
||||
}
|
||||
|
||||
bool BundleReader::seek(long int offset, int origin)
|
||||
{
|
||||
if (!m_buffer)
|
||||
return false;
|
||||
|
||||
if(origin == SEEK_CUR)
|
||||
{
|
||||
m_position += offset;
|
||||
}
|
||||
else if(origin == SEEK_SET)
|
||||
{
|
||||
m_position = offset;
|
||||
}
|
||||
else if(origin == SEEK_END)
|
||||
{
|
||||
m_position = m_length+offset;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BundleReader::rewind()
|
||||
{
|
||||
if (m_buffer != NULL)
|
||||
{
|
||||
m_position = 0;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string BundleReader::readString()
|
||||
{
|
||||
unsigned int length;
|
||||
if(read(&length, 4, 1) != 1)
|
||||
{
|
||||
return std::string();
|
||||
}
|
||||
|
||||
std::string str;
|
||||
if (length > 0)
|
||||
{
|
||||
str.resize(length);
|
||||
if (read(&str[0], 1, length) != length)
|
||||
{
|
||||
return std::string();
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
bool BundleReader::readMatrix(float* m)
|
||||
{
|
||||
return (read(m, sizeof(float), 16) == 16);
|
||||
}
|
||||
|
||||
BundleReader::BundleReader()
|
||||
{
|
||||
m_buffer = NULL;
|
||||
m_position = 0;
|
||||
m_length = 0;
|
||||
};
|
||||
|
||||
void BundleReader::init(char* lpbuffer, unsigned int length)
|
||||
{
|
||||
m_position = 0;
|
||||
m_buffer = lpbuffer;
|
||||
m_length = length;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,213 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2014 Chukong Technologies Inc.
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CC_BUNDLE_READER_H__
|
||||
#define __CC_BUNDLE_READER_H__
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "base/CCRef.h"
|
||||
#include "base/CCPlatformMacros.h"
|
||||
#include "base/CCConsole.h"
|
||||
|
||||
NS_CC_BEGIN
|
||||
|
||||
/**
|
||||
* BundleReader is an interface for reading sequence of bytes.
|
||||
*/
|
||||
class BundleReader: public cocos2d::Ref
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Destructor
|
||||
*/
|
||||
~BundleReader();
|
||||
|
||||
/** creates an BundleReader with lpbuffer and length
|
||||
* @param lpbuffer The pointer to the file data
|
||||
* @param length The size for lpbuffer in bytes
|
||||
*/
|
||||
static BundleReader* create(char* lpbuffer, unsigned int length);
|
||||
|
||||
/**
|
||||
* Close and delete buffer
|
||||
*/
|
||||
void close();
|
||||
|
||||
/**
|
||||
* Reads an array of elements.
|
||||
*
|
||||
* @param ptr The pointer to the memory to copy into.
|
||||
* The available size should be at least bytes.
|
||||
* @param size The size of each element to be read, in bytes.
|
||||
* @param count The number of elements to read.
|
||||
*
|
||||
* @return The number of elements read.
|
||||
*/
|
||||
size_t read(void* ptr, size_t size, size_t count);
|
||||
|
||||
/**
|
||||
* Reads a line from the buffer.
|
||||
*/
|
||||
char* readLine(int num, char* line);
|
||||
|
||||
/**
|
||||
* Writes an array of elements.
|
||||
*
|
||||
* @param ptr The pointer to the array of elements to be written.
|
||||
* @param size The size of each element to be written, in bytes.
|
||||
* @param count The number of elements to write.
|
||||
*
|
||||
* @return The number of elements written.
|
||||
*/
|
||||
size_t write(const void* ptr, size_t size, size_t count);
|
||||
|
||||
/**
|
||||
* Returns true if the end of the buffer has been reached.
|
||||
*/
|
||||
bool eof();
|
||||
|
||||
/**
|
||||
* Returns the length of the buffer in bytes.
|
||||
*/
|
||||
size_t length();
|
||||
|
||||
/**
|
||||
* Returns the position of the file pointer.
|
||||
*/
|
||||
long int tell();
|
||||
|
||||
/**
|
||||
* Sets the position of the file pointer.
|
||||
*/
|
||||
bool seek(long int offset, int origin);
|
||||
|
||||
/**
|
||||
* Sets the file pointer at the start of the file.
|
||||
*/
|
||||
bool rewind();
|
||||
|
||||
/**
|
||||
* read binary typed value.
|
||||
*/
|
||||
template<typename T> bool read(T* ptr);
|
||||
template<typename T> bool readArray(unsigned int* length, std::vector<T>* values);
|
||||
|
||||
/**
|
||||
* first read length, then read string text
|
||||
*/
|
||||
std::string readString();
|
||||
bool readMatrix(float* m);
|
||||
|
||||
private:
|
||||
BundleReader();
|
||||
void init(char* lpbuffer, unsigned int length);
|
||||
|
||||
private:
|
||||
long int m_position;
|
||||
size_t m_length;
|
||||
char* m_buffer;
|
||||
};
|
||||
|
||||
// template read routines
|
||||
template<typename T>
|
||||
inline bool BundleReader::read(T *ptr)
|
||||
{
|
||||
return (read(ptr, sizeof(T), 1) == 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* template function to read array of value.
|
||||
*/
|
||||
template<typename T>
|
||||
inline bool BundleReader::readArray(unsigned int *length, std::vector<T> *values)
|
||||
{
|
||||
if (!read(length))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (*length > 0 && values)
|
||||
{
|
||||
values->resize(*length);
|
||||
if (read(&(*values)[0], sizeof(T), *length) != *length)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* specalization for char
|
||||
*/
|
||||
template<>
|
||||
inline bool BundleReader::read<char>(char *ptr)
|
||||
{
|
||||
if (read(ptr, sizeof(char), 1) == 1)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
*ptr = -1;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* specalization for std::string
|
||||
*/
|
||||
template<>
|
||||
inline bool BundleReader::read<std::string>(std::string *ptr)
|
||||
{
|
||||
CCLOG("can not read std::string, use readString() instead");
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* template function to read array of value.
|
||||
*/
|
||||
template<>
|
||||
inline bool BundleReader::readArray<std::string>(unsigned int *length, std::vector<std::string> *values)
|
||||
{
|
||||
if (!read(length))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
values->clear();
|
||||
if (*length > 0 && values)
|
||||
{
|
||||
for (int i = 0; i < (int)*length; ++i)
|
||||
{
|
||||
values->push_back(readString());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
NS_CC_END
|
||||
|
||||
#endif
|
|
@ -301,14 +301,14 @@ MeshSkin* MeshSkin::create(const std::string& filename, const std::string& name)
|
|||
bool MeshSkin::initFromSkinData(const SkinData& skindata)
|
||||
{
|
||||
ssize_t i = 0;
|
||||
for (; i < skindata.skinBoneNames.size(); i++) {
|
||||
auto bone = Bone::create(skindata.skinBoneNames[i]);
|
||||
for (; i < skindata.boneNames.size(); i++) {
|
||||
auto bone = Bone::create(skindata.boneNames[i]);
|
||||
bone->_invBindPose = skindata.inverseBindPoseMatrices[i];
|
||||
//bone->setOriPose(skindata.skinBoneOriginMatrices[i]);
|
||||
addSkinBone(bone);
|
||||
}
|
||||
for (i = 0; i < skindata.nodeBoneNames.size(); i++) {
|
||||
auto bone = Bone::create(skindata.nodeBoneNames[i]);
|
||||
for (i = 0; i < skindata.boneNames.size(); i++) {
|
||||
auto bone = Bone::create(skindata.boneNames[i]);
|
||||
//bone->setOriPose(skindata.nodeBoneOriginMatrices[i]);
|
||||
addNodeBone(bone);
|
||||
}
|
||||
|
|
|
@ -179,4 +179,4 @@ OSStatus AudioSessionGetProperty(UInt32 inID, UInt32 *ioDataSize, void *outData)
|
|||
- (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration error:(NSError**)outError {return YES;}
|
||||
|
||||
@end
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -212,4 +212,4 @@ void MediaStreamer::Restart()
|
|||
ThrowIfFailed(
|
||||
m_reader->SetCurrentPosition(GUID_NULL, var)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,4 +38,4 @@ public:
|
|||
bool GetNextBuffer(uint8* buffer, uint32 maxBufferSize, uint32* bufferLength);
|
||||
void ReadAll(uint8* buffer, uint32 maxBufferSize, uint32* bufferLength);
|
||||
void Restart();
|
||||
};
|
||||
};
|
||||
|
|
|
@ -213,4 +213,4 @@ void MediaStreamer::ReadAll(uint8* buffer, uint32 maxBufferSize, uint32* bufferL
|
|||
void MediaStreamer::Restart()
|
||||
{
|
||||
m_offset = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,4 +55,4 @@ internal:
|
|||
void Initialize(_In_ const WCHAR* url);
|
||||
void ReadAll(uint8* buffer, uint32 maxBufferSize, uint32* bufferLength);
|
||||
void Restart();
|
||||
};
|
||||
};
|
||||
|
|
|
@ -39,4 +39,4 @@ _widgetGetFocus(widgetGetFocus)
|
|||
|
||||
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#include "base/CCConsole.h"
|
||||
#include "base/CCEventListener.h"
|
||||
#include "platform/CCCommon.h"
|
||||
|
||||
|
|
|
@ -95,4 +95,4 @@ bool EventListenerFocus::checkAvailable()
|
|||
|
||||
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -109,4 +109,4 @@ bool EventListenerMouse::init()
|
|||
return false;
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -187,4 +187,4 @@ EventListenerTouchAllAtOnce* EventListenerTouchAllAtOnce::clone()
|
|||
return ret;
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -38,4 +38,4 @@ EventMouse::EventMouse(MouseEventType mouseEventCode)
|
|||
{
|
||||
};
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -70,4 +70,4 @@ Vec2 Touch::getDelta() const
|
|||
return getLocation() - getPreviousLocation();
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define __CCINTEGER_H__
|
||||
|
||||
#include "base/CCRef.h"
|
||||
#include "base/CCConsole.h"
|
||||
#include "base/CCDataVisitor.h"
|
||||
#include "platform/CCCommon.h"
|
||||
|
||||
|
|
|
@ -86,4 +86,4 @@ void CCBSequence::setChainedSequenceId(int nChainedSequenceId)
|
|||
mChainedSequenceId = nChainedSequenceId;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,4 +114,4 @@ void ControlButtonLoader::onHandlePropTypeColor3(Node * pNode, Node * pParent, c
|
|||
}
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
|
|
|
@ -27,4 +27,4 @@ void ControlLoader::onHandlePropTypeBlockControl(Node * pNode, Node * pParent, c
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,4 +50,4 @@ void LabelBMFontLoader::onHandlePropTypeText(Node * pNode, Node * pParent, const
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -80,4 +80,4 @@ void LabelTTFLoader::onHandlePropTypeSize(Node * pNode, Node * pParent, const ch
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,4 +32,4 @@ void LayerColorLoader::onHandlePropTypeBlendFunc(Node * pNode, Node * pParent, c
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,4 +42,4 @@ void LayerLoader::onHandlePropTypeCheck(Node * pNode, Node * pParent, const char
|
|||
#pragma GCC diagnostic warning "-Wdeprecated-declarations"
|
||||
#elif _MSC_VER >= 1400 //vs 2005 or higher
|
||||
#pragma warning (pop)
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -27,4 +27,4 @@ void MenuItemLoader::onHandlePropTypeCheck(Node * pNode, Node * pParent, const c
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -102,4 +102,4 @@ NodeLoaderLibrary * NodeLoaderLibrary::newDefaultNodeLoaderLibrary() {
|
|||
return ccNodeLoaderLibrary;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -137,4 +137,4 @@ void ParticleSystemQuadLoader::onHandlePropTypeTexture(Node * pNode, Node * pPar
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,4 +54,4 @@ void ScrollViewLoader::onHandlePropTypeIntegerLabeled(Node * pNode, Node * pPare
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,278 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#include "CCActionTimeline.h"
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
NS_TIMELINE_BEGIN
|
||||
|
||||
// ActionTimelineData
|
||||
ActionTimelineData* ActionTimelineData::create(int actionTag)
|
||||
{
|
||||
ActionTimelineData * ret = new ActionTimelineData();
|
||||
if (ret && ret->init(actionTag))
|
||||
{
|
||||
ret->autorelease();
|
||||
}
|
||||
else
|
||||
{
|
||||
CC_SAFE_DELETE(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ActionTimelineData::ActionTimelineData()
|
||||
: _actionTag(0)
|
||||
{
|
||||
}
|
||||
|
||||
bool ActionTimelineData::init(int actionTag)
|
||||
{
|
||||
_actionTag = actionTag;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ActionTimeline
|
||||
ActionTimeline* ActionTimeline::create()
|
||||
{
|
||||
ActionTimeline* object = new ActionTimeline();
|
||||
if (object && object->init())
|
||||
{
|
||||
object->autorelease();
|
||||
return object;
|
||||
}
|
||||
CC_SAFE_DELETE(object);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ActionTimeline::ActionTimeline()
|
||||
: _duration(0)
|
||||
, _time(0)
|
||||
, _timeSpeed(1)
|
||||
, _frameInternal(1/60.0f)
|
||||
, _playing(false)
|
||||
, _currentFrame(0)
|
||||
, _startFrame(0)
|
||||
, _endFrame(0)
|
||||
, _frameEventListener(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
ActionTimeline::~ActionTimeline()
|
||||
{
|
||||
}
|
||||
|
||||
bool ActionTimeline::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void ActionTimeline::gotoFrameAndPlay(int startIndex)
|
||||
{
|
||||
gotoFrameAndPlay(startIndex, true);
|
||||
}
|
||||
|
||||
void ActionTimeline::gotoFrameAndPlay(int startIndex, bool loop)
|
||||
{
|
||||
gotoFrameAndPlay(startIndex, _duration, loop);
|
||||
}
|
||||
|
||||
void ActionTimeline::gotoFrameAndPlay(int startIndex, int endIndex, bool loop)
|
||||
{
|
||||
_startFrame = _currentFrame = startIndex;
|
||||
_endFrame = endIndex;
|
||||
_loop = loop;
|
||||
_time = _currentFrame * _frameInternal;
|
||||
|
||||
resume();
|
||||
gotoFrame(_currentFrame);
|
||||
}
|
||||
|
||||
void ActionTimeline::gotoFrameAndPause(int startIndex)
|
||||
{
|
||||
_startFrame = _currentFrame = startIndex;
|
||||
_time = _currentFrame * _frameInternal;
|
||||
|
||||
pause();
|
||||
gotoFrame(_currentFrame);
|
||||
}
|
||||
|
||||
void ActionTimeline::pause()
|
||||
{
|
||||
_playing = false;
|
||||
}
|
||||
|
||||
void ActionTimeline::resume()
|
||||
{
|
||||
_playing = true;
|
||||
}
|
||||
|
||||
bool ActionTimeline::isPlaying() const
|
||||
{
|
||||
return _playing;
|
||||
}
|
||||
|
||||
ActionTimeline* ActionTimeline::clone() const
|
||||
{
|
||||
ActionTimeline* newAction = ActionTimeline::create();
|
||||
newAction->setDuration(_duration);
|
||||
newAction->setTimeSpeed(_timeSpeed);
|
||||
|
||||
for (auto timelines : _timelineMap)
|
||||
{
|
||||
for(auto timeline : timelines.second)
|
||||
{
|
||||
Timeline* newTimeline = timeline->clone();
|
||||
newAction->addTimeline(newTimeline);
|
||||
}
|
||||
}
|
||||
|
||||
return newAction;
|
||||
}
|
||||
|
||||
void ActionTimeline::step(float delta)
|
||||
{
|
||||
if (!_playing || _timelineMap.size() == 0 || _duration == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_time += delta * _timeSpeed;
|
||||
_currentFrame = (int)(_time / _frameInternal);
|
||||
|
||||
stepToFrame(_currentFrame);
|
||||
|
||||
if(_time > _endFrame * _frameInternal)
|
||||
{
|
||||
_playing = _loop;
|
||||
if(!_playing)
|
||||
_time = _endFrame * _frameInternal;
|
||||
else
|
||||
_time = _startFrame * _frameInternal;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
typedef std::function<void(Node*)> tCallBack;
|
||||
void foreachNodeDescendant(Node* parent, tCallBack callback)
|
||||
{
|
||||
callback(parent);
|
||||
|
||||
auto children = parent->getChildren();
|
||||
for (auto child : children)
|
||||
{
|
||||
foreachNodeDescendant(child, callback);
|
||||
}
|
||||
}
|
||||
|
||||
void ActionTimeline::startWithTarget(Node *target)
|
||||
{
|
||||
Action::startWithTarget(target);
|
||||
|
||||
foreachNodeDescendant(target,
|
||||
[this, target](Node* child)
|
||||
{
|
||||
ActionTimelineData* data = dynamic_cast<ActionTimelineData*>(child->getUserObject());
|
||||
int actionTag = data->getActionTag();
|
||||
if(_timelineMap.find(actionTag) != _timelineMap.end())
|
||||
{
|
||||
auto timelines = this->_timelineMap[actionTag];
|
||||
for (auto timeline : timelines)
|
||||
{
|
||||
timeline->setNode(child);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void ActionTimeline::addTimeline(Timeline* timeline)
|
||||
{
|
||||
int tag = timeline->getActionTag();
|
||||
if (_timelineMap.find(tag) == _timelineMap.end())
|
||||
{
|
||||
_timelineMap[tag] = Vector<Timeline*>();
|
||||
}
|
||||
|
||||
if (!_timelineMap[tag].contains(timeline))
|
||||
{
|
||||
_timelineList.pushBack(timeline);
|
||||
_timelineMap[tag].pushBack(timeline);
|
||||
timeline->setActionTimeline(this);
|
||||
}
|
||||
}
|
||||
|
||||
void ActionTimeline::removeTimeline(Timeline* timeline)
|
||||
{
|
||||
int tag = timeline->getActionTag();
|
||||
if (_timelineMap.find(tag) != _timelineMap.end())
|
||||
{
|
||||
if(_timelineMap[tag].contains(timeline))
|
||||
{
|
||||
_timelineMap[tag].eraseObject(timeline);
|
||||
_timelineList.eraseObject(timeline);
|
||||
timeline->setActionTimeline(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ActionTimeline::setFrameEventCallFunc(std::function<void(Frame *)> listener)
|
||||
{
|
||||
_frameEventListener = listener;
|
||||
}
|
||||
|
||||
void ActionTimeline::clearFrameEventCallFunc()
|
||||
{
|
||||
_frameEventListener = nullptr;
|
||||
}
|
||||
|
||||
|
||||
void ActionTimeline::emitFrameEvent(Frame* frame)
|
||||
{
|
||||
if(_frameEventListener)
|
||||
{
|
||||
_frameEventListener(frame);
|
||||
}
|
||||
}
|
||||
|
||||
void ActionTimeline::gotoFrame(int frameIndex)
|
||||
{
|
||||
int size = _timelineList.size();
|
||||
for(int i = 0; i<size; i++)
|
||||
{
|
||||
_timelineList.at(i)->gotoFrame(frameIndex);
|
||||
}
|
||||
}
|
||||
|
||||
void ActionTimeline::stepToFrame(int frameIndex)
|
||||
{
|
||||
int size = _timelineList.size();
|
||||
for(int i = 0; i<size; i++)
|
||||
{
|
||||
_timelineList.at(i)->stepToFrame(frameIndex);
|
||||
}
|
||||
}
|
||||
|
||||
NS_TIMELINE_END
|
|
@ -0,0 +1,160 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CCTIMELINE_ACTION_H__
|
||||
#define __CCTIMELINE_ACTION_H__
|
||||
|
||||
#include "CCTimeLine.h"
|
||||
#include "renderer/CCRenderer.h"
|
||||
|
||||
NS_TIMELINE_BEGIN
|
||||
|
||||
class ActionTimelineData : public cocos2d::Ref
|
||||
{
|
||||
public:
|
||||
static ActionTimelineData* create(int actionTag);
|
||||
|
||||
virtual void setActionTag(int actionTag) { _actionTag = actionTag; }
|
||||
virtual int getActionTag() const { return _actionTag; }
|
||||
protected:
|
||||
ActionTimelineData();
|
||||
virtual bool init(int actionTag);
|
||||
|
||||
int _actionTag;
|
||||
};
|
||||
|
||||
|
||||
class ActionTimeline : public cocos2d::Action
|
||||
{
|
||||
public:
|
||||
friend class Frame;
|
||||
|
||||
static ActionTimeline* create();
|
||||
|
||||
ActionTimeline();
|
||||
virtual ~ActionTimeline();
|
||||
|
||||
virtual bool init();
|
||||
|
||||
/** Goto the specified frame index, and start playing from this index.
|
||||
* @param startIndex The animation will play from this index.
|
||||
*/
|
||||
virtual void gotoFrameAndPlay(int startIndex);
|
||||
|
||||
/** Goto the specified frame index, and start playing from this index.
|
||||
* @param startIndex The animation will play from this index.
|
||||
* @param loop Whether or not the animation need loop.
|
||||
*/
|
||||
virtual void gotoFrameAndPlay(int startIndex, bool loop);
|
||||
|
||||
/** Goto the specified frame index, and start playing from start index, end at end index.
|
||||
* @param startIndex The animation will play from this index.
|
||||
* @param endIndex The animation will end at this index.
|
||||
* @param loop Whether or not the animation need loop.
|
||||
*/
|
||||
virtual void gotoFrameAndPlay(int startIndex, int endIndex, bool loop);
|
||||
|
||||
/** Goto the specified frame index, and pause at this index.
|
||||
* @param startIndex The animation will pause at this index.
|
||||
*/
|
||||
virtual void gotoFrameAndPause(int startIndex);
|
||||
|
||||
/** Pause the animation. */
|
||||
virtual void pause();
|
||||
/** Resume the animation. */
|
||||
virtual void resume();
|
||||
|
||||
/** Whether or not Action is playing. */
|
||||
virtual bool isPlaying() const;
|
||||
|
||||
/** Set the animation speed, this will speed up or slow down the speed. */
|
||||
virtual void setTimeSpeed(float speed) { _timeSpeed = speed; }
|
||||
/** Get current animation speed. */
|
||||
virtual float getTimeSpeed() const { return _timeSpeed; }
|
||||
|
||||
/** duration of the whole action*/
|
||||
virtual void setDuration(int duration) { _duration = duration; }
|
||||
virtual int getDuration() const { return _duration; }
|
||||
|
||||
/** Start frame index of this action*/
|
||||
virtual int getStartFrame() const { return _startFrame; }
|
||||
|
||||
/** End frame of this action.
|
||||
* When action play to this frame, if action is not loop, then it will stop,
|
||||
* or it will play from start frame again. */
|
||||
virtual int getEndFrame() const { return _endFrame; }
|
||||
|
||||
/** Get current frame. */
|
||||
virtual int getCurrentFrame() const { return _currentFrame; }
|
||||
|
||||
/** add Timeline to ActionTimeline */
|
||||
virtual void addTimeline(Timeline* timeline);
|
||||
virtual void removeTimeline(Timeline* timeline);
|
||||
|
||||
virtual const cocos2d::Vector<Timeline*>& getTimelines() const { return _timelineList; }
|
||||
|
||||
/** Set ActionTimeline's frame event callback function */
|
||||
void setFrameEventCallFunc(std::function<void(Frame *)> listener);
|
||||
void clearFrameEventCallFunc();
|
||||
|
||||
/** Inherit from Action. */
|
||||
|
||||
/** Returns a clone of ActionTimeline */
|
||||
virtual ActionTimeline* clone() const override;
|
||||
|
||||
/** Returns a reverse of ActionTimeline.
|
||||
* Not implement yet.
|
||||
*/
|
||||
virtual ActionTimeline* reverse() const override { return nullptr; }
|
||||
|
||||
virtual void step(float delta) override;
|
||||
virtual void startWithTarget(cocos2d::Node *target) override;
|
||||
virtual bool isDone() const override { return false; }
|
||||
protected:
|
||||
virtual void gotoFrame(int frameIndex);
|
||||
virtual void stepToFrame(int frameIndex);
|
||||
|
||||
/** emit frame event, call it when enter a frame*/
|
||||
virtual void emitFrameEvent(Frame* frame);
|
||||
|
||||
std::map<int, cocos2d::Vector<Timeline*>> _timelineMap;
|
||||
cocos2d::Vector<Timeline*> _timelineList;
|
||||
|
||||
int _duration;
|
||||
double _time;
|
||||
float _timeSpeed;
|
||||
float _frameInternal;
|
||||
bool _playing;
|
||||
int _currentFrame;
|
||||
int _startFrame;
|
||||
int _endFrame;
|
||||
bool _loop;
|
||||
|
||||
std::function<void(Frame*)> _frameEventListener;
|
||||
};
|
||||
|
||||
NS_TIMELINE_END
|
||||
|
||||
|
||||
#endif /*__CCTIMELINE_ACTION_H__*/
|
|
@ -0,0 +1,374 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#include "CCActionTimelineCache.h"
|
||||
#include "CCNodeReader.h"
|
||||
#include "CCFrame.h"
|
||||
#include "CCTimeLine.h"
|
||||
#include "CCActionTimeline.h"
|
||||
|
||||
using namespace cocos2d;
|
||||
|
||||
namespace cocostudio {
|
||||
namespace timeline{
|
||||
|
||||
static const char* FrameType_VisibleFrame = "VisibleFrame";
|
||||
static const char* FrameType_PositionFrame = "PositionFrame";
|
||||
static const char* FrameType_ScaleFrame = "ScaleFrame";
|
||||
static const char* FrameType_RotationFrame = "RotationFrame";
|
||||
static const char* FrameType_SkewFrame = "SkewFrame";
|
||||
static const char* FrameType_RotationSkewFrame = "RotationSkewFrame";
|
||||
static const char* FrameType_AnchorFrame = "AnchorFrame";
|
||||
static const char* FrameType_InnerActionFrame = "InnerActionFrame";
|
||||
static const char* FrameType_ColorFrame = "ColorFrame";
|
||||
static const char* FrameType_TextureFrame = "TextureFrame";
|
||||
static const char* FrameType_EventFrame = "EventFrame";
|
||||
static const char* FrameType_ZOrderFrame = "ZOrderFrame";
|
||||
|
||||
static const char* ACTION = "action";
|
||||
static const char* DURATION = "duration";
|
||||
static const char* TIMELINES = "timelines";
|
||||
static const char* FRAME_TYPE = "frameType";
|
||||
static const char* FRAMES = "frames";
|
||||
static const char* FRAME_INDEX = "frameIndex";
|
||||
static const char* TWEEN = "tween";
|
||||
static const char* TIME_SPEED = "speed";
|
||||
static const char* ACTION_TAG = "actionTag";
|
||||
static const char* INNER_ACTION = "innerActionType";
|
||||
static const char* START_FRAME = "startFrame";
|
||||
|
||||
static const char* X = "x";
|
||||
static const char* Y = "y";
|
||||
static const char* ROTATION = "rotation";
|
||||
static const char* ALPHA = "alpha";
|
||||
static const char* RED = "red";
|
||||
static const char* GREEN = "green";
|
||||
static const char* BLUE = "blue";
|
||||
static const char* Value = "value";
|
||||
|
||||
|
||||
static ActionTimelineCache* _sharedActionCache = nullptr;
|
||||
|
||||
ActionTimelineCache* ActionTimelineCache::getInstance()
|
||||
{
|
||||
if (! _sharedActionCache)
|
||||
{
|
||||
_sharedActionCache = new ActionTimelineCache();
|
||||
_sharedActionCache->init();
|
||||
}
|
||||
|
||||
return _sharedActionCache;
|
||||
}
|
||||
|
||||
void ActionTimelineCache::destroyInstance()
|
||||
{
|
||||
CC_SAFE_DELETE(_sharedActionCache);
|
||||
}
|
||||
|
||||
void ActionTimelineCache::purge()
|
||||
{
|
||||
_animationActions.clear();
|
||||
}
|
||||
|
||||
void ActionTimelineCache::init()
|
||||
{
|
||||
using namespace std::placeholders;
|
||||
_funcs.insert(Pair(FrameType_VisibleFrame, std::bind(&ActionTimelineCache::loadVisibleFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_PositionFrame, std::bind(&ActionTimelineCache::loadPositionFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_ScaleFrame, std::bind(&ActionTimelineCache::loadScaleFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_RotationFrame, std::bind(&ActionTimelineCache::loadRotationFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_SkewFrame, std::bind(&ActionTimelineCache::loadSkewFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_RotationSkewFrame, std::bind(&ActionTimelineCache::loadRotationSkewFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_AnchorFrame, std::bind(&ActionTimelineCache::loadAnchorPointFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_InnerActionFrame, std::bind(&ActionTimelineCache::loadInnerActionFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_ColorFrame, std::bind(&ActionTimelineCache::loadColorFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_TextureFrame, std::bind(&ActionTimelineCache::loadTextureFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_EventFrame, std::bind(&ActionTimelineCache::loadEventFrame, this, _1)));
|
||||
_funcs.insert(Pair(FrameType_ZOrderFrame, std::bind(&ActionTimelineCache::loadZOrderFrame, this, _1)));
|
||||
|
||||
}
|
||||
|
||||
void ActionTimelineCache::removeAction(const std::string& fileName)
|
||||
{
|
||||
if (_animationActions.find(fileName) != _animationActions.end())
|
||||
{
|
||||
_animationActions.erase(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
ActionTimeline* ActionTimelineCache::createAction(const std::string& fileName)
|
||||
{
|
||||
ActionTimeline* action = _animationActions.at(fileName);
|
||||
if (action == nullptr)
|
||||
{
|
||||
action = loadAnimationActionWithFile(fileName);
|
||||
}
|
||||
return action->clone();
|
||||
}
|
||||
|
||||
ActionTimeline* ActionTimelineCache::loadAnimationActionWithFile(const std::string& fileName)
|
||||
{
|
||||
// Read content from file
|
||||
std::string fullPath = CCFileUtils::getInstance()->fullPathForFilename(fileName);
|
||||
std::string contentStr = FileUtils::getInstance()->getStringFromFile(fullPath);
|
||||
|
||||
return loadAnimationActionWithContent(fileName, contentStr);
|
||||
}
|
||||
|
||||
ActionTimeline* ActionTimelineCache::loadAnimationActionWithContent(const std::string&fileName, const std::string& content)
|
||||
{
|
||||
// if already exists an action with filename, then return this action
|
||||
ActionTimeline* action = _animationActions.at(fileName);
|
||||
if(action)
|
||||
return action;
|
||||
|
||||
rapidjson::Document doc;
|
||||
doc.Parse<0>(content.c_str());
|
||||
if (doc.HasParseError())
|
||||
{
|
||||
CCLOG("GetParseError %s\n", doc.GetParseError());
|
||||
}
|
||||
|
||||
const rapidjson::Value& json = DICTOOL->getSubDictionary_json(doc, ACTION);
|
||||
|
||||
action = ActionTimeline::create();
|
||||
|
||||
action->setDuration(DICTOOL->getIntValue_json(json, DURATION));
|
||||
action->setTimeSpeed(DICTOOL->getFloatValue_json(json, TIME_SPEED, 1.0f));
|
||||
|
||||
int timelineLength = DICTOOL->getArrayCount_json(json, TIMELINES);
|
||||
for (int i = 0; i<timelineLength; i++)
|
||||
{
|
||||
const rapidjson::Value& dic = DICTOOL->getSubDictionary_json(json, TIMELINES, i);
|
||||
Timeline* timeline = loadTimeline(dic);
|
||||
|
||||
if(timeline)
|
||||
action->addTimeline(timeline);
|
||||
}
|
||||
|
||||
_animationActions.insert(fileName, action);
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
|
||||
Timeline* ActionTimelineCache::loadTimeline(const rapidjson::Value& json)
|
||||
{
|
||||
Timeline* timeline = nullptr;
|
||||
|
||||
// get frame type
|
||||
const char* frameType = DICTOOL->getStringValue_json(json, FRAME_TYPE);
|
||||
if(frameType == nullptr)
|
||||
return nullptr;
|
||||
|
||||
if(frameType && _funcs.find(frameType) != _funcs.end())
|
||||
{
|
||||
timeline = Timeline::create();
|
||||
|
||||
int actionTag = DICTOOL->getIntValue_json(json, ACTION_TAG);
|
||||
timeline->setActionTag(actionTag);
|
||||
|
||||
FrameCreateFunc func = _funcs.at(frameType);
|
||||
|
||||
int length = DICTOOL->getArrayCount_json(json, FRAMES);
|
||||
for (int i = 0; i<length; i++)
|
||||
{
|
||||
const rapidjson::Value& dic = DICTOOL->getSubDictionary_json(json, FRAMES, i);
|
||||
|
||||
Frame* frame = nullptr;
|
||||
|
||||
if (func != nullptr)
|
||||
{
|
||||
frame = func(dic);
|
||||
|
||||
int frameIndex = DICTOOL->getIntValue_json(dic, FRAME_INDEX);
|
||||
frame->setFrameIndex(frameIndex);
|
||||
|
||||
bool tween = DICTOOL->getBooleanValue_json(dic, TWEEN, false);
|
||||
frame->setTween(tween);
|
||||
}
|
||||
|
||||
timeline->addFrame(frame);
|
||||
}
|
||||
}
|
||||
|
||||
return timeline;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadVisibleFrame(const rapidjson::Value& json)
|
||||
{
|
||||
VisibleFrame* frame = VisibleFrame::create();
|
||||
|
||||
bool visible = DICTOOL->getBooleanValue_json(json, Value);
|
||||
frame->setVisible(visible);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadPositionFrame(const rapidjson::Value& json)
|
||||
{
|
||||
PositionFrame* frame = PositionFrame::create();
|
||||
|
||||
float x = DICTOOL->getFloatValue_json(json, X);
|
||||
float y = DICTOOL->getFloatValue_json(json, Y);
|
||||
frame->setPosition(Point(x,y));
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadScaleFrame(const rapidjson::Value& json)
|
||||
{
|
||||
ScaleFrame* frame = ScaleFrame::create();
|
||||
|
||||
float scalex = DICTOOL->getFloatValue_json(json, X);
|
||||
float scaley = DICTOOL->getFloatValue_json(json, Y);
|
||||
|
||||
frame->setScaleX(scalex);
|
||||
frame->setScaleY(scaley);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadSkewFrame(const rapidjson::Value& json)
|
||||
{
|
||||
SkewFrame* frame = SkewFrame::create();
|
||||
|
||||
float skewx = DICTOOL->getFloatValue_json(json, X);
|
||||
float skewy = DICTOOL->getFloatValue_json(json, Y);
|
||||
|
||||
frame->setSkewX(skewx);
|
||||
frame->setSkewY(skewy);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadRotationSkewFrame(const rapidjson::Value& json)
|
||||
{
|
||||
RotationSkewFrame* frame = RotationSkewFrame::create();
|
||||
|
||||
float skewx = DICTOOL->getFloatValue_json(json, X);
|
||||
float skewy = DICTOOL->getFloatValue_json(json, Y);
|
||||
|
||||
frame->setSkewX(skewx);
|
||||
frame->setSkewY(skewy);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadRotationFrame(const rapidjson::Value& json)
|
||||
{
|
||||
RotationFrame* frame = RotationFrame::create();
|
||||
|
||||
float rotation = DICTOOL->getFloatValue_json(json, ROTATION);
|
||||
frame->setRotation(rotation);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadAnchorPointFrame (const rapidjson::Value& json)
|
||||
{
|
||||
AnchorPointFrame* frame = AnchorPointFrame::create();
|
||||
|
||||
float anchorx = DICTOOL->getFloatValue_json(json, X);
|
||||
float anchory = DICTOOL->getFloatValue_json(json, Y);
|
||||
|
||||
frame->setAnchorPoint(Point(anchorx, anchory));
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadInnerActionFrame(const rapidjson::Value& json)
|
||||
{
|
||||
InnerActionFrame* frame = InnerActionFrame::create();
|
||||
|
||||
InnerActionType type = (InnerActionType)DICTOOL->getIntValue_json(json, INNER_ACTION);
|
||||
int startFrame = DICTOOL->getIntValue_json(json, START_FRAME);
|
||||
|
||||
frame->setInnerActionType(type);
|
||||
frame->setStartFrameIndex(startFrame);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadColorFrame(const rapidjson::Value& json)
|
||||
{
|
||||
ColorFrame* frame = ColorFrame::create();
|
||||
|
||||
GLubyte alpha = (GLubyte)DICTOOL->getIntValue_json(json, ALPHA);
|
||||
GLubyte red = (GLubyte)DICTOOL->getIntValue_json(json, RED);
|
||||
GLubyte green = (GLubyte)DICTOOL->getIntValue_json(json, GREEN);
|
||||
GLubyte blue = (GLubyte)DICTOOL->getIntValue_json(json, BLUE);
|
||||
|
||||
frame->setAlpha(alpha);
|
||||
frame->setColor(Color3B(red, green, blue));
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadTextureFrame(const rapidjson::Value& json)
|
||||
{
|
||||
TextureFrame* frame = TextureFrame::create();
|
||||
|
||||
const char* texture = DICTOOL->getStringValue_json(json, Value);
|
||||
|
||||
if(texture != NULL)
|
||||
{
|
||||
std::string path = texture;
|
||||
|
||||
SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(path);
|
||||
if(spriteFrame == nullptr)
|
||||
{
|
||||
std::string jsonPath = NodeReader::getInstance()->getJsonPath();
|
||||
path = jsonPath + texture;
|
||||
}
|
||||
|
||||
frame->setTextureName(path);
|
||||
}
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadEventFrame(const rapidjson::Value& json)
|
||||
{
|
||||
EventFrame* frame = EventFrame::create();
|
||||
|
||||
const char* evnt = DICTOOL->getStringValue_json(json, Value);
|
||||
|
||||
if(evnt != NULL)
|
||||
frame->setEvent(evnt);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
Frame* ActionTimelineCache::loadZOrderFrame(const rapidjson::Value& json)
|
||||
{
|
||||
ZOrderFrame* frame = ZOrderFrame::create();
|
||||
|
||||
int zorder = DICTOOL->getIntValue_json(json, Value);
|
||||
frame->setZOrder(zorder);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CCTIMELINE_ACTION_CACHE_H__
|
||||
#define __CCTIMELINE_ACTION_CACHE_H__
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include "cocostudio/DictionaryHelper.h"
|
||||
#include "CCTimelineMacro.h"
|
||||
|
||||
NS_TIMELINE_BEGIN
|
||||
|
||||
class ActionTimeline;
|
||||
class Timeline;
|
||||
class Frame;
|
||||
|
||||
class ActionTimelineCache
|
||||
{
|
||||
public:
|
||||
/** Gets the singleton */
|
||||
static ActionTimelineCache* getInstance();
|
||||
|
||||
/** Destroys the singleton */
|
||||
static void destroyInstance();
|
||||
|
||||
void purge();
|
||||
|
||||
void init();
|
||||
|
||||
/** Remove action with filename, and also remove other resource relate with this file */
|
||||
void removeAction(const std::string& fileName);
|
||||
|
||||
/** Clone a action with the specified name from the container. */
|
||||
ActionTimeline* createAction(const std::string& fileName);
|
||||
|
||||
ActionTimeline* loadAnimationActionWithFile(const std::string& fileName);
|
||||
ActionTimeline* loadAnimationActionWithContent(const std::string&fileName, const std::string& content);
|
||||
protected:
|
||||
|
||||
Timeline* loadTimeline(const rapidjson::Value& json);
|
||||
|
||||
Frame* loadVisibleFrame (const rapidjson::Value& json);
|
||||
Frame* loadPositionFrame (const rapidjson::Value& json);
|
||||
Frame* loadScaleFrame (const rapidjson::Value& json);
|
||||
Frame* loadSkewFrame (const rapidjson::Value& json);
|
||||
Frame* loadRotationSkewFrame(const rapidjson::Value& json);
|
||||
Frame* loadRotationFrame (const rapidjson::Value& json);
|
||||
Frame* loadAnchorPointFrame (const rapidjson::Value& json);
|
||||
Frame* loadInnerActionFrame (const rapidjson::Value& json);
|
||||
Frame* loadColorFrame (const rapidjson::Value& json);
|
||||
Frame* loadTextureFrame (const rapidjson::Value& json);
|
||||
Frame* loadEventFrame (const rapidjson::Value& json);
|
||||
Frame* loadZOrderFrame (const rapidjson::Value& json);
|
||||
|
||||
protected:
|
||||
|
||||
typedef std::function<Frame*(const rapidjson::Value& json)> FrameCreateFunc;
|
||||
typedef std::pair<std::string, FrameCreateFunc> Pair;
|
||||
|
||||
std::unordered_map<std::string, FrameCreateFunc> _funcs;
|
||||
cocos2d::Map<std::string, ActionTimeline*> _animationActions;
|
||||
};
|
||||
|
||||
NS_TIMELINE_END
|
||||
|
||||
#endif /*__CCTIMELINE_ACTION_CACHE_H__*/
|
|
@ -0,0 +1,622 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#include "CCFrame.h"
|
||||
#include "CCTimeLine.h"
|
||||
#include "CCActionTimeline.h"
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
NS_TIMELINE_BEGIN
|
||||
|
||||
// Frame
|
||||
Frame::Frame()
|
||||
: _frameIndex(0)
|
||||
, _tween(true)
|
||||
, _timeline(nullptr)
|
||||
, _node(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
Frame::~Frame()
|
||||
{
|
||||
}
|
||||
|
||||
void Frame::emitEvent()
|
||||
{
|
||||
if (_timeline)
|
||||
{
|
||||
_timeline->getActionTimeline()->emitFrameEvent(this);
|
||||
}
|
||||
}
|
||||
|
||||
void Frame::cloneProperty(Frame* frame)
|
||||
{
|
||||
_frameIndex = frame->getFrameIndex();
|
||||
_tween = frame->isTween();
|
||||
}
|
||||
|
||||
|
||||
// VisibleFrame
|
||||
VisibleFrame* VisibleFrame::create()
|
||||
{
|
||||
VisibleFrame* frame = new VisibleFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VisibleFrame::VisibleFrame()
|
||||
: _visible(true)
|
||||
{
|
||||
}
|
||||
|
||||
void VisibleFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setVisible(_visible);
|
||||
}
|
||||
|
||||
|
||||
Frame* VisibleFrame::clone()
|
||||
{
|
||||
VisibleFrame* frame = VisibleFrame::create();
|
||||
frame->setVisible(_visible);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// TextureFrame
|
||||
TextureFrame* TextureFrame::create()
|
||||
{
|
||||
TextureFrame* frame = new TextureFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
TextureFrame::TextureFrame()
|
||||
: _textureName("")
|
||||
{
|
||||
}
|
||||
|
||||
void TextureFrame::setNode(Node* node)
|
||||
{
|
||||
Frame::setNode(node);
|
||||
|
||||
_sprite = dynamic_cast<Sprite*>(node);
|
||||
}
|
||||
|
||||
void TextureFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
if(_sprite)
|
||||
{
|
||||
SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(_textureName);
|
||||
|
||||
if(spriteFrame != nullptr)
|
||||
_sprite->setSpriteFrame(spriteFrame);
|
||||
else
|
||||
_sprite->setTexture(_textureName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Frame* TextureFrame::clone()
|
||||
{
|
||||
TextureFrame* frame = TextureFrame::create();
|
||||
frame->setTextureName(_textureName);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// RotationFrame
|
||||
RotationFrame* RotationFrame::create()
|
||||
{
|
||||
RotationFrame* frame = new RotationFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RotationFrame::RotationFrame()
|
||||
: _rotation(0)
|
||||
{
|
||||
}
|
||||
|
||||
void RotationFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setRotation(_rotation);
|
||||
|
||||
if(_tween)
|
||||
{
|
||||
_betwennRotation = static_cast<RotationFrame*>(nextFrame)->_rotation - _rotation;
|
||||
}
|
||||
}
|
||||
|
||||
void RotationFrame::apply(float percent)
|
||||
{
|
||||
if (_tween && percent != 0 || _betwennRotation != 0)
|
||||
{
|
||||
float rotation = _rotation + percent * _betwennRotation;
|
||||
_node->setRotation(rotation);
|
||||
}
|
||||
}
|
||||
|
||||
Frame* RotationFrame::clone()
|
||||
{
|
||||
RotationFrame* frame = RotationFrame::create();
|
||||
frame->setRotation(_rotation);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// SkewFrame
|
||||
SkewFrame* SkewFrame::create()
|
||||
{
|
||||
SkewFrame* frame = new SkewFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SkewFrame::SkewFrame()
|
||||
: _skewX(0)
|
||||
, _skewY(0)
|
||||
{
|
||||
}
|
||||
|
||||
void SkewFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setSkewX(_skewX);
|
||||
_node->setSkewY(_skewY);
|
||||
|
||||
if(_tween)
|
||||
{
|
||||
_betweenSkewX = static_cast<SkewFrame*>(nextFrame)->_skewX - _skewX;
|
||||
_betweenSkewY = static_cast<SkewFrame*>(nextFrame)->_skewY - _skewY;
|
||||
}
|
||||
}
|
||||
|
||||
void SkewFrame::apply(float percent)
|
||||
{
|
||||
if (_tween && percent != 0 || (_betweenSkewX != 0 || _betweenSkewY != 0))
|
||||
{
|
||||
float skewx = _skewX + percent * _betweenSkewX;
|
||||
float skewy = _skewY + percent * _betweenSkewY;
|
||||
|
||||
_node->setSkewX(skewx);
|
||||
_node->setSkewY(skewy);
|
||||
}
|
||||
}
|
||||
|
||||
Frame* SkewFrame::clone()
|
||||
{
|
||||
SkewFrame* frame = SkewFrame::create();
|
||||
frame->setSkewX(_skewX);
|
||||
frame->setSkewY(_skewY);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// RotationSkewFrame
|
||||
RotationSkewFrame* RotationSkewFrame::create()
|
||||
{
|
||||
RotationSkewFrame* frame = new RotationSkewFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RotationSkewFrame::RotationSkewFrame()
|
||||
{
|
||||
}
|
||||
|
||||
void RotationSkewFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setRotationSkewX(_skewX);
|
||||
_node->setRotationSkewY(_skewY);
|
||||
|
||||
if (_tween)
|
||||
{
|
||||
_betweenSkewX = static_cast<RotationSkewFrame*>(nextFrame)->_skewX - _skewX;
|
||||
_betweenSkewY = static_cast<RotationSkewFrame*>(nextFrame)->_skewY - _skewY;
|
||||
}
|
||||
}
|
||||
|
||||
void RotationSkewFrame::apply(float percent)
|
||||
{
|
||||
if (_tween && percent != 0 || (_betweenSkewX != 0 || _betweenSkewY != 0))
|
||||
{
|
||||
float skewx = _skewX + percent * _betweenSkewX;
|
||||
float skewy = _skewY + percent * _betweenSkewY;
|
||||
|
||||
_node->setRotationSkewX(skewx);
|
||||
_node->setRotationSkewY(skewy);
|
||||
}
|
||||
}
|
||||
|
||||
Frame* RotationSkewFrame::clone()
|
||||
{
|
||||
RotationSkewFrame* frame = RotationSkewFrame::create();
|
||||
frame->setSkewX(_skewX);
|
||||
frame->setSkewY(_skewY);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
// PositionFrame
|
||||
PositionFrame* PositionFrame::create()
|
||||
{
|
||||
PositionFrame* frame = new PositionFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PositionFrame::PositionFrame()
|
||||
: _position(0,0)
|
||||
{
|
||||
}
|
||||
|
||||
void PositionFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setPosition(_position);
|
||||
|
||||
if(_tween)
|
||||
{
|
||||
_betweenX = static_cast<PositionFrame*>(nextFrame)->_position.x - _position.x;
|
||||
_betweenY = static_cast<PositionFrame*>(nextFrame)->_position.y - _position.y;
|
||||
}
|
||||
}
|
||||
|
||||
void PositionFrame::apply(float percent)
|
||||
{
|
||||
if (_tween && percent != 0 || (_betweenX != 0 || _betweenY != 0))
|
||||
{
|
||||
Point p;
|
||||
p.x = _position.x + _betweenX * percent;
|
||||
p.y = _position.y + _betweenY * percent;
|
||||
|
||||
_node->setPosition(p);
|
||||
}
|
||||
}
|
||||
|
||||
Frame* PositionFrame::clone()
|
||||
{
|
||||
PositionFrame* frame = PositionFrame::create();
|
||||
frame->setPosition(_position);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
// ScaleFrame
|
||||
ScaleFrame* ScaleFrame::create()
|
||||
{
|
||||
ScaleFrame* frame = new ScaleFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ScaleFrame::ScaleFrame()
|
||||
: _scaleX(1)
|
||||
, _scaleY(1)
|
||||
{
|
||||
}
|
||||
|
||||
void ScaleFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setScaleX(_scaleX);
|
||||
_node->setScaleY(_scaleY);
|
||||
|
||||
if(_tween)
|
||||
{
|
||||
_betweenScaleX = static_cast<ScaleFrame*>(nextFrame)->_scaleX - _scaleX;
|
||||
_betweenScaleY = static_cast<ScaleFrame*>(nextFrame)->_scaleY - _scaleY;
|
||||
}
|
||||
}
|
||||
|
||||
void ScaleFrame::apply(float percent)
|
||||
{
|
||||
if (_tween && percent != 0 || (_betweenScaleX != 0 || _betweenScaleY != 0))
|
||||
{
|
||||
float scaleX = _scaleX + _betweenScaleX * percent;
|
||||
float scaleY = _scaleY + _betweenScaleY * percent;
|
||||
|
||||
_node->setScaleX(scaleX);
|
||||
_node->setScaleY(scaleY);
|
||||
}
|
||||
}
|
||||
|
||||
Frame* ScaleFrame::clone()
|
||||
{
|
||||
ScaleFrame* frame = ScaleFrame::create();
|
||||
frame->setScaleX(_scaleX);
|
||||
frame->setScaleY(_scaleY);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
// AnchorPointFrame
|
||||
AnchorPointFrame* AnchorPointFrame::create()
|
||||
{
|
||||
AnchorPointFrame* frame = new AnchorPointFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
AnchorPointFrame::AnchorPointFrame()
|
||||
: _anchorPoint(0.5f,0.5f)
|
||||
{
|
||||
}
|
||||
|
||||
void AnchorPointFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setAnchorPoint(_anchorPoint);
|
||||
}
|
||||
|
||||
|
||||
Frame* AnchorPointFrame::clone()
|
||||
{
|
||||
AnchorPointFrame* frame = AnchorPointFrame::create();
|
||||
frame->setAnchorPoint(_anchorPoint);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// InnerActionFrame
|
||||
InnerActionFrame* InnerActionFrame::create()
|
||||
{
|
||||
InnerActionFrame* frame = new InnerActionFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
InnerActionFrame::InnerActionFrame()
|
||||
: _innerActionType(LoopAction)
|
||||
, _startFrameIndex(0)
|
||||
{
|
||||
}
|
||||
|
||||
void InnerActionFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Frame* InnerActionFrame::clone()
|
||||
{
|
||||
InnerActionFrame* frame = InnerActionFrame::create();
|
||||
frame->setInnerActionType(_innerActionType);
|
||||
frame->setStartFrameIndex(_startFrameIndex);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
// ColorFrame
|
||||
ColorFrame* ColorFrame::create()
|
||||
{
|
||||
ColorFrame* frame = new ColorFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ColorFrame::ColorFrame()
|
||||
: _alpha(255)
|
||||
, _color(Color3B(255, 255, 255))
|
||||
{
|
||||
}
|
||||
|
||||
void ColorFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
_node->setOpacity(_alpha);
|
||||
_node->setColor(_color);
|
||||
|
||||
if(_tween)
|
||||
{
|
||||
_betweenAlpha = static_cast<ColorFrame*>(nextFrame)->_alpha - _alpha;
|
||||
|
||||
const Color3B& color = static_cast<ColorFrame*>(nextFrame)->_color;
|
||||
_betweenRed = color.r - _color.r;
|
||||
_betweenGreen = color.g - _color.g;
|
||||
_betweenBlue = color.b - _color.b;
|
||||
}
|
||||
|
||||
_node->setCascadeColorEnabled(true);
|
||||
_node->setCascadeOpacityEnabled(true);
|
||||
}
|
||||
|
||||
void ColorFrame::apply(float percent)
|
||||
{
|
||||
if (_tween && percent != 0 || (_betweenAlpha !=0 || _betweenRed != 0 || _betweenGreen != 0 || _betweenBlue != 0))
|
||||
{
|
||||
GLubyte alpha = _alpha + _betweenAlpha * percent;
|
||||
|
||||
Color3B color;
|
||||
color.r = _color.r+ _betweenRed * percent;
|
||||
color.g = _color.g+ _betweenGreen * percent;
|
||||
color.b = _color.b+ _betweenBlue * percent;
|
||||
|
||||
_node->setOpacity(alpha);
|
||||
_node->setColor(color);
|
||||
}
|
||||
}
|
||||
|
||||
Frame* ColorFrame::clone()
|
||||
{
|
||||
ColorFrame* frame = ColorFrame::create();
|
||||
frame->setAlpha(_alpha);
|
||||
frame->setColor(_color);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
// EventFrame
|
||||
EventFrame* EventFrame::create()
|
||||
{
|
||||
EventFrame* frame = new EventFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EventFrame::EventFrame()
|
||||
: _event("")
|
||||
{
|
||||
}
|
||||
|
||||
void EventFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
emitEvent();
|
||||
}
|
||||
|
||||
|
||||
Frame* EventFrame::clone()
|
||||
{
|
||||
EventFrame* frame = EventFrame::create();
|
||||
frame->setEvent(_event);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
// ZOrderFrame
|
||||
ZOrderFrame* ZOrderFrame::create()
|
||||
{
|
||||
ZOrderFrame* frame = new ZOrderFrame();
|
||||
if (frame)
|
||||
{
|
||||
frame->autorelease();
|
||||
return frame;
|
||||
}
|
||||
CC_SAFE_DELETE(frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZOrderFrame::ZOrderFrame()
|
||||
: _zorder(0)
|
||||
{
|
||||
}
|
||||
|
||||
void ZOrderFrame::onEnter(Frame *nextFrame)
|
||||
{
|
||||
if(_node)
|
||||
_node->setZOrder(_zorder);
|
||||
}
|
||||
|
||||
|
||||
Frame* ZOrderFrame::clone()
|
||||
{
|
||||
ZOrderFrame* frame = ZOrderFrame::create();
|
||||
frame->setZOrder(_zorder);
|
||||
|
||||
frame->cloneProperty(this);
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
NS_TIMELINE_END
|
|
@ -0,0 +1,330 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CCFRAME_H__
|
||||
#define __CCFRAME_H__
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include "CCTimelineMacro.h"
|
||||
|
||||
NS_TIMELINE_BEGIN
|
||||
|
||||
class Timeline;
|
||||
|
||||
class Frame : public cocos2d::Ref
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void setFrameIndex(unsigned int frameIndex) { _frameIndex = frameIndex; }
|
||||
virtual unsigned int getFrameIndex() const { return _frameIndex; }
|
||||
|
||||
virtual void setTimeline(Timeline* timeline) { _timeline = timeline; }
|
||||
virtual Timeline* getTimeline() const { return _timeline; }
|
||||
|
||||
virtual void setNode(cocos2d::Node* node) { _node = node; }
|
||||
virtual cocos2d::Node* getNode() const { return _node; }
|
||||
|
||||
virtual void setTween(bool tween) { _tween = tween; }
|
||||
virtual bool isTween() const { return _tween; }
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) = 0;
|
||||
virtual void apply(float percent) {}
|
||||
|
||||
virtual Frame* clone() = 0;
|
||||
protected:
|
||||
Frame();
|
||||
virtual ~Frame();
|
||||
|
||||
virtual void emitEvent();
|
||||
virtual void cloneProperty(Frame* frame);
|
||||
protected:
|
||||
|
||||
unsigned int _frameIndex;
|
||||
bool _tween;
|
||||
|
||||
Timeline* _timeline;
|
||||
cocos2d::Node* _node;
|
||||
};
|
||||
|
||||
|
||||
class VisibleFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static VisibleFrame* create();
|
||||
|
||||
VisibleFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setVisible(bool visible) { _visible = visible;}
|
||||
inline bool isVisible() const { return _visible; }
|
||||
|
||||
protected:
|
||||
bool _visible;
|
||||
};
|
||||
|
||||
|
||||
class TextureFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static TextureFrame* create();
|
||||
|
||||
TextureFrame();
|
||||
|
||||
virtual void setNode(cocos2d::Node* node);
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setTextureName(std::string textureName) { _textureName = textureName;}
|
||||
inline std::string getTextureName() const { return _textureName; }
|
||||
|
||||
protected:
|
||||
cocos2d::Sprite* _sprite;
|
||||
std::string _textureName;
|
||||
};
|
||||
|
||||
class RotationFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static RotationFrame* create();
|
||||
|
||||
RotationFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual void apply(float percent) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setRotation(float rotation) { _rotation = rotation; }
|
||||
inline float getRotation() const { return _rotation; }
|
||||
|
||||
protected:
|
||||
float _rotation;
|
||||
float _betwennRotation;
|
||||
};
|
||||
|
||||
class SkewFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static SkewFrame* create();
|
||||
|
||||
SkewFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual void apply(float percent) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setSkewX(float skewx) { _skewX = skewx; }
|
||||
inline float getSkewX() const { return _skewX; }
|
||||
|
||||
inline void setSkewY(float skewy) { _skewY = skewy; }
|
||||
inline float getSkewY() const { return _skewY; }
|
||||
|
||||
protected:
|
||||
float _skewX;
|
||||
float _skewY;
|
||||
float _betweenSkewX;
|
||||
float _betweenSkewY;
|
||||
};
|
||||
|
||||
|
||||
class RotationSkewFrame : public SkewFrame
|
||||
{
|
||||
public:
|
||||
static RotationSkewFrame* create();
|
||||
|
||||
RotationSkewFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual void apply(float percent) override;
|
||||
virtual Frame* clone() override;
|
||||
};
|
||||
|
||||
|
||||
class PositionFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static PositionFrame* create();
|
||||
|
||||
PositionFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual void apply(float percent) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setPosition(const cocos2d::Point& position) { _position = position; }
|
||||
inline cocos2d::Point getPosition() const { return _position; }
|
||||
|
||||
inline void setX(float x) { _position.x = x; }
|
||||
inline void setY(float y) { _position.y = y; }
|
||||
|
||||
inline float getX() const { return _position.x; }
|
||||
inline float getY() const { return _position.y; }
|
||||
protected:
|
||||
cocos2d::Point _position;
|
||||
float _betweenX;
|
||||
float _betweenY;
|
||||
};
|
||||
|
||||
|
||||
class ScaleFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static ScaleFrame* create();
|
||||
|
||||
ScaleFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual void apply(float percent) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setScale(float scale) { _scaleX = scale; _scaleY = scale; }
|
||||
|
||||
inline void setScaleX(float scaleX) { _scaleX = scaleX; }
|
||||
inline float getScaleX() const { return _scaleX; }
|
||||
|
||||
inline void setScaleY(float scaleY) { _scaleY = scaleY;}
|
||||
inline float getScaleY() const { return _scaleY; }
|
||||
|
||||
protected:
|
||||
float _scaleX;
|
||||
float _scaleY;
|
||||
float _betweenScaleX;
|
||||
float _betweenScaleY;
|
||||
};
|
||||
|
||||
|
||||
class AnchorPointFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static AnchorPointFrame* create();
|
||||
|
||||
AnchorPointFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setAnchorPoint(const cocos2d::Point& point) { _anchorPoint = point; }
|
||||
inline cocos2d::Point getAnchorPoint() const { return _anchorPoint; }
|
||||
|
||||
protected:
|
||||
cocos2d::Point _anchorPoint;
|
||||
};
|
||||
|
||||
|
||||
|
||||
enum InnerActionType
|
||||
{
|
||||
LoopAction,
|
||||
NoLoopAction,
|
||||
SingleFrame
|
||||
};
|
||||
|
||||
class InnerActionFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static InnerActionFrame* create();
|
||||
InnerActionFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setInnerActionType(InnerActionType type) { _innerActionType = type; }
|
||||
inline InnerActionType getInnerActionType() const { return _innerActionType; }
|
||||
|
||||
inline void setStartFrameIndex(int frameIndex) { _startFrameIndex = frameIndex; }
|
||||
inline int getStartFrameIndex() const { return _startFrameIndex; }
|
||||
|
||||
protected:
|
||||
InnerActionType _innerActionType;
|
||||
int _startFrameIndex;
|
||||
};
|
||||
|
||||
|
||||
class ColorFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static ColorFrame* create();
|
||||
ColorFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual void apply(float percent) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setAlpha(GLubyte alpha) { _alpha = alpha; }
|
||||
inline GLubyte getAlpha() const { return _alpha; }
|
||||
|
||||
inline void setColor(const cocos2d::Color3B& color) { _color = color; }
|
||||
inline cocos2d::Color3B getColor() const { return _color; }
|
||||
|
||||
protected:
|
||||
GLubyte _alpha;
|
||||
cocos2d::Color3B _color;
|
||||
|
||||
int _betweenAlpha;
|
||||
int _betweenRed;
|
||||
int _betweenGreen;
|
||||
int _betweenBlue;
|
||||
};
|
||||
|
||||
|
||||
class EventFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static EventFrame* create();
|
||||
|
||||
EventFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setEvent(std::string event) { _event = event;}
|
||||
inline std::string getEvent() const { return _event; }
|
||||
|
||||
protected:
|
||||
std::string _event;
|
||||
};
|
||||
|
||||
class ZOrderFrame : public Frame
|
||||
{
|
||||
public:
|
||||
static ZOrderFrame* create();
|
||||
|
||||
ZOrderFrame();
|
||||
|
||||
virtual void onEnter(Frame *nextFrame) override;
|
||||
virtual Frame* clone() override;
|
||||
|
||||
inline void setZOrder(int zorder) { _zorder = zorder;}
|
||||
inline int getZOrder() const { return _zorder; }
|
||||
|
||||
protected:
|
||||
int _zorder;
|
||||
};
|
||||
|
||||
NS_TIMELINE_END
|
||||
|
||||
|
||||
#endif /*__CCFRAME_H__*/
|
|
@ -0,0 +1,457 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#include "CCNodeReader.h"
|
||||
#include "CCActionTimelineCache.h"
|
||||
#include "CCActionTimeline.h"
|
||||
|
||||
#include "../CCSGUIReader.h"
|
||||
|
||||
using namespace cocos2d;
|
||||
using namespace ui;
|
||||
|
||||
namespace cocostudio {
|
||||
namespace timeline{
|
||||
|
||||
|
||||
static const char* ClassName_Node = "Node";
|
||||
static const char* ClassName_SubGraph = "SubGraph";
|
||||
static const char* ClassName_Sprite = "Sprite";
|
||||
static const char* ClassName_Particle = "Particle";
|
||||
|
||||
static const char* ClassName_Panel = "Panel";
|
||||
static const char* ClassName_Button = "Button";
|
||||
static const char* ClassName_CheckBox = "CheckBox";
|
||||
static const char* ClassName_ImageView = "ImageView";
|
||||
static const char* ClassName_TextAtlas = "TextAtlas";
|
||||
static const char* ClassName_TextBMFont = "TextBMFont";
|
||||
static const char* ClassName_Text = "Text";
|
||||
static const char* ClassName_LoadingBar = "LoadingBar";
|
||||
static const char* ClassName_TextField = "TextField";
|
||||
static const char* ClassName_Slider = "Slider";
|
||||
static const char* ClassName_Layout = "Layout";
|
||||
static const char* ClassName_ScrollView = "ScrollView";
|
||||
static const char* ClassName_ListView = "ListView";
|
||||
static const char* ClassName_PageView = "PageView";
|
||||
static const char* ClassName_Widget = "Widget";
|
||||
static const char* ClassName_Label = "Label";
|
||||
|
||||
|
||||
static const char* NODE = "nodeTree";
|
||||
static const char* CHILDREN = "children";
|
||||
static const char* CLASSNAME = "classname";
|
||||
static const char* FILE_PATH = "fileName";
|
||||
static const char* PLIST_FILE = "plistFile";
|
||||
static const char* TAG = "tag";
|
||||
static const char* ACTION_TAG = "actionTag";
|
||||
|
||||
static const char* OPTIONS = "options";
|
||||
|
||||
static const char* WIDTH = "width";
|
||||
static const char* HEIGHT = "height";
|
||||
static const char* X = "x";
|
||||
static const char* Y = "y";
|
||||
static const char* SCALE_X = "scaleX";
|
||||
static const char* SCALE_Y = "scaleY";
|
||||
static const char* SKEW_X = "skewX";
|
||||
static const char* SKEW_Y = "skewY";
|
||||
static const char* ROTATION = "rotation";
|
||||
static const char* ROTATION_SKEW_X = "rotationSkewX";
|
||||
static const char* ROTATION_SKEW_Y = "rotationSkewY";
|
||||
static const char* ANCHOR_X = "anchorPointX";
|
||||
static const char* ANCHOR_Y = "anchorPointY";
|
||||
static const char* ALPHA = "opacity";
|
||||
static const char* RED = "colorR";
|
||||
static const char* GREEN = "colorG";
|
||||
static const char* BLUE = "colorB";
|
||||
static const char* ZORDER = "ZOrder";
|
||||
static const char* PARTICLE_NUM = "particleNum";
|
||||
static const char* FLIPX = "flipX";
|
||||
static const char* FLIPY = "flipY";
|
||||
static const char* VISIBLE = "visible";
|
||||
|
||||
static const char* TEXTURES = "textures";
|
||||
static const char* TEXTURES_PNG = "texturesPng";
|
||||
|
||||
|
||||
// NodeReader
|
||||
static NodeReader* _sharedNodeReader = nullptr;
|
||||
|
||||
NodeReader* NodeReader::getInstance()
|
||||
{
|
||||
if (! _sharedNodeReader)
|
||||
{
|
||||
_sharedNodeReader = new NodeReader();
|
||||
_sharedNodeReader->init();
|
||||
}
|
||||
|
||||
return _sharedNodeReader;
|
||||
}
|
||||
|
||||
void NodeReader::destroyInstance()
|
||||
{
|
||||
CC_SAFE_DELETE(_sharedNodeReader);
|
||||
}
|
||||
|
||||
NodeReader::NodeReader()
|
||||
: _recordJsonPath(true)
|
||||
, _jsonPath("")
|
||||
{
|
||||
}
|
||||
|
||||
void NodeReader::purge()
|
||||
{
|
||||
}
|
||||
|
||||
void NodeReader::init()
|
||||
{
|
||||
using namespace std::placeholders;
|
||||
|
||||
_funcs.insert(Pair(ClassName_Node, std::bind(&NodeReader::loadSimpleNode, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_SubGraph, std::bind(&NodeReader::loadSubGraph, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Sprite, std::bind(&NodeReader::loadSprite, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Particle, std::bind(&NodeReader::loadParticle, this, _1)));
|
||||
|
||||
_funcs.insert(Pair(ClassName_Panel, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Button, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_CheckBox, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_ImageView, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_TextAtlas, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_TextBMFont,std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Text, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_LoadingBar,std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_TextField, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Slider, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Layout, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_ScrollView,std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_ListView, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_PageView, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Widget, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
_funcs.insert(Pair(ClassName_Label, std::bind(&NodeReader::loadWidget, this, _1)));
|
||||
|
||||
_guiReader = new WidgetPropertiesReader0300();
|
||||
}
|
||||
|
||||
Node* NodeReader::createNode(const std::string& filename)
|
||||
{
|
||||
if(_recordJsonPath)
|
||||
{
|
||||
std::string jsonPath = filename.substr(0, filename.find_last_of('/') + 1);
|
||||
GUIReader::getInstance()->setFilePath(jsonPath);
|
||||
|
||||
_jsonPath = jsonPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
GUIReader::getInstance()->setFilePath("");
|
||||
_jsonPath = "";
|
||||
}
|
||||
|
||||
Node* node = loadNodeWithFile(filename);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* NodeReader::loadNodeWithFile(const std::string& fileName)
|
||||
{
|
||||
// Read content from file
|
||||
std::string contentStr = FileUtils::getInstance()->getStringFromFile(fileName);
|
||||
|
||||
Node* node = loadNodeWithContent(contentStr);
|
||||
|
||||
// Load animation data from file
|
||||
ActionTimelineCache::getInstance()->loadAnimationActionWithContent(fileName, contentStr);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* NodeReader::loadNodeWithContent(const std::string& content)
|
||||
{
|
||||
rapidjson::Document doc;
|
||||
doc.Parse<0>(content.c_str());
|
||||
if (doc.HasParseError())
|
||||
{
|
||||
CCLOG("GetParseError %s\n", doc.GetParseError());
|
||||
}
|
||||
|
||||
// decode plist
|
||||
int length = DICTOOL->getArrayCount_json(doc, TEXTURES);
|
||||
|
||||
for(int i=0; i<length; i++)
|
||||
{
|
||||
std::string plist = DICTOOL->getStringValueFromArray_json(doc, TEXTURES, i);
|
||||
std::string png = DICTOOL->getStringValueFromArray_json(doc, TEXTURES_PNG, i);
|
||||
plist = _jsonPath + plist;
|
||||
png = _jsonPath + png;
|
||||
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(plist, png);
|
||||
}
|
||||
|
||||
// decode node tree
|
||||
const rapidjson::Value& subJson = DICTOOL->getSubDictionary_json(doc, NODE);
|
||||
Node* root = loadNode(subJson);
|
||||
root->release();
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
Node* NodeReader::loadNode(const rapidjson::Value& json)
|
||||
{
|
||||
Node* node = nullptr;
|
||||
std::string nodeType = DICTOOL->getStringValue_json(json, CLASSNAME);
|
||||
|
||||
NodeCreateFunc func = _funcs.at(nodeType);
|
||||
if (func != nullptr)
|
||||
{
|
||||
const rapidjson::Value& options = DICTOOL->getSubDictionary_json(json, OPTIONS);
|
||||
node = func(options);
|
||||
}
|
||||
|
||||
if(node)
|
||||
{
|
||||
int length = DICTOOL->getArrayCount_json(json, CHILDREN, 0);
|
||||
for (int i = 0; i<length; i++)
|
||||
{
|
||||
const rapidjson::Value &dic = DICTOOL->getSubDictionary_json(json, CHILDREN, i);
|
||||
Node* child = loadNode(dic);
|
||||
if (child)
|
||||
{
|
||||
node->addChild(child);
|
||||
child->release();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CCLOG("Not supported NodeType: %s", nodeType.c_str());
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void NodeReader::initNode(Node* node, const rapidjson::Value& json)
|
||||
{
|
||||
float width = DICTOOL->getFloatValue_json(json, WIDTH);
|
||||
float height = DICTOOL->getFloatValue_json(json, HEIGHT);
|
||||
float x = DICTOOL->getFloatValue_json(json, X);
|
||||
float y = DICTOOL->getFloatValue_json(json, Y);
|
||||
float scalex = DICTOOL->getFloatValue_json(json, SCALE_X, 1);
|
||||
float scaley = DICTOOL->getFloatValue_json(json, SCALE_Y, 1);
|
||||
float rotation = DICTOOL->getFloatValue_json(json, ROTATION);
|
||||
float rotationSkewX = DICTOOL->getFloatValue_json(json, ROTATION_SKEW_X);
|
||||
float rotationSkewY = DICTOOL->getFloatValue_json(json, ROTATION_SKEW_Y);
|
||||
float skewx = DICTOOL->getFloatValue_json(json, SKEW_X);
|
||||
float skewy = DICTOOL->getFloatValue_json(json, SKEW_Y);
|
||||
float anchorx = DICTOOL->getFloatValue_json(json, ANCHOR_X, 0.5f);
|
||||
float anchory = DICTOOL->getFloatValue_json(json, ANCHOR_Y, 0.5f);
|
||||
GLubyte alpha = (GLubyte)DICTOOL->getIntValue_json(json, ALPHA, 255);
|
||||
GLubyte red = (GLubyte)DICTOOL->getIntValue_json(json, RED, 255);
|
||||
GLubyte green = (GLubyte)DICTOOL->getIntValue_json(json, GREEN, 255);
|
||||
GLubyte blue = (GLubyte)DICTOOL->getIntValue_json(json, BLUE, 255);
|
||||
int zorder = DICTOOL->getIntValue_json(json, ZORDER);
|
||||
int tag = DICTOOL->getIntValue_json(json, TAG);
|
||||
int actionTag = DICTOOL->getIntValue_json(json, ACTION_TAG);
|
||||
bool visible = DICTOOL->getBooleanValue_json(json, VISIBLE);
|
||||
|
||||
if(x != 0 || y != 0)
|
||||
node->setPosition(Point(x, y));
|
||||
if(scalex != 1)
|
||||
node->setScaleX(scalex);
|
||||
if(scaley != 1)
|
||||
node->setScaleY(scaley);
|
||||
if (rotation != 0)
|
||||
node->setRotation(rotation);
|
||||
if(rotationSkewX != 0)
|
||||
node->setRotationX(rotationSkewX);
|
||||
if(rotationSkewY != 0)
|
||||
node->setRotationY(rotationSkewY);
|
||||
if(skewx != 0)
|
||||
node->setSkewX(skewx);
|
||||
if(skewy != 0)
|
||||
node->setSkewY(skewy);
|
||||
if(anchorx != 0.5f || anchory != 0.5f)
|
||||
node->setAnchorPoint(Point(anchorx, anchory));
|
||||
if(width != 0 || height != 0)
|
||||
node->setContentSize(Size(width, height));
|
||||
if(zorder != 0)
|
||||
node->setZOrder(zorder);
|
||||
if(visible != true)
|
||||
node->setVisible(visible);
|
||||
|
||||
if(alpha != 255)
|
||||
{
|
||||
node->setOpacity(alpha);
|
||||
node->setCascadeOpacityEnabled(true);
|
||||
}
|
||||
if(red != 255 || green != 255 || blue != 255)
|
||||
{
|
||||
node->setColor(Color3B(red, green, blue));
|
||||
node->setCascadeColorEnabled(true);
|
||||
}
|
||||
|
||||
|
||||
node->setTag(tag);
|
||||
node->setUserObject(ActionTimelineData::create(actionTag));
|
||||
}
|
||||
|
||||
Node* NodeReader::loadSimpleNode(const rapidjson::Value& json)
|
||||
{
|
||||
Node* node = Node::create();
|
||||
node->retain();
|
||||
initNode(node, json);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* NodeReader::loadSubGraph(const rapidjson::Value& json)
|
||||
{
|
||||
const char* filePath = DICTOOL->getStringValue_json(json, FILE_PATH);
|
||||
|
||||
Node* node = nullptr;
|
||||
if (filePath && strcmp("", filePath) != 0)
|
||||
{
|
||||
node = createNode(filePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
node = Node::create();
|
||||
}
|
||||
|
||||
node->retain();
|
||||
|
||||
initNode(node, json);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* NodeReader::loadSprite(const rapidjson::Value& json)
|
||||
{
|
||||
const char* filePath = DICTOOL->getStringValue_json(json, FILE_PATH);
|
||||
Sprite *sprite = nullptr;
|
||||
|
||||
if(filePath != nullptr)
|
||||
{
|
||||
std::string path = filePath;
|
||||
|
||||
SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(path);
|
||||
if(!spriteFrame)
|
||||
{
|
||||
path = _jsonPath + path;
|
||||
sprite = Sprite::create(path);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite = Sprite::createWithSpriteFrame(spriteFrame);
|
||||
}
|
||||
|
||||
if(!sprite)
|
||||
{
|
||||
sprite = CCSprite::create();
|
||||
CCLOG("filePath is empty. Create a sprite with no texture");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite = Sprite::create();
|
||||
}
|
||||
|
||||
sprite->retain();
|
||||
|
||||
initNode(sprite, json);
|
||||
|
||||
bool flipX = DICTOOL->getBooleanValue_json(json, FLIPX);
|
||||
bool flipY = DICTOOL->getBooleanValue_json(json, FLIPY);
|
||||
|
||||
if(flipX != false)
|
||||
sprite->setFlipX(flipX);
|
||||
if(flipY != false)
|
||||
sprite->setFlipY(flipY);
|
||||
|
||||
return sprite;
|
||||
}
|
||||
|
||||
Node* NodeReader::loadParticle(const rapidjson::Value& json)
|
||||
{
|
||||
const char* filePath = DICTOOL->getStringValue_json(json, PLIST_FILE);
|
||||
int num = DICTOOL->getIntValue_json(json, PARTICLE_NUM);
|
||||
|
||||
ParticleSystemQuad* particle = ParticleSystemQuad::create(filePath);
|
||||
particle->setTotalParticles(num);
|
||||
particle->retain();
|
||||
|
||||
initNode(particle, json);
|
||||
|
||||
return particle;
|
||||
}
|
||||
|
||||
Node* NodeReader::loadWidget(const rapidjson::Value& json)
|
||||
{
|
||||
const char* str = DICTOOL->getStringValue_json(json, CLASSNAME);
|
||||
if(str == nullptr)
|
||||
return nullptr;
|
||||
|
||||
std::string classname = str;
|
||||
|
||||
if (classname == "Panel")
|
||||
{
|
||||
classname = "Layout";
|
||||
}
|
||||
else if (classname == "TextArea")
|
||||
{
|
||||
classname = "Text";
|
||||
}
|
||||
else if (classname == "TextButton")
|
||||
{
|
||||
classname = "Button";
|
||||
}
|
||||
else if (classname == "Label")
|
||||
{
|
||||
classname = "Text";
|
||||
}
|
||||
else if (classname == "LabelAtlas")
|
||||
{
|
||||
classname = "TextAtlas";
|
||||
}
|
||||
else if (classname == "LabelBMFont")
|
||||
{
|
||||
classname = "TextBMFont";
|
||||
}
|
||||
|
||||
std::string readerName = classname;
|
||||
readerName.append("Reader");
|
||||
|
||||
Widget* widget = dynamic_cast<Widget*>(ObjectFactory::getInstance()->createObject(classname));
|
||||
widget->retain();
|
||||
|
||||
WidgetReaderProtocol* reader = dynamic_cast<WidgetReaderProtocol*>(ObjectFactory::getInstance()->createObject(readerName));
|
||||
|
||||
_guiReader->setPropsForAllWidgetFromJsonDictionary(reader, widget, json);
|
||||
|
||||
int actionTag = DICTOOL->getIntValue_json(json, ACTION_TAG);
|
||||
widget->setUserObject(ActionTimelineData::create(actionTag));
|
||||
|
||||
return widget;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CC_NODE_CACHE_H__
|
||||
#define __CC_NODE_CACHE_H__
|
||||
|
||||
#include "cocostudio/DictionaryHelper.h"
|
||||
#include "cocos2d.h"
|
||||
|
||||
namespace cocostudio {
|
||||
|
||||
class WidgetPropertiesReader0300;
|
||||
|
||||
namespace timeline{
|
||||
|
||||
class NodeReader
|
||||
{
|
||||
public:
|
||||
static NodeReader* getInstance();
|
||||
static void destroyInstance();
|
||||
|
||||
NodeReader();
|
||||
void purge();
|
||||
|
||||
void init();
|
||||
|
||||
cocos2d::Node* createNode(const std::string& filename);
|
||||
|
||||
cocos2d::Node* loadNodeWithFile(const std::string& fileName);
|
||||
cocos2d::Node* loadNodeWithContent(const std::string& content);
|
||||
|
||||
void setRecordJsonPath(bool record) { _recordJsonPath = record; }
|
||||
bool isRecordJsonPath() const { return _recordJsonPath; }
|
||||
|
||||
void setJsonPath(std::string jsonPath) { _jsonPath = jsonPath; }
|
||||
std::string getJsonPath() const { return _jsonPath; }
|
||||
|
||||
protected:
|
||||
|
||||
cocos2d::Node* loadNode(const rapidjson::Value& json);
|
||||
|
||||
void locateNodeWithMulresPosition(cocos2d::Node* node, const rapidjson::Value& json);
|
||||
|
||||
void initNode(cocos2d::Node* node, const rapidjson::Value& json);
|
||||
|
||||
// load nodes
|
||||
cocos2d::Node* loadSimpleNode(const rapidjson::Value& json);
|
||||
cocos2d::Node* loadSubGraph (const rapidjson::Value& json);
|
||||
cocos2d::Node* loadSprite (const rapidjson::Value& json);
|
||||
cocos2d::Node* loadParticle (const rapidjson::Value& json);
|
||||
|
||||
// load gui
|
||||
cocos2d::Node* loadWidget(const rapidjson::Value& json);
|
||||
|
||||
typedef std::function<cocos2d::Node*(const rapidjson::Value& json)> NodeCreateFunc;
|
||||
typedef std::pair<std::string, NodeCreateFunc> Pair;
|
||||
|
||||
std::unordered_map<std::string, NodeCreateFunc> _funcs;
|
||||
|
||||
WidgetPropertiesReader0300* _guiReader;
|
||||
bool _recordJsonPath;
|
||||
|
||||
std::string _jsonPath;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif /*__CC_NODE_CACHE_H__*/
|
|
@ -0,0 +1,249 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#include "CCTimeLine.h"
|
||||
#include "CCActionTimeline.h"
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
NS_TIMELINE_BEGIN
|
||||
|
||||
Timeline* Timeline::create()
|
||||
{
|
||||
Timeline* object = new Timeline();
|
||||
if (object)
|
||||
{
|
||||
object->autorelease();
|
||||
return object;
|
||||
}
|
||||
CC_SAFE_DELETE(object);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Timeline::Timeline()
|
||||
: _currentKeyFrame(nullptr)
|
||||
, _currentKeyFrameIndex(0)
|
||||
, _fromIndex(0)
|
||||
, _toIndex(0)
|
||||
, _betweenDuration(0)
|
||||
, _actionTag(0)
|
||||
, _ActionTimeline(nullptr)
|
||||
, _node(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
Timeline::~Timeline()
|
||||
{
|
||||
}
|
||||
|
||||
void Timeline::gotoFrame(int frameIndex)
|
||||
{
|
||||
if(_frames.size() == 0)
|
||||
return;
|
||||
|
||||
binarySearchKeyFrame(frameIndex);
|
||||
apply(frameIndex);
|
||||
}
|
||||
|
||||
void Timeline::stepToFrame(int frameIndex)
|
||||
{
|
||||
if(_frames.size() == 0)
|
||||
return;
|
||||
|
||||
updateCurrentKeyFrame(frameIndex);
|
||||
apply(frameIndex);
|
||||
}
|
||||
|
||||
Timeline* Timeline::clone()
|
||||
{
|
||||
Timeline* timeline = Timeline::create();
|
||||
timeline->_actionTag = _actionTag;
|
||||
|
||||
for (auto frame : _frames)
|
||||
{
|
||||
Frame* newFrame = frame->clone();
|
||||
timeline->addFrame(newFrame);
|
||||
}
|
||||
|
||||
return timeline;
|
||||
}
|
||||
|
||||
void Timeline::addFrame(Frame* frame)
|
||||
{
|
||||
_frames.pushBack(frame);
|
||||
frame->setTimeline(this);
|
||||
}
|
||||
|
||||
void Timeline::insertFrame(Frame* frame, int index)
|
||||
{
|
||||
_frames.insert(index, frame);
|
||||
frame->setTimeline(this);
|
||||
}
|
||||
|
||||
void Timeline::removeFrame(Frame* frame)
|
||||
{
|
||||
_frames.eraseObject(frame);
|
||||
frame->setTimeline(NULL);
|
||||
}
|
||||
|
||||
void Timeline::setNode(Node* node)
|
||||
{
|
||||
for (auto frame : _frames)
|
||||
{
|
||||
frame->setNode(node);
|
||||
}
|
||||
}
|
||||
|
||||
Node* Timeline::getNode() const
|
||||
{
|
||||
return _node;
|
||||
}
|
||||
|
||||
void Timeline::apply(int frameIndex)
|
||||
{
|
||||
if (_currentKeyFrame)
|
||||
{
|
||||
float currentPercent = _betweenDuration == 0 ? 0 : (frameIndex - _currentKeyFrameIndex) / (float)_betweenDuration;
|
||||
_currentKeyFrame->apply(currentPercent);
|
||||
}
|
||||
}
|
||||
|
||||
void Timeline::binarySearchKeyFrame(int frameIndex)
|
||||
{
|
||||
Frame *from = NULL;
|
||||
Frame *to = NULL;
|
||||
|
||||
long length = _frames.size();
|
||||
bool needEnterFrame = false;
|
||||
|
||||
do
|
||||
{
|
||||
if (frameIndex < _frames.at(0)->getFrameIndex())
|
||||
{
|
||||
if(_currentKeyFrameIndex >= _frames.at(0)->getFrameIndex())
|
||||
needEnterFrame = true;
|
||||
|
||||
from = to = _frames.at(0);
|
||||
_currentKeyFrameIndex = 0;
|
||||
_betweenDuration = _frames.at(0)->getFrameIndex();
|
||||
break;
|
||||
}
|
||||
else if(frameIndex >= _frames.at(length - 1)->getFrameIndex())
|
||||
{
|
||||
from = to = _frames.at(length - 1);
|
||||
_currentKeyFrameIndex = _frames.at(length - 1)->getFrameIndex();
|
||||
_betweenDuration = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
int target = -1;
|
||||
int low=0,high=length-1,mid;
|
||||
while(low<=high){
|
||||
mid=(low+high)/2;
|
||||
if(frameIndex >= _frames.at(mid)->getFrameIndex() && frameIndex < _frames.at(mid+1)->getFrameIndex())
|
||||
{
|
||||
target = mid;
|
||||
break;
|
||||
}
|
||||
if(_frames.at(mid)->getFrameIndex()>frameIndex)
|
||||
high=mid-1;
|
||||
else
|
||||
low=mid+1;
|
||||
}
|
||||
|
||||
from = _frames.at(target);
|
||||
to = _frames.at(target+1);
|
||||
|
||||
if(target == 0 && _currentKeyFrameIndex<from->getFrameIndex())
|
||||
needEnterFrame = true;
|
||||
|
||||
_currentKeyFrameIndex = from->getFrameIndex();
|
||||
_betweenDuration = to->getFrameIndex() - from->getFrameIndex();
|
||||
} while (0);
|
||||
|
||||
if(needEnterFrame || _currentKeyFrame != from)
|
||||
{
|
||||
_currentKeyFrame = from;
|
||||
_currentKeyFrame->onEnter(to);
|
||||
}
|
||||
}
|
||||
|
||||
void Timeline::updateCurrentKeyFrame(int frameIndex)
|
||||
{
|
||||
//! If play to current frame's front or back, then find current frame again
|
||||
if (frameIndex < _currentKeyFrameIndex || frameIndex >= _currentKeyFrameIndex + _betweenDuration)
|
||||
{
|
||||
Frame *from = nullptr;
|
||||
Frame *to = nullptr;
|
||||
|
||||
do
|
||||
{
|
||||
long length = _frames.size();
|
||||
|
||||
if (frameIndex < _frames.at(0)->getFrameIndex())
|
||||
{
|
||||
from = to = _frames.at(0);
|
||||
_currentKeyFrameIndex = 0;
|
||||
_betweenDuration = _frames.at(0)->getFrameIndex();
|
||||
break;
|
||||
}
|
||||
else if(frameIndex >= _frames.at(length - 1)->getFrameIndex())
|
||||
{
|
||||
from = to = _frames.at(length - 1);
|
||||
_currentKeyFrameIndex = _frames.at(length - 1)->getFrameIndex();
|
||||
_betweenDuration = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
_fromIndex = _toIndex;
|
||||
from = _frames.at(_fromIndex);
|
||||
_currentKeyFrameIndex = from->getFrameIndex();
|
||||
|
||||
_toIndex = _fromIndex + 1;
|
||||
if (_toIndex >= length)
|
||||
{
|
||||
_toIndex = 0;
|
||||
}
|
||||
|
||||
to = _frames.at(_toIndex);
|
||||
|
||||
if (frameIndex == from->getFrameIndex())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (frameIndex < from->getFrameIndex() || frameIndex >= to->getFrameIndex());
|
||||
|
||||
_betweenDuration = to->getFrameIndex() - from->getFrameIndex();
|
||||
|
||||
} while (0);
|
||||
|
||||
_currentKeyFrame = from;
|
||||
_currentKeyFrame->onEnter(to);
|
||||
}
|
||||
}
|
||||
|
||||
NS_TIMELINE_END
|
|
@ -0,0 +1,85 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2013 cocos2d-x.org
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CCTIMELINE_H__
|
||||
#define __CCTIMELINE_H__
|
||||
|
||||
#include "CCFrame.h"
|
||||
#include "CCTimelineMacro.h"
|
||||
|
||||
NS_TIMELINE_BEGIN
|
||||
|
||||
class ActionTimeline;
|
||||
|
||||
class Timeline : public cocos2d::Ref
|
||||
{
|
||||
public:
|
||||
static Timeline* create();
|
||||
|
||||
Timeline();
|
||||
virtual ~Timeline();
|
||||
|
||||
virtual void gotoFrame(int frameIndex);
|
||||
virtual void stepToFrame(int frameIndex);
|
||||
|
||||
virtual const cocos2d::Vector<Frame*>& getFrames() const { return _frames; }
|
||||
|
||||
virtual void addFrame(Frame* frame);
|
||||
virtual void insertFrame(Frame* frame, int index);
|
||||
virtual void removeFrame(Frame* frame);
|
||||
|
||||
virtual void setActionTag(int tag) { _actionTag = tag; }
|
||||
virtual int getActionTag() const { return _actionTag; }
|
||||
|
||||
virtual void setNode(cocos2d::Node* node);
|
||||
virtual cocos2d::Node* getNode() const;
|
||||
|
||||
virtual void setActionTimeline(ActionTimeline* action) { _ActionTimeline = action; }
|
||||
virtual ActionTimeline* getActionTimeline() const { return _ActionTimeline; }
|
||||
|
||||
virtual Timeline* clone();
|
||||
|
||||
protected:
|
||||
virtual void apply(int frameIndex);
|
||||
|
||||
virtual void binarySearchKeyFrame (int frameIndex);
|
||||
virtual void updateCurrentKeyFrame(int frameIndex);
|
||||
|
||||
cocos2d::Vector<Frame*> _frames;
|
||||
Frame* _currentKeyFrame;
|
||||
int _currentKeyFrameIndex;
|
||||
|
||||
int _fromIndex;
|
||||
int _toIndex;
|
||||
int _betweenDuration;
|
||||
int _actionTag;
|
||||
|
||||
ActionTimeline* _ActionTimeline;
|
||||
cocos2d::Node* _node;
|
||||
};
|
||||
|
||||
NS_TIMELINE_END
|
||||
|
||||
|
||||
#endif /*__CCTIMELINE_H__*/
|
|
@ -0,0 +1,38 @@
|
|||
/****************************************************************************
|
||||
Copyright (c) 2010-2012 cocos2d-x.org
|
||||
Copyright (c) 2013-2014 Chukong Technologies
|
||||
|
||||
http://www.cocos2d-x.org
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
****************************************************************************/
|
||||
#ifndef __CC_TIMELINE_MACROS_H__
|
||||
#define __CC_TIMELINE_MACROS_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define NS_TIMELINE_BEGIN namespace cocostudio { namespace timeline{
|
||||
#define NS_TIMELINE_END }}
|
||||
#define USING_NS_TIMELINE using namespace cocostudio::timeline;
|
||||
#else
|
||||
#define NS_TIMELINE_BEGIN
|
||||
#define NS_TIMELINE_END
|
||||
#define USING_NS_TIMELINE
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -53,6 +53,11 @@ WidgetReader/TextAtlasReader/TextAtlasReader.cpp \
|
|||
WidgetReader/TextBMFontReader/TextBMFontReader.cpp \
|
||||
WidgetReader/TextFieldReader/TextFieldReader.cpp \
|
||||
WidgetReader/TextReader/TextReader.cpp \
|
||||
ActionTimeline/CCNodeReader.cpp \
|
||||
ActionTimeline/CCActionTimelineCache.cpp \
|
||||
ActionTimeline/CCFrame.cpp \
|
||||
ActionTimeline/CCTimeline.cpp \
|
||||
ActionTimeline/CCActionTimeline.cpp \
|
||||
|
||||
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/.. \
|
||||
$(LOCAL_PATH)/../../../external
|
||||
|
|
|
@ -373,4 +373,4 @@ ActionInterval* ActionTintFrame::getAction(float fDuration)
|
|||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -188,4 +188,4 @@ float ActionFrameEasing::easeValue(float t)
|
|||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -222,4 +222,4 @@ void ActionObject::simulationActionUpdate(float dt)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -494,6 +494,8 @@ Rect Armature::getBoundingBox() const
|
|||
if (Bone *bone = dynamic_cast<Bone *>(object))
|
||||
{
|
||||
Rect r = bone->getDisplayManager()->getBoundingBox();
|
||||
if (r.equals(Rect::ZERO))
|
||||
continue;
|
||||
|
||||
if(first)
|
||||
{
|
||||
|
|
|
@ -1185,8 +1185,22 @@ ContourData *DataReaderHelper::decodeContour(tinyxml2::XMLElement *contourXML, D
|
|||
void DataReaderHelper::addDataFromJsonCache(const std::string& fileContent, DataInfo *dataInfo)
|
||||
{
|
||||
rapidjson::Document json;
|
||||
|
||||
json.Parse<0>(fileContent.c_str());
|
||||
rapidjson::StringStream stream(fileContent.c_str());
|
||||
|
||||
if (fileContent.size() >= 3) {
|
||||
// Skip BOM if exists
|
||||
const unsigned char* c = (const unsigned char *)fileContent.c_str();
|
||||
unsigned bom = c[0] | (c[1] << 8) | (c[2] << 16);
|
||||
|
||||
if (bom == 0xBFBBEF) // UTF8 BOM
|
||||
{
|
||||
stream.Take();
|
||||
stream.Take();
|
||||
stream.Take();
|
||||
}
|
||||
}
|
||||
|
||||
json.ParseStream<0>(stream);
|
||||
if (json.HasParseError()) {
|
||||
CCLOG("GetParseError %s\n",json.GetParseError());
|
||||
}
|
||||
|
|
|
@ -181,7 +181,8 @@ Widget* GUIReader::widgetFromJsonFile(const char *fileName)
|
|||
{
|
||||
std::string jsonpath;
|
||||
rapidjson::Document jsonDict;
|
||||
jsonpath = CCFileUtils::getInstance()->fullPathForFilename(fileName);
|
||||
jsonpath = fileName;
|
||||
// jsonpath = CCFileUtils::getInstance()->fullPathForFilename(fileName);
|
||||
size_t pos = jsonpath.find_last_of('/');
|
||||
m_strFilePath = jsonpath.substr(0,pos+1);
|
||||
std::string contentStr = FileUtils::getInstance()->getStringFromFile(jsonpath);
|
||||
|
|
|
@ -59,13 +59,14 @@ public:
|
|||
*/
|
||||
const cocos2d::Size getFileDesignSize(const char* fileName) const;
|
||||
|
||||
const std::string& getFilePath() const { return m_strFilePath; };
|
||||
void setFilePath(const std::string& strFilePath) { m_strFilePath = strFilePath; }
|
||||
const std::string& getFilePath() const { return m_strFilePath; }
|
||||
|
||||
void registerTypeAndCallBack(const std::string& classType,
|
||||
cocos2d::ObjectFactory::Instance ins,
|
||||
Ref* object,
|
||||
SEL_ParseEvent callBack);
|
||||
|
||||
|
||||
protected:
|
||||
GUIReader();
|
||||
~GUIReader();
|
||||
|
|
|
@ -47,6 +47,11 @@ set(CS_SRC
|
|||
WidgetReader/TextBMFontReader/TextBMFontReader.cpp
|
||||
WidgetReader/TextFieldReader/TextFieldReader.cpp
|
||||
WidgetReader/TextReader/TextReader.cpp
|
||||
ActionTimeline/CCActionTimeline.cpp
|
||||
ActionTimeline/CCActionTimelineCache.cpp
|
||||
ActionTimeline/CCFrame.cpp
|
||||
ActionTimeline/CCNodeReader.cpp
|
||||
ActionTimeline/CCTimeLine.cpp
|
||||
)
|
||||
|
||||
include_directories(
|
||||
|
|
|
@ -58,5 +58,10 @@ THE SOFTWARE.
|
|||
#include "cocostudio/CCSGUIReader.h"
|
||||
#include "cocostudio/CCSSceneReader.h"
|
||||
#include "cocostudio/TriggerBase.h"
|
||||
#include "cocostudio/ActionTimeline/CCNodeReader.h"
|
||||
#include "cocostudio/ActionTimeline/CCActionTimelineCache.h"
|
||||
#include "cocostudio/ActionTimeline/CCFrame.h"
|
||||
#include "cocostudio/ActionTimeline/CCTimeLine.h"
|
||||
#include "cocostudio/ActionTimeline/CCActionTimeline.h"
|
||||
|
||||
#endif
|
||||
|
|
|
@ -224,4 +224,4 @@ bool DictionaryHelper::checkObjectExist_json(const rapidjson::Value &root, int i
|
|||
return bRet;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,11 @@
|
|||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\ActionTimeline\CCActionTimeline.cpp" />
|
||||
<ClCompile Include="..\ActionTimeline\CCFrame.cpp" />
|
||||
<ClCompile Include="..\ActionTimeline\CCNodeReader.cpp" />
|
||||
<ClCompile Include="..\ActionTimeline\CCActionTimelineCache.cpp" />
|
||||
<ClCompile Include="..\ActionTimeline\CCTimeLine.cpp" />
|
||||
<ClCompile Include="..\CCActionFrame.cpp" />
|
||||
<ClCompile Include="..\CCActionFrameEasing.cpp" />
|
||||
<ClCompile Include="..\CCActionManagerEx.cpp" />
|
||||
|
@ -71,6 +76,12 @@
|
|||
<ClInclude Include="..\..\..\..\external\json\reader.h" />
|
||||
<ClInclude Include="..\..\..\..\external\json\stringbuffer.h" />
|
||||
<ClInclude Include="..\..\..\..\external\json\writer.h" />
|
||||
<ClInclude Include="..\ActionTimeline\CCActionTimeline.h" />
|
||||
<ClInclude Include="..\ActionTimeline\CCFrame.h" />
|
||||
<ClInclude Include="..\ActionTimeline\CCNodeReader.h" />
|
||||
<ClInclude Include="..\ActionTimeline\CCActionTimelineCache.h" />
|
||||
<ClInclude Include="..\ActionTimeline\CCTimeLine.h" />
|
||||
<ClInclude Include="..\ActionTimeline\CCTimelineMacro.h" />
|
||||
<ClInclude Include="..\CCActionFrame.h" />
|
||||
<ClInclude Include="..\CCActionFrameEasing.h" />
|
||||
<ClInclude Include="..\CCActionManagerEx.h" />
|
||||
|
@ -103,7 +114,6 @@
|
|||
<ClInclude Include="..\CCTween.h" />
|
||||
<ClInclude Include="..\CCUtilMath.h" />
|
||||
<ClInclude Include="..\DictionaryHelper.h" />
|
||||
<ClInclude Include="..\ObjectFactory.h" />
|
||||
<ClInclude Include="..\TriggerBase.h" />
|
||||
<ClInclude Include="..\TriggerMng.h" />
|
||||
<ClInclude Include="..\TriggerObj.h" />
|
||||
|
|
|
@ -82,6 +82,9 @@
|
|||
<Filter Include="reader\WidgetReader\TextReader">
|
||||
<UniqueIdentifier>{bc251d28-036e-4272-852b-bd25fd110b33}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="TimelineAction">
|
||||
<UniqueIdentifier>{2d371825-3c46-4901-850c-3bccf6b49efc}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\CCComAttribute.cpp">
|
||||
|
@ -228,6 +231,21 @@
|
|||
<ClCompile Include="..\WidgetReader\PageViewReader\PageViewReader.cpp">
|
||||
<Filter>reader\WidgetReader\PageViewReader</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\ActionTimeline\CCNodeReader.cpp">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\ActionTimeline\CCActionTimelineCache.cpp">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\ActionTimeline\CCActionTimeline.cpp">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\ActionTimeline\CCFrame.cpp">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\ActionTimeline\CCTimeLine.cpp">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\CCComAttribute.h">
|
||||
|
@ -353,9 +371,6 @@
|
|||
<ClInclude Include="..\CCActionObject.h">
|
||||
<Filter>action</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ObjectFactory.h">
|
||||
<Filter>trigger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\TriggerBase.h">
|
||||
<Filter>trigger</Filter>
|
||||
</ClInclude>
|
||||
|
@ -413,5 +428,23 @@
|
|||
<ClInclude Include="..\WidgetReader\PageViewReader\PageViewReader.h">
|
||||
<Filter>reader\WidgetReader\PageViewReader</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ActionTimeline\CCNodeReader.h">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ActionTimeline\CCActionTimelineCache.h">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ActionTimeline\CCActionTimeline.h">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ActionTimeline\CCFrame.h">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ActionTimeline\CCTimeLine.h">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\ActionTimeline\CCTimelineMacro.h">
|
||||
<Filter>TimelineAction</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
|
@ -7,4 +7,4 @@
|
|||
#include "Mat4.h"
|
||||
#include "Quaternion.h"
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -33,4 +33,4 @@
|
|||
#endif
|
||||
|
||||
|
||||
#endif // __CCMATHBASE_H__
|
||||
#endif // __CCMATHBASE_H__
|
||||
|
|
|
@ -24,14 +24,14 @@ set(COCOS_NETWORK_SRC
|
|||
${PLATFORM_SRC}
|
||||
)
|
||||
|
||||
IF ( WIN32 )
|
||||
set(COCOS_NETWORK_LINK
|
||||
libcurl_imp
|
||||
${PLATFORM_LINK}
|
||||
)
|
||||
IF (WIN32 AND NOT MINGW)
|
||||
set(COCOS_NETWORK_LINK
|
||||
libcurl_imp
|
||||
${PLATFORM_LINK}
|
||||
)
|
||||
ELSE()
|
||||
set(COCOS_NETWORK_LINK
|
||||
curl
|
||||
${PLATFORM_LINK}
|
||||
)
|
||||
set(COCOS_NETWORK_LINK
|
||||
curl
|
||||
${PLATFORM_LINK}
|
||||
)
|
||||
ENDIF()
|
||||
|
|
|
@ -512,6 +512,7 @@ static Data getData(const std::string& filename, bool forString)
|
|||
Data ret;
|
||||
unsigned char* buffer = nullptr;
|
||||
ssize_t size = 0;
|
||||
size_t readsize;
|
||||
const char* mode = nullptr;
|
||||
if (forString)
|
||||
mode = "rt";
|
||||
|
@ -538,11 +539,16 @@ static Data getData(const std::string& filename, bool forString)
|
|||
buffer = (unsigned char*)malloc(sizeof(unsigned char) * size);
|
||||
}
|
||||
|
||||
size = fread(buffer, sizeof(unsigned char), size, fp);
|
||||
readsize = fread(buffer, sizeof(unsigned char), size, fp);
|
||||
fclose(fp);
|
||||
|
||||
if (forString && readsize < size)
|
||||
{
|
||||
buffer[readsize] = '\0';
|
||||
}
|
||||
} while (0);
|
||||
|
||||
if (nullptr == buffer || 0 == size)
|
||||
if (nullptr == buffer || 0 == readsize)
|
||||
{
|
||||
std::string msg = "Get data from file(";
|
||||
msg.append(filename).append(") failed!");
|
||||
|
@ -550,7 +556,7 @@ static Data getData(const std::string& filename, bool forString)
|
|||
}
|
||||
else
|
||||
{
|
||||
ret.fastSet(buffer, size);
|
||||
ret.fastSet(buffer, readsize);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -265,7 +265,7 @@ void GLViewProtocol::handleTouchesBegin(int num, intptr_t ids[], float xs[], flo
|
|||
touch->setTouchInfo(unusedIndex, (x - _viewPortRect.origin.x) / _scaleX,
|
||||
(y - _viewPortRect.origin.y) / _scaleY);
|
||||
|
||||
CCLOGINFO("x = %f y = %f", pTouch->getLocationInView().x, pTouch->getLocationInView().y);
|
||||
CCLOGINFO("x = %f y = %f", touch->getLocationInView().x, touch->getLocationInView().y);
|
||||
|
||||
g_touchIdReorderMap.insert(std::make_pair(id, unusedIndex));
|
||||
touchEvent._touches.push_back(touch);
|
||||
|
|
|
@ -16,4 +16,4 @@ int getDPIJNI()
|
|||
return ret;
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
} // extern "C"
|
||||
|
|
|
@ -58,4 +58,4 @@ void LuaLog(const char * format)
|
|||
|
||||
NS_CC_END
|
||||
|
||||
#endif // CC_PLATFORM_IOS
|
||||
#endif // CC_PLATFORM_IOS
|
||||
|
|
|
@ -136,4 +136,4 @@ private:
|
|||
|
||||
NS_CC_END
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include "cocos2d.h"
|
||||
|
|
|
@ -419,4 +419,4 @@ void SHA1ConvertMessageToString(uint8_t *hash_binary, char* hash_string)
|
|||
hash_string[2*i + 1] = alphabet[hash_binary[i] % 16];
|
||||
}
|
||||
hash_string[SHA1HashSize * 2] = '\0';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,4 +90,4 @@ int SHA1Result( SHA1Context *,
|
|||
void SHA1ConvertMessageToString(uint8_t *hash_binary, char* hash_string);
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -62,4 +62,4 @@ HRESULT Direct3DContentProvider::PrepareResources(_In_ const LARGE_INTEGER* pres
|
|||
HRESULT Direct3DContentProvider::Draw(_In_ ID3D11Device1* device, _In_ ID3D11DeviceContext1* context, _In_ ID3D11RenderTargetView* renderTargetView)
|
||||
{
|
||||
return m_controller->Draw(device, context, renderTargetView);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,4 +49,4 @@ public:
|
|||
private:
|
||||
PhoneDirect3DXamlAppComponent::Direct3DInterop^ m_controller;
|
||||
Microsoft::WRL::ComPtr<IDrawingSurfaceRuntimeHostNative> m_host;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -185,4 +185,4 @@ bool Direct3DInterop::SendCocos2dEvent(Cocos2dEvent event)
|
|||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -81,4 +81,4 @@ protected private:
|
|||
Microsoft::WRL::ComPtr<IWinPhone8XamlD3DWindow> m_eglPhoneWindow;
|
||||
DirectX::XMMATRIX m_orientationMatrix;
|
||||
float m_aspectRatio;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -45,4 +45,4 @@ namespace PhoneDirect3DXamlAppComponent
|
|||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -43,4 +43,4 @@ protected private:
|
|||
|
||||
};
|
||||
|
||||
#endif // 0
|
||||
#endif // 0
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include "cocos2d.h"
|
||||
|
|
|
@ -70,4 +70,4 @@ void BatchCommand::execute()
|
|||
_textureAtlas->drawQuads();
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -50,4 +50,4 @@ void CustomCommand::execute()
|
|||
}
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -177,4 +177,4 @@ void MeshCommand::execute()
|
|||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -34,7 +34,7 @@ NS_CC_BEGIN
|
|||
|
||||
class GLProgramState;
|
||||
class GLProgram;
|
||||
class Uniform;
|
||||
struct Uniform;
|
||||
|
||||
//it is a common mesh
|
||||
class MeshCommand : public RenderCommand
|
||||
|
|
|
@ -97,4 +97,4 @@ void QuadCommand::useMaterial() const
|
|||
_glProgramState->apply(_mv);
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -60,4 +60,4 @@ void RenderCommand::printID()
|
|||
printf("Command Depth: %f\n", _globalOrder);
|
||||
}
|
||||
|
||||
NS_CC_END
|
||||
NS_CC_END
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
--------------------------------
|
||||
-- @module ActionTimelineData
|
||||
-- @extend Ref
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#ActionTimelineData] setActionTag
|
||||
-- @param self
|
||||
-- @param #int int
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#ActionTimelineData] getActionTag
|
||||
-- @param self
|
||||
-- @return int#int ret (return value: int)
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#ActionTimelineData] create
|
||||
-- @param self
|
||||
-- @param #int int
|
||||
-- @return timeline::ActionTimelineData#timeline::ActionTimelineData ret (return value: ccs.timeline::ActionTimelineData)
|
||||
|
||||
return nil
|
|
@ -3,6 +3,11 @@
|
|||
-- @module GUIReader
|
||||
-- @extend Ref
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#GUIReader] setFilePath
|
||||
-- @param self
|
||||
-- @param #string str
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#GUIReader] widgetFromJsonFile
|
||||
-- @param self
|
||||
|
|
|
@ -43,11 +43,6 @@
|
|||
-- @param self
|
||||
-- @return color4b_table#color4b_table ret (return value: color4b_table)
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] getCommonLineHeight
|
||||
-- @param self
|
||||
-- @return int#int ret (return value: int)
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] setWidth
|
||||
-- @param self
|
||||
|
@ -90,6 +85,11 @@
|
|||
-- @param self
|
||||
-- @return FontAtlas#FontAtlas ret (return value: cc.FontAtlas)
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] setLineHeight
|
||||
-- @param self
|
||||
-- @param #float float
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] setSystemFontSize
|
||||
-- @param self
|
||||
|
@ -120,6 +120,11 @@
|
|||
-- @param #color4b_table color4b
|
||||
-- @param #int int
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] getAdditionalKerning
|
||||
-- @param self
|
||||
-- @return float#float ret (return value: float)
|
||||
|
||||
--------------------------------
|
||||
-- overload function: setCharMap(cc.Texture2D, int, int, int)
|
||||
--
|
||||
|
@ -155,6 +160,11 @@
|
|||
-- @param self
|
||||
-- @param #cc.TextVAlignment textvalignment
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] getLineHeight
|
||||
-- @param self
|
||||
-- @return float#float ret (return value: float)
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] getTTFConfig
|
||||
-- @param self
|
||||
|
@ -191,6 +201,11 @@
|
|||
-- @param #int int
|
||||
-- @return Sprite#Sprite ret (return value: cc.Sprite)
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] setAdditionalKerning
|
||||
-- @param self
|
||||
-- @param #float float
|
||||
|
||||
--------------------------------
|
||||
-- @function [parent=#Label] getSystemFontSize
|
||||
-- @param self
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue