From 409260c002d5376863f586ba9f21c3b6899e08d3 Mon Sep 17 00:00:00 2001 From: Walzer Date: Thu, 9 Jun 2011 17:08:20 +0800 Subject: [PATCH 01/11] fix typo in changelog --- CHANGELOG | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7000f8af91..7f0399fc19 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -11,8 +11,8 @@ cocos2d-0.99.5-x-0.8.4 @ May.26,2011 Feature #509 For integrting IME, we had to rotate UI to landscape by default Bug #499 CCRGBAProtocol isn't inherited and implemented in CCMenuItemSprite [ios] - Bug #493 the return value of CCileUtils::getWriteablePath() is not end with '/' - Bug #508 Problem in runnint Tests in Retina resolution since 0.8.2 + Bug #493 the return value of CCFileUtils::getWriteablePath() is not end with '/' + Bug #508 Problem in running Tests in Retina resolution since 0.8.2 [win32] Bug #492 CCFileUtils::fullPathFromRelativeFile forget to consider the path separated by '\' Feature #489 Use GetCurrentDirectory instead of GetModuleFileName in CCFileUtils_win32.cpp From 1591c7edc8ebf8aefac07603d7b2831ef1c46c26 Mon Sep 17 00:00:00 2001 From: liswei Date: Fri, 10 Jun 2011 17:51:37 +0800 Subject: [PATCH 02/11] fixed #512 fix warnings in /Wall flag --- cocos2dx/Android.mk | 2 +- cocos2dx/CCConfiguration.cpp | 18 +++---- cocos2dx/CCDirector.cpp | 2 + cocos2dx/CCScheduler.cpp | 17 +++--- cocos2dx/actions/CCAction.cpp | 3 ++ cocos2dx/actions/CCActionGrid3D.cpp | 2 + cocos2dx/actions/CCActionInstant.cpp | 2 + cocos2dx/actions/CCActionInterval.cpp | 2 + cocos2dx/actions/CCActionManager.cpp | 6 +-- cocos2dx/actions/CCActionTiledGrid.cpp | 2 + cocos2dx/base_nodes/CCAtlasNode.cpp | 8 +-- cocos2dx/base_nodes/CCNode.cpp | 54 +++++++++---------- cocos2dx/cocoa/CCData.cpp | 2 + cocos2dx/cocoa/CCNS.cpp | 12 ++--- cocos2dx/cocoa/CCObject.cpp | 1 + cocos2dx/effects/CCGrabber.cpp | 2 + cocos2dx/effects/CCGrid.cpp | 20 +++---- cocos2dx/include/CCAccelerometerDelegate.h | 2 +- cocos2dx/include/CCAction.h | 6 +-- cocos2dx/include/CCActionCamera.h | 18 +++---- cocos2dx/include/CCActionInstant.h | 6 +-- cocos2dx/include/CCIMEDelegate.h | 10 ++-- cocos2dx/include/CCLabelBMFont.h | 8 +-- cocos2dx/include/CCLayer.h | 2 +- cocos2dx/include/CCMenu.h | 4 +- cocos2dx/include/CCMenuItem.h | 10 ++-- cocos2dx/include/CCMotionStreak.h | 8 +-- cocos2dx/include/CCProtocols.h | 4 +- cocos2dx/include/CCRibbon.h | 4 +- cocos2dx/include/CCTextFieldTTF.h | 9 ++++ cocos2dx/include/CCTouch.h | 4 +- cocos2dx/include/CCTouchDelegateProtocol.h | 32 +++++------ cocos2dx/include/CCTouchDispatcher.h | 7 +-- cocos2dx/include/selector_protocol.h | 12 ++--- cocos2dx/label_nodes/CCLabelBMFont.cpp | 2 +- cocos2dx/label_nodes/CCLabelTTF.cpp | 6 +-- .../CCLayer.cpp | 6 ++- .../CCTransition.cpp | 1 + cocos2dx/menu_nodes/CCMenu.cpp | 12 +++-- cocos2dx/misc_nodes/CCRenderTexture.cpp | 3 ++ cocos2dx/particle_nodes/CCParticleSystem.cpp | 2 + cocos2dx/platform/CCFileUtils.cpp | 14 +++-- cocos2dx/platform/CCImage.cpp | 7 +-- cocos2dx/platform/CCImage.h | 2 +- cocos2dx/platform/CCPlatformConfig.h | 2 +- cocos2dx/platform/CCPlatformMacros.h | 9 ++-- cocos2dx/platform/CCSAXParser.cpp | 1 + .../platform/android/CCEGLView_android.cpp | 6 +-- cocos2dx/platform/android/Cocos2dJni.cpp | 2 +- cocos2dx/platform/platform.cpp | 1 + .../platform/win32/CCAccelerometer_win32.h | 4 +- cocos2dx/platform/win32/CCEGLView_win32.cpp | 2 +- cocos2dx/platform/win32/CCFileUtils_win32.cpp | 2 + cocos2dx/platform/win32/CCImage_win32.cpp | 6 +-- cocos2dx/sprite_nodes/CCSprite.cpp | 3 ++ cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp | 2 +- cocos2dx/sprite_nodes/CCSpriteFrame.cpp | 1 + cocos2dx/sprite_nodes/CCSpriteFrameCache.cpp | 10 ++-- cocos2dx/support/data_support/ccCArray.h | 10 ++-- cocos2dx/text_input_node/CCTextFieldTTF.cpp | 6 +-- cocos2dx/textures/CCTexture2D.cpp | 13 ++--- cocos2dx/textures/CCTextureAtlas.cpp | 16 +++--- cocos2dx/textures/CCTextureCache.cpp | 4 +- .../tileMap_parallax_nodes/CCParallaxNode.cpp | 3 ++ .../tileMap_parallax_nodes/CCTMXLayer.cpp | 13 +++-- .../CCTMXObjectGroup.cpp | 4 +- .../tileMap_parallax_nodes/CCTMXTiledMap.cpp | 4 +- .../tileMap_parallax_nodes/CCTMXXMLParser.cpp | 29 +++++----- .../tileMap_parallax_nodes/CCTileMapAtlas.cpp | 4 +- .../touch_dispatcher/CCTouchDispatcher.cpp | 2 + 70 files changed, 294 insertions(+), 221 deletions(-) diff --git a/cocos2dx/Android.mk b/cocos2dx/Android.mk index 394737a90c..b3e308ac92 100644 --- a/cocos2dx/Android.mk +++ b/cocos2dx/Android.mk @@ -139,6 +139,6 @@ LOCAL_LDLIBS := -L$(call host-path, $(LOCAL_PATH)/platform/third_party/android/l -lskia # define the macro to compile through support/zip_support/ioapi.c -LOCAL_CFLAGS := -DUSE_FILE32API +LOCAL_CFLAGS := -DUSE_FILE32API -Wno-unused-value include $(BUILD_SHARED_LIBRARY) diff --git a/cocos2dx/CCConfiguration.cpp b/cocos2dx/CCConfiguration.cpp index 8b3be61b37..1f0695f958 100644 --- a/cocos2dx/CCConfiguration.cpp +++ b/cocos2dx/CCConfiguration.cpp @@ -36,14 +36,14 @@ static CCConfiguration g_SharedConfiguration; static char *g_pGlExtensions; CCConfiguration::CCConfiguration(void) -: m_bSupportsBGRA8888(false) -, m_bSupportsDiscardFramebuffer(false) -, m_bSupportsNPOT(false) -, m_bSupportsPVRTC(false) +:m_nMaxTextureSize(0) , m_nMaxModelviewStackDepth(0) -, m_nMaxSamplesAllowed(0) -, m_nMaxTextureSize(0) +, m_bSupportsPVRTC(false) +, m_bSupportsNPOT(false) +, m_bSupportsBGRA8888(false) +, m_bSupportsDiscardFramebuffer(false) , m_uOSVersion(0) +, m_nMaxSamplesAllowed(0) { } @@ -90,15 +90,15 @@ CCGlesVersion CCConfiguration::getGlesVersion() { // To get the Opengl ES version std::string strVersion((char *)glGetString(GL_VERSION)); - if (strVersion.find("1.0") != -1) + if ((int)strVersion.find("1.0") != -1) { return GLES_VER_1_0; } - else if (strVersion.find("1.1") != -1) + else if ((int)strVersion.find("1.1") != -1) { return GLES_VER_1_1; } - else if (strVersion.find("2.0") != -1) + else if ((int)strVersion.find("2.0") != -1) { return GLES_VER_2_0; } diff --git a/cocos2dx/CCDirector.cpp b/cocos2dx/CCDirector.cpp index f1532716ea..66d6d272be 100644 --- a/cocos2dx/CCDirector.cpp +++ b/cocos2dx/CCDirector.cpp @@ -479,6 +479,7 @@ CCSize CCDirector::getDisplaySizeInPixels(void) void CCDirector::reshapeProjection(CCSize newWindowSize) { + CC_UNUSED_PARAM(newWindowSize); m_obWinSizeInPoints = m_pobOpenGLView->getSize(); m_obWinSizeInPixels = CCSizeMake(m_obWinSizeInPoints.width * m_fContentScaleFactor, m_obWinSizeInPoints.height * m_fContentScaleFactor); @@ -748,6 +749,7 @@ tPixelFormat CCDirector::getPiexFormat(void) bool CCDirector::setDirectorType(ccDirectorType obDirectorType) { + CC_UNUSED_PARAM(obDirectorType); // we only support CCDisplayLinkDirector CCDirector::sharedDirector(); diff --git a/cocos2dx/CCScheduler.cpp b/cocos2dx/CCScheduler.cpp index 09d4437e0e..14d081880f 100644 --- a/cocos2dx/CCScheduler.cpp +++ b/cocos2dx/CCScheduler.cpp @@ -128,14 +128,14 @@ void CCTimer::update(ccTime dt) static CCScheduler *pSharedScheduler; CCScheduler::CCScheduler(void) -: m_bCurrentTargetSalvaged(false) -, m_fTimeScale(0.0) -, m_pCurrentTarget(NULL) -, m_pHashForSelectors(NULL) -, m_pHashForUpdates(NULL) -, m_pUpdates0List(NULL) +: m_fTimeScale(0.0) , m_pUpdatesNegList(NULL) +, m_pUpdates0List(NULL) , m_pUpdatesPosList(NULL) +, m_pHashForUpdates(NULL) +, m_pHashForSelectors(NULL) +, m_pCurrentTarget(NULL) +, m_bCurrentTargetSalvaged(false) { assert(pSharedScheduler == NULL); } @@ -191,12 +191,15 @@ void CCScheduler::removeHashElement(_hashSelectorEntry *pElement) void CCScheduler::scheduleTimer(CCTimer *pTimer) { + CC_UNUSED_PARAM(pTimer); assert(false); } void CCScheduler::unscheduleTimer(CCTimer *pTimer) { - assert(false); + //CC_UNUSED_PARAM(pTimer); + pTimer = NULL; + assert(false); } void CCScheduler::unscheduleAllTimers() diff --git a/cocos2dx/actions/CCAction.cpp b/cocos2dx/actions/CCAction.cpp index 711cc985ef..be9782c527 100644 --- a/cocos2dx/actions/CCAction.cpp +++ b/cocos2dx/actions/CCAction.cpp @@ -94,11 +94,13 @@ bool CCAction::isDone() void CCAction::step(ccTime dt) { + CC_UNUSED_PARAM(dt); CCLOG("[Action step]. override me"); } void CCAction::update(ccTime time) { + CC_UNUSED_PARAM(time); CCLOG("[Action update]. override me"); } @@ -291,6 +293,7 @@ CCObject *CCFollow::copyWithZone(CCZone *pZone) } void CCFollow::step(ccTime dt) { + CC_UNUSED_PARAM(dt); #define CLAMP(x,y,z) MIN(MAX(x,y),z) if(m_bBoundarySet) diff --git a/cocos2dx/actions/CCActionGrid3D.cpp b/cocos2dx/actions/CCActionGrid3D.cpp index 2d490569f6..f182644b93 100644 --- a/cocos2dx/actions/CCActionGrid3D.cpp +++ b/cocos2dx/actions/CCActionGrid3D.cpp @@ -411,6 +411,7 @@ namespace cocos2d void CCLens3D::update(cocos2d::ccTime time) { + CC_UNUSED_PARAM(time); if (m_bDirty) { int i, j; @@ -601,6 +602,7 @@ namespace cocos2d void CCShaky3D::update(cocos2d::ccTime time) { + CC_UNUSED_PARAM(time); int i, j; for (i = 0; i < (m_sGridSize.x+1); ++i) diff --git a/cocos2dx/actions/CCActionInstant.cpp b/cocos2dx/actions/CCActionInstant.cpp index 98c368c26f..6b1aad7e39 100644 --- a/cocos2dx/actions/CCActionInstant.cpp +++ b/cocos2dx/actions/CCActionInstant.cpp @@ -57,10 +57,12 @@ namespace cocos2d { } void CCActionInstant::step(ccTime dt) { + CC_UNUSED_PARAM(dt); update(1); } void CCActionInstant::update(ccTime time) { + CC_UNUSED_PARAM(time); // ignore } CCFiniteTimeAction * CCActionInstant::reverse() diff --git a/cocos2dx/actions/CCActionInterval.cpp b/cocos2dx/actions/CCActionInterval.cpp index bf177ef4d9..0aa3e744df 100644 --- a/cocos2dx/actions/CCActionInterval.cpp +++ b/cocos2dx/actions/CCActionInterval.cpp @@ -114,6 +114,7 @@ void CCActionInterval::step(ccTime dt) void CCActionInterval::setAmplitudeRate(CGFloat amp) { + CC_UNUSED_PARAM(amp); // Abstract class needs implementation assert(0); } @@ -1710,6 +1711,7 @@ CCObject* CCDelayTime::copyWithZone(cocos2d::CCZone *pZone) void CCDelayTime::update(cocos2d::ccTime time) { + CC_UNUSED_PARAM(time); return; } diff --git a/cocos2dx/actions/CCActionManager.cpp b/cocos2dx/actions/CCActionManager.cpp index adc4f88d4e..ee1d8ee150 100644 --- a/cocos2dx/actions/CCActionManager.cpp +++ b/cocos2dx/actions/CCActionManager.cpp @@ -84,8 +84,8 @@ void CCActionManager::selectorProtocolRelease() } CCActionManager::CCActionManager(void) -: m_pCurrentTarget(NULL), - m_pTargets(NULL), +: m_pTargets(NULL), + m_pCurrentTarget(NULL), m_bCurrentTargetSalvaged(false) { assert(gSharedManager == NULL); @@ -286,7 +286,7 @@ void CCActionManager::removeAction(cocos2d::CCAction *pAction) if (pElement) { unsigned int i = ccArrayGetIndexOfObject(pElement->actions, pAction); - if (i != -1) + if ((int)i != -1) { removeActionAtIndex(i, pElement); } diff --git a/cocos2dx/actions/CCActionTiledGrid.cpp b/cocos2dx/actions/CCActionTiledGrid.cpp index 228435adfc..2813fd776a 100644 --- a/cocos2dx/actions/CCActionTiledGrid.cpp +++ b/cocos2dx/actions/CCActionTiledGrid.cpp @@ -98,6 +98,7 @@ namespace cocos2d void CCShakyTiles3D::update(cocos2d::ccTime time) { + CC_UNUSED_PARAM(time); int i, j; for (i = 0; i < m_sGridSize.x; ++i) @@ -191,6 +192,7 @@ namespace cocos2d void CCShatteredTiles3D::update(cocos2d::ccTime time) { + CC_UNUSED_PARAM(time); int i, j; if (m_bOnce == false) diff --git a/cocos2dx/base_nodes/CCAtlasNode.cpp b/cocos2dx/base_nodes/CCAtlasNode.cpp index 27adc86ab0..b67c9bd840 100644 --- a/cocos2dx/base_nodes/CCAtlasNode.cpp +++ b/cocos2dx/base_nodes/CCAtlasNode.cpp @@ -33,13 +33,13 @@ namespace cocos2d { // CCAtlasNode - Creation & Init CCAtlasNode::CCAtlasNode() -: m_pTextureAtlas(NULL) -, m_bIsOpacityModifyRGB(false) +: m_nItemsPerRow(0) +, m_nItemsPerColumn(0) , m_nItemWidth(0) , m_nItemHeight(0) +, m_pTextureAtlas(NULL) +, m_bIsOpacityModifyRGB(false) , m_cOpacity(0) -, m_nItemsPerRow(0) -, m_nItemsPerColumn(0) { } diff --git a/cocos2dx/base_nodes/CCNode.cpp b/cocos2dx/base_nodes/CCNode.cpp index d92b6e6383..85dc5d588b 100644 --- a/cocos2dx/base_nodes/CCNode.cpp +++ b/cocos2dx/base_nodes/CCNode.cpp @@ -43,35 +43,35 @@ THE SOFTWARE. namespace cocos2d { CCNode::CCNode(void) -:m_bIsRunning(false) -,m_fRotation(0.0f) -,m_fScaleX(1.0f) -,m_fScaleY(1.0f) -,m_tPosition(CCPointZero) -,m_tPositionInPixels(CCPointZero) -,m_tAnchorPointInPixels(CCPointZero) -,m_tAnchorPoint(CCPointZero) -,m_tContentSize(CCSizeZero) -,m_tContentSizeInPixels(CCSizeZero) -// "whole screen" objects. like Scenes and Layers, should set isRelativeAnchorPoint to false -,m_bIsRelativeAnchorPoint(true) -,m_bIsTransformDirty(true) -,m_bIsInverseDirty(true) -#ifdef CC_NODE_TRANSFORM_USING_AFFINE_MATRIX -,m_bIsTransformGLDirty(true) -#endif -,m_fVertexZ(0.0f) -,m_pGrid(NULL) -,m_bIsVisible(true) -,m_nTag(kCCNodeTagInvalid) -,m_nZOrder(0) -// lazy alloc -,m_pCamera(NULL) +: m_nZOrder(0) +, m_fVertexZ(0.0f) +, m_fRotation(0.0f) +, m_fScaleX(1.0f) +, m_fScaleY(1.0f) +, m_tPosition(CCPointZero) +, m_tPositionInPixels(CCPointZero) // children (lazy allocs) -,m_pChildren(NULL) +, m_pChildren(NULL) +// lazy alloc +, m_pCamera(NULL) +, m_pGrid(NULL) +, m_bIsVisible(true) +, m_tAnchorPoint(CCPointZero) +, m_tAnchorPointInPixels(CCPointZero) +, m_tContentSize(CCSizeZero) +, m_tContentSizeInPixels(CCSizeZero) +, m_bIsRunning(false) +, m_pParent(NULL) +// "whole screen" objects. like Scenes and Layers, should set isRelativeAnchorPoint to false +, m_bIsRelativeAnchorPoint(true) +, m_nTag(kCCNodeTagInvalid) // userData is always inited as nil -,m_pUserData(NULL) -,m_pParent(NULL) +, m_pUserData(NULL) +, m_bIsTransformDirty(true) +, m_bIsInverseDirty(true) +#ifdef CC_NODE_TRANSFORM_USING_AFFINE_MATRIX +, m_bIsTransformGLDirty(true) +#endif { // nothing } diff --git a/cocos2dx/cocoa/CCData.cpp b/cocos2dx/cocoa/CCData.cpp index 01539c3fa9..a1cedd823e 100644 --- a/cocos2dx/cocoa/CCData.cpp +++ b/cocos2dx/cocoa/CCData.cpp @@ -67,6 +67,8 @@ void* CCData::bytes(void) //@todo implement CCData* CCData::dataWithBytes(unsigned char *pBytes, int size) { + CC_UNUSED_PARAM(pBytes); + CC_UNUSED_PARAM(size); return NULL; } }//namespace cocos2d diff --git a/cocos2dx/cocoa/CCNS.cpp b/cocos2dx/cocoa/CCNS.cpp index bbf96d9d7a..7e74974f3f 100644 --- a/cocos2dx/cocoa/CCNS.cpp +++ b/cocos2dx/cocoa/CCNS.cpp @@ -64,7 +64,7 @@ bool splitWithForm(const char* pStr, strArray& strs) int nPosRight = content.find('}'); // don't have '{' and '}' - CC_BREAK_IF(nPosLeft == std::string::npos || nPosRight == std::string::npos); + CC_BREAK_IF(nPosLeft == (int)std::string::npos || nPosRight == (int)std::string::npos); // '}' is before '{' CC_BREAK_IF(nPosLeft > nPosRight); @@ -75,7 +75,7 @@ bool splitWithForm(const char* pStr, strArray& strs) int nPos1 = pointStr.find('{'); int nPos2 = pointStr.find('}'); // contain '{' or '}' - CC_BREAK_IF(nPos1 != std::string::npos || nPos2 != std::string::npos); + CC_BREAK_IF(nPos1 != (int)std::string::npos || nPos2 != (int)std::string::npos); split(pointStr, ",", strs); if (strs.size() != 2 || strs[0].length() == 0 || strs[1].length() == 0) @@ -107,19 +107,19 @@ namespace cocos2d int nPosRight = content.find('}'); for (int i = 1; i < 3; ++i) { - if (nPosRight == std::string::npos) + if (nPosRight == (int)std::string::npos) { break; } nPosRight = content.find('}', nPosRight + 1); } - CC_BREAK_IF(nPosLeft == std::string::npos || nPosRight == std::string::npos); + CC_BREAK_IF(nPosLeft == (int)std::string::npos || nPosRight == (int)std::string::npos); content = content.substr(nPosLeft + 1, nPosRight - nPosLeft - 1); int nPointEnd = content.find('}'); - CC_BREAK_IF(nPointEnd == std::string::npos); + CC_BREAK_IF(nPointEnd == (int)std::string::npos); nPointEnd = content.find(',', nPointEnd); - CC_BREAK_IF(nPointEnd == std::string::npos); + CC_BREAK_IF(nPointEnd == (int)std::string::npos); // get the point string and size string std::string pointStr = content.substr(0, nPointEnd); diff --git a/cocos2dx/cocoa/CCObject.cpp b/cocos2dx/cocoa/CCObject.cpp index ed3a66dd4b..2fe509c973 100644 --- a/cocos2dx/cocoa/CCObject.cpp +++ b/cocos2dx/cocoa/CCObject.cpp @@ -30,6 +30,7 @@ namespace cocos2d { CCObject* CCCopying::copyWithZone(CCZone *pZone) { + CC_UNUSED_PARAM(pZone); assert(0); return NULL; } diff --git a/cocos2dx/effects/CCGrabber.cpp b/cocos2dx/effects/CCGrabber.cpp index 7530b0624f..3c98024a07 100644 --- a/cocos2dx/effects/CCGrabber.cpp +++ b/cocos2dx/effects/CCGrabber.cpp @@ -76,6 +76,7 @@ namespace cocos2d void CCGrabber::beforeRender(cocos2d::CCTexture2D *pTexture) { + CC_UNUSED_PARAM(pTexture); // If the gles version is lower than GLES_VER_1_0, // all the functions in CCGrabber return directly. if (m_eGlesVersion <= GLES_VER_1_0) @@ -101,6 +102,7 @@ namespace cocos2d void CCGrabber::afterRender(cocos2d::CCTexture2D *pTexture) { + CC_UNUSED_PARAM(pTexture); // If the gles version is lower than GLES_VER_1_0, // all the functions in CCGrabber return directly. if (m_eGlesVersion <= GLES_VER_1_0) diff --git a/cocos2dx/effects/CCGrid.cpp b/cocos2dx/effects/CCGrid.cpp index 5d78c9bd45..07f124cc97 100644 --- a/cocos2dx/effects/CCGrid.cpp +++ b/cocos2dx/effects/CCGrid.cpp @@ -377,10 +377,10 @@ namespace cocos2d float y1 = y * m_obStep.y; float y2= y1 + m_obStep.y; - GLushort a = x * (m_sGridSize.y + 1) + y; - GLushort b = (x + 1) * (m_sGridSize.y + 1) + y; - GLushort c = (x + 1) * (m_sGridSize.y + 1) + (y + 1); - GLushort d = x * (m_sGridSize.y + 1) + (y + 1); + GLushort a = (GLushort)(x * (m_sGridSize.y + 1) + y); + GLushort b = (GLushort)((x + 1) * (m_sGridSize.y + 1) + y); + GLushort c = (GLushort)((x + 1) * (m_sGridSize.y + 1) + (y + 1)); + GLushort d = (GLushort)(x * (m_sGridSize.y + 1) + (y + 1)); GLushort tempidx[6] = {a, b, d, b, c, d}; @@ -587,13 +587,13 @@ namespace cocos2d for (x = 0; x < numQuads; x++) { - idxArray[x*6+0] = x * 4 + 0; - idxArray[x*6+1] = x * 4 + 1; - idxArray[x*6+2] = x * 4 + 2; + idxArray[x*6+0] = (GLushort)(x * 4 + 0); + idxArray[x*6+1] = (GLushort)(x * 4 + 1); + idxArray[x*6+2] = (GLushort)(x * 4 + 2); - idxArray[x*6+3] = x * 4 + 1; - idxArray[x*6+4] = x * 4 + 2; - idxArray[x*6+5] = x * 4 + 3; + idxArray[x*6+3] = (GLushort)(x * 4 + 1); + idxArray[x*6+4] = (GLushort)(x * 4 + 2); + idxArray[x*6+5] = (GLushort)(x * 4 + 3); } memcpy(m_pOriginalVertices, m_pVertices, numQuads * 12 * sizeof(GLfloat)); diff --git a/cocos2dx/include/CCAccelerometerDelegate.h b/cocos2dx/include/CCAccelerometerDelegate.h index d8aac55501..1233284f9b 100644 --- a/cocos2dx/include/CCAccelerometerDelegate.h +++ b/cocos2dx/include/CCAccelerometerDelegate.h @@ -48,7 +48,7 @@ receiving acceleration-related data from the system. class CC_DLL CCAccelerometerDelegate { public: - virtual void didAccelerate(CCAcceleration* pAccelerationValue) {} + virtual void didAccelerate(CCAcceleration* pAccelerationValue) {CC_UNUSED_PARAM(pAccelerationValue);} //! call the release() in child layer virtual void AccelerometerDestroy(void) {} diff --git a/cocos2dx/include/CCAction.h b/cocos2dx/include/CCAction.h index 16fc2d6ed8..36d43fcd0d 100644 --- a/cocos2dx/include/CCAction.h +++ b/cocos2dx/include/CCAction.h @@ -194,12 +194,12 @@ class CC_DLL CCFollow : public CCAction public: CCFollow() : m_pobFollowedNode(NULL) - , m_bBoundaryFullyCovered(false) - , m_bBoundarySet(false) - , m_fBottomBoundary(0.0) + , m_bBoundarySet(false) + , m_bBoundaryFullyCovered(false) , m_fLeftBoundary(0.0) , m_fRightBoundary(0.0) , m_fTopBoundary(0.0) + , m_fBottomBoundary(0.0) {} virtual ~CCFollow(void); diff --git a/cocos2dx/include/CCActionCamera.h b/cocos2dx/include/CCActionCamera.h index 92d8c8d9f0..da0c24a642 100644 --- a/cocos2dx/include/CCActionCamera.h +++ b/cocos2dx/include/CCActionCamera.h @@ -73,16 +73,16 @@ namespace cocos2d { { public: CCOrbitCamera() - : m_fAngleX(0.0) - , m_fAngleZ(0.0) + : m_fRadius(0.0) + , m_fDeltaRadius(0.0) + , m_fAngleZ(0.0) + , m_fDeltaAngleZ(0.0) + , m_fAngleX(0.0) , m_fDeltaAngleX(0.0) - , m_fDeltaAngleZ(0.0) - , m_fDeltaRadius(0.0) - , m_fRadDeltaX(0.0) - , m_fRadDeltaZ(0.0) - , m_fRadius(0.0) - , m_fRadX(0.0) - , m_fRadZ(0.0) + , m_fRadZ(0.0) + , m_fRadDeltaZ(0.0) + , m_fRadX(0.0) + , m_fRadDeltaX(0.0) {} ~CCOrbitCamera(){} /** creates a CCOrbitCamera action with radius, delta-radius, z, deltaZ, x, deltaX */ diff --git a/cocos2dx/include/CCActionInstant.h b/cocos2dx/include/CCActionInstant.h index b87d70144d..1fc3e4ca32 100644 --- a/cocos2dx/include/CCActionInstant.h +++ b/cocos2dx/include/CCActionInstant.h @@ -171,9 +171,9 @@ namespace cocos2d { { public: CCCallFunc() - : m_pCallFunc(NULL) - , m_pSelectorTarget(NULL) - { + : m_pSelectorTarget(NULL) + , m_pCallFunc(NULL) + { } virtual ~CCCallFunc() { diff --git a/cocos2dx/include/CCIMEDelegate.h b/cocos2dx/include/CCIMEDelegate.h index b260afb712..f4c72ddefd 100644 --- a/cocos2dx/include/CCIMEDelegate.h +++ b/cocos2dx/include/CCIMEDelegate.h @@ -74,7 +74,7 @@ protected: /** @brief Called by CCIMEDispatcher when some text input from IME. */ - virtual void insertText(const char * text, int len) {} + virtual void insertText(const char * text, int len) {CC_UNUSED_PARAM(text);CC_UNUSED_PARAM(len);} /** @brief Called by CCIMEDispatcher when user clicked the backward key. @@ -89,10 +89,10 @@ protected: ////////////////////////////////////////////////////////////////////////// // keyboard show/hide notification ////////////////////////////////////////////////////////////////////////// - virtual void keyboardWillShow(CCIMEKeyboardNotificationInfo& info) {} - virtual void keyboardDidShow(CCIMEKeyboardNotificationInfo& info) {} - virtual void keyboardWillHide(CCIMEKeyboardNotificationInfo& info) {} - virtual void keyboardDidHide(CCIMEKeyboardNotificationInfo& info) {} + virtual void keyboardWillShow(CCIMEKeyboardNotificationInfo& info) {CC_UNUSED_PARAM(info);} + virtual void keyboardDidShow(CCIMEKeyboardNotificationInfo& info) {CC_UNUSED_PARAM(info);} + virtual void keyboardWillHide(CCIMEKeyboardNotificationInfo& info) {CC_UNUSED_PARAM(info);} + virtual void keyboardDidHide(CCIMEKeyboardNotificationInfo& info) {CC_UNUSED_PARAM(info);} protected: CCIMEDelegate(); diff --git a/cocos2dx/include/CCLabelBMFont.h b/cocos2dx/include/CCLabelBMFont.h index c5ce85c35f..5471eb6a1b 100644 --- a/cocos2dx/include/CCLabelBMFont.h +++ b/cocos2dx/include/CCLabelBMFont.h @@ -85,8 +85,8 @@ namespace cocos2d{ struct _KerningHashElement *m_pKerningDictionary; public: CCBMFontConfiguration() - : m_pKerningDictionary(NULL) - , m_uCommonHeight(0) + : m_uCommonHeight(0) + , m_pKerningDictionary(NULL) {} virtual ~CCBMFontConfiguration(); char * description(); @@ -148,10 +148,10 @@ namespace cocos2d{ CCBMFontConfiguration *m_pConfiguration; public: CCLabelBMFont() - : m_pConfiguration(NULL) + : m_cOpacity(0) , m_bIsOpacityModifyRGB(false) - , m_cOpacity(0) , m_sString("") + , m_pConfiguration(NULL) {} virtual ~CCLabelBMFont(); /** Purges the cached data. diff --git a/cocos2dx/include/CCLayer.h b/cocos2dx/include/CCLayer.h index 12f9feb1f0..ad1e41dbf3 100644 --- a/cocos2dx/include/CCLayer.h +++ b/cocos2dx/include/CCLayer.h @@ -58,7 +58,7 @@ public: virtual void destroy(void); virtual void keep(void); - virtual void didAccelerate(CCAcceleration* pAccelerationValue) {} + virtual void didAccelerate(CCAcceleration* pAccelerationValue) {CC_UNUSED_PARAM(pAccelerationValue);} virtual void AccelerometerDestroy(void); virtual void AccelerometerKeep(void); diff --git a/cocos2dx/include/CCMenu.h b/cocos2dx/include/CCMenu.h index d689eea284..f60fcc08c9 100644 --- a/cocos2dx/include/CCMenu.h +++ b/cocos2dx/include/CCMenu.h @@ -117,8 +117,8 @@ namespace cocos2d{ protected: tCCMenuState m_eState; - CCMenuItem *m_pSelectedItem; - GLubyte m_cOpacity; + GLubyte m_cOpacity; + CCMenuItem *m_pSelectedItem; ccColor3B m_tColor; }; } diff --git a/cocos2dx/include/CCMenuItem.h b/cocos2dx/include/CCMenuItem.h index c2992c617b..b38a9715fb 100644 --- a/cocos2dx/include/CCMenuItem.h +++ b/cocos2dx/include/CCMenuItem.h @@ -51,9 +51,9 @@ namespace cocos2d{ CC_PROPERTY(bool, m_bIsEnabled, IsEnabled); public: CCMenuItem() - : m_pListener(NULL) - , m_bIsEnabled(false) - , m_bIsSelected(false) + : m_bIsSelected(false) + , m_bIsEnabled(false) + , m_pListener(NULL) , m_pfnSelector(NULL) {} virtual ~CCMenuItem(){} @@ -248,8 +248,8 @@ namespace cocos2d{ public: CCMenuItemToggle() : m_cOpacity(0) - , m_pSubItems(NULL) - , m_uSelectedIndex(0) + , m_uSelectedIndex(0) + , m_pSubItems(NULL) {} virtual ~CCMenuItemToggle(); /** creates a menu item from a list of items with a target/selector */ diff --git a/cocos2dx/include/CCMotionStreak.h b/cocos2dx/include/CCMotionStreak.h index b9d91a0272..fdff1c89f1 100644 --- a/cocos2dx/include/CCMotionStreak.h +++ b/cocos2dx/include/CCMotionStreak.h @@ -57,10 +57,10 @@ class CC_DLL CCMotionStreak : public CCNode, public CCTextureProtocol CC_PROPERTY(ccBlendFunc, m_tBlendFunc, BlendFunc) public: CCMotionStreak() - : m_fSegThreshold(0.0) - , m_fWidth(0.0) - , m_pRibbon(NULL) - , m_pTexture(NULL) + : m_pRibbon(NULL) + , m_pTexture(NULL) + , m_fSegThreshold(0.0) + , m_fWidth(0.0) {} virtual ~CCMotionStreak(){} /** creates the a MotionStreak. The image will be loaded using the TextureMgr. */ diff --git a/cocos2dx/include/CCProtocols.h b/cocos2dx/include/CCProtocols.h index 6632fe8bd7..c51f01e978 100644 --- a/cocos2dx/include/CCProtocols.h +++ b/cocos2dx/include/CCProtocols.h @@ -63,7 +63,7 @@ public: Textures with premultiplied alpha will have this property by default on YES. Otherwise the default value is NO @since v0.8 */ - virtual void setIsOpacityModifyRGB(bool bValue) {} + virtual void setIsOpacityModifyRGB(bool bValue) {CC_UNUSED_PARAM(bValue);} /** returns whether or not the opacity will be applied using glColor(R,G,B,opacity) or glColor(opacity, opacity, opacity, opacity); @since v0.8 @@ -101,7 +101,7 @@ public: virtual CCTexture2D* getTexture(void) = 0; // sets a new texture. it will be retained - virtual void setTexture(CCTexture2D *texture) {} + virtual void setTexture(CCTexture2D *texture) {CC_UNUSED_PARAM(texture);} }; //! @brief Common interface for Labels diff --git a/cocos2dx/include/CCRibbon.h b/cocos2dx/include/CCRibbon.h index 0fef2fa4ff..702e78bf66 100644 --- a/cocos2dx/include/CCRibbon.h +++ b/cocos2dx/include/CCRibbon.h @@ -108,8 +108,8 @@ public: public: CCRibbonSegment() : m_bFinished(false) - , m_uBegin(0) - , m_uEnd(0) + , m_uEnd(0) + , m_uBegin(0) {} virtual ~CCRibbonSegment(); char * description(); diff --git a/cocos2dx/include/CCTextFieldTTF.h b/cocos2dx/include/CCTextFieldTTF.h index 26ba54ea0d..8f25d7105b 100644 --- a/cocos2dx/include/CCTextFieldTTF.h +++ b/cocos2dx/include/CCTextFieldTTF.h @@ -41,6 +41,7 @@ public: */ virtual bool onTextFieldAttachWithIME(CCTextFieldTTF * sender) { + CC_UNUSED_PARAM(sender); return false; } @@ -49,6 +50,7 @@ public: */ virtual bool onTextFieldDetachWithIME(CCTextFieldTTF * sender) { + CC_UNUSED_PARAM(sender); return false; } @@ -57,6 +59,9 @@ public: */ virtual bool onTextFieldInsertText(CCTextFieldTTF * sender, const char * text, int nLen) { + CC_UNUSED_PARAM(sender); + CC_UNUSED_PARAM(text); + CC_UNUSED_PARAM(nLen); return false; } @@ -65,6 +70,9 @@ public: */ virtual bool onTextFieldDeleteBackward(CCTextFieldTTF * sender, const char * delText, int nLen) { + CC_UNUSED_PARAM(sender); + CC_UNUSED_PARAM(delText); + CC_UNUSED_PARAM(nLen); return false; } @@ -73,6 +81,7 @@ public: */ virtual bool onDraw(CCTextFieldTTF * sender) { + CC_UNUSED_PARAM(sender); return false; } }; diff --git a/cocos2dx/include/CCTouch.h b/cocos2dx/include/CCTouch.h index 3391ba62b4..9b52a1657b 100644 --- a/cocos2dx/include/CCTouch.h +++ b/cocos2dx/include/CCTouch.h @@ -36,8 +36,8 @@ public: CCTouch() {} CCTouch(int nViewId, float x, float y) : m_nViewId(nViewId), m_point(x, y), m_prevPoint(x, y) {} - CCPoint locationInView(int nViewId) { return m_point; } - CCPoint previousLocationInView(int nViewId) { return m_prevPoint; } + CCPoint locationInView(int nViewId) {CC_UNUSED_PARAM(nViewId); return m_point; } + CCPoint previousLocationInView(int nViewId) {CC_UNUSED_PARAM(nViewId); return m_prevPoint; } int view() { return m_nViewId; } void SetTouchInfo(int nViewId, float x, float y) diff --git a/cocos2dx/include/CCTouchDelegateProtocol.h b/cocos2dx/include/CCTouchDelegateProtocol.h index ded8f5320e..6e7d3213be 100644 --- a/cocos2dx/include/CCTouchDelegateProtocol.h +++ b/cocos2dx/include/CCTouchDelegateProtocol.h @@ -56,18 +56,18 @@ public: //! call the retain() in child (layer or menu) virtual void keep(void) {} - virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { return false;}; + virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;}; // optional - virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {} - virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {} - virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {} + virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);} // optional - virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {} - virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {} - virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {} - virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {} + virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} }; /** @brief @@ -90,12 +90,12 @@ public: /** Return YES to claim the touch. @since v0 */ - virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { return false;}; + virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);return false;}; // optional - virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {} - virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {} - virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {} + virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);} }; /** @brief @@ -107,10 +107,10 @@ public: public: CCStandardTouchDelegate() { m_eTouchDelegateType = ccTouchDelegateStandardBit; } // optional - virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {} - virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {} - virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {} - virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {} + virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} + virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);} }; }//namespace cocos2d diff --git a/cocos2dx/include/CCTouchDispatcher.h b/cocos2dx/include/CCTouchDispatcher.h index 2ff252375a..e17bb6260a 100644 --- a/cocos2dx/include/CCTouchDispatcher.h +++ b/cocos2dx/include/CCTouchDispatcher.h @@ -96,10 +96,11 @@ public: ~CCTouchDispatcher(); bool init(void); CCTouchDispatcher() - : m_pHandlersToAdd(NULL) + : m_pTargetedHandlers(NULL) + , m_pStandardHandlers(NULL) + , m_pHandlersToAdd(NULL) , m_pHandlersToRemove(NULL) - , m_pStandardHandlers(NULL) - , m_pTargetedHandlers(NULL) + {} public: diff --git a/cocos2dx/include/selector_protocol.h b/cocos2dx/include/selector_protocol.h index a874625874..9ddfb893ca 100644 --- a/cocos2dx/include/selector_protocol.h +++ b/cocos2dx/include/selector_protocol.h @@ -35,13 +35,13 @@ class CCEvent; class CC_DLL SelectorProtocol { public: - virtual void update(ccTime dt) {}; - virtual void tick(ccTime dt){}; + virtual void update(ccTime dt) {CC_UNUSED_PARAM(dt);}; + virtual void tick(ccTime dt){CC_UNUSED_PARAM(dt);}; virtual void callfunc(){}; - virtual void callfunc(CCNode* pSender){}; - virtual void callfunc(CCNode* pSender, void* pData){}; - virtual void menuHandler(CCObject* pSender){}; - virtual void eventHandler(CCEvent* pEvent) {}; + virtual void callfunc(CCNode* pSender){CC_UNUSED_PARAM(pSender);}; + virtual void callfunc(CCNode* pSender, void* pData){CC_UNUSED_PARAM(pSender);CC_UNUSED_PARAM(pData);}; + virtual void menuHandler(CCObject* pSender){CC_UNUSED_PARAM(pSender);}; + virtual void eventHandler(CCEvent* pEvent) {CC_UNUSED_PARAM(pEvent);}; // the child call responding retain/release function virtual void selectorProtocolRetain(void) {}; diff --git a/cocos2dx/label_nodes/CCLabelBMFont.cpp b/cocos2dx/label_nodes/CCLabelBMFont.cpp index e87e541fc5..21f48c468a 100644 --- a/cocos2dx/label_nodes/CCLabelBMFont.cpp +++ b/cocos2dx/label_nodes/CCLabelBMFont.cpp @@ -142,7 +142,7 @@ namespace cocos2d{ while (strLeft.length() > 0) { int pos = strLeft.find('\n'); - if (pos != std::string::npos) + if (pos != (int)std::string::npos) { // the data is more than a line.get one line line = strLeft.substr(0, pos); diff --git a/cocos2dx/label_nodes/CCLabelTTF.cpp b/cocos2dx/label_nodes/CCLabelTTF.cpp index 6b9abef6a3..f556ba99be 100644 --- a/cocos2dx/label_nodes/CCLabelTTF.cpp +++ b/cocos2dx/label_nodes/CCLabelTTF.cpp @@ -29,10 +29,10 @@ namespace cocos2d{ //CCLabelTTF // CCLabelTTF::CCLabelTTF() - : m_pFontName(NULL) + : m_eAlignment(CCTextAlignmentCenter) + , m_pFontName(NULL) + , m_fFontSize(0.0) , m_pString(NULL) - , m_fFontSize(0.0) - , m_eAlignment(CCTextAlignmentCenter) { } diff --git a/cocos2dx/layers_scenes_transitions_nodes/CCLayer.cpp b/cocos2dx/layers_scenes_transitions_nodes/CCLayer.cpp index fdb4a20d95..33d25b35b7 100644 --- a/cocos2dx/layers_scenes_transitions_nodes/CCLayer.cpp +++ b/cocos2dx/layers_scenes_transitions_nodes/CCLayer.cpp @@ -53,11 +53,11 @@ bool CCLayer::init() do { CCDirector * pDirector; - CC_BREAK_IF( ! (pDirector = CCDirector::sharedDirector()) ); + CC_BREAK_IF(!(pDirector = CCDirector::sharedDirector())); this->setContentSize(pDirector->getWinSize()); // success bRet = true; - } while (0); + } while(0); return bRet; } @@ -251,6 +251,8 @@ void CCLayer::onEnterTransitionDidFinish() bool CCLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { + CC_UNUSED_PARAM(pTouch); + CC_UNUSED_PARAM(pEvent); CCAssert(false, "Layer#ccTouchBegan override me"); return true; } diff --git a/cocos2dx/layers_scenes_transitions_nodes/CCTransition.cpp b/cocos2dx/layers_scenes_transitions_nodes/CCTransition.cpp index d935207edf..e65fc6ba84 100644 --- a/cocos2dx/layers_scenes_transitions_nodes/CCTransition.cpp +++ b/cocos2dx/layers_scenes_transitions_nodes/CCTransition.cpp @@ -143,6 +143,7 @@ void CCTransitionScene::finish() void CCTransitionScene::setNewScene(ccTime dt) { + CC_UNUSED_PARAM(dt); // [self unschedule:_cmd]; // "_cmd" is a local variable automatically defined in a method // that contains the selector for the method diff --git a/cocos2dx/menu_nodes/CCMenu.cpp b/cocos2dx/menu_nodes/CCMenu.cpp index 58ffb9c19f..9fad677f38 100644 --- a/cocos2dx/menu_nodes/CCMenu.cpp +++ b/cocos2dx/menu_nodes/CCMenu.cpp @@ -146,6 +146,7 @@ namespace cocos2d{ bool CCMenu::ccTouchBegan(CCTouch* touch, CCEvent* event) { + CC_UNUSED_PARAM(event); if (m_eState != kCCMenuStateWaiting || ! m_bIsVisible) { return false; @@ -162,6 +163,8 @@ namespace cocos2d{ void CCMenu::ccTouchEnded(CCTouch *touch, CCEvent* event) { + CC_UNUSED_PARAM(touch); + CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchEnded] -- invalid state"); if (m_pSelectedItem) { @@ -173,6 +176,8 @@ namespace cocos2d{ void CCMenu::ccTouchCancelled(CCTouch *touch, CCEvent* event) { + CC_UNUSED_PARAM(touch); + CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchCancelled] -- invalid state"); if (m_pSelectedItem) { @@ -183,6 +188,7 @@ namespace cocos2d{ void CCMenu::ccTouchMoved(CCTouch* touch, CCEvent* event) { + CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchMoved] -- invalid state"); CCMenuItem *currentItem = this->itemForTouch(touch); if (currentItem != m_pSelectedItem) @@ -348,8 +354,8 @@ namespace cocos2d{ row = 0; rowHeight = 0; rowColumns = 0; - float w; - float x; + float w = 0.0; + float x = 0.0; float y = (float)(height / 2); if (m_pChildren && m_pChildren->count() > 0) @@ -465,7 +471,7 @@ namespace cocos2d{ columnWidth = 0; columnRows = 0; float x = (float)(-width / 2); - float y; + float y = 0.0; if (m_pChildren && m_pChildren->count() > 0) { diff --git a/cocos2dx/misc_nodes/CCRenderTexture.cpp b/cocos2dx/misc_nodes/CCRenderTexture.cpp index 2f76f77e80..cbf2e7940b 100644 --- a/cocos2dx/misc_nodes/CCRenderTexture.cpp +++ b/cocos2dx/misc_nodes/CCRenderTexture.cpp @@ -244,6 +244,8 @@ bool CCRenderTexture::saveBuffer(const char *name) } bool CCRenderTexture::saveBuffer(const char *fileName, int format) { + CC_UNUSED_PARAM(fileName); + CC_UNUSED_PARAM(format); bool bRet = false; //@ todo CCRenderTexture::saveBuffer // UIImage *myImage = this->getUIImageFromBuffer(format); @@ -263,6 +265,7 @@ bool CCRenderTexture::saveBuffer(const char *fileName, int format) CCData * CCRenderTexture::getUIImageAsDataFromBuffer(int format) { + CC_UNUSED_PARAM(format); CCData * pData = NULL; //@ todo CCRenderTexture::getUIImageAsDataFromBuffer diff --git a/cocos2dx/particle_nodes/CCParticleSystem.cpp b/cocos2dx/particle_nodes/CCParticleSystem.cpp index 18522ed190..1816e282b1 100644 --- a/cocos2dx/particle_nodes/CCParticleSystem.cpp +++ b/cocos2dx/particle_nodes/CCParticleSystem.cpp @@ -656,6 +656,8 @@ void CCParticleSystem::update(ccTime dt) } void CCParticleSystem::updateQuadWithParticle(tCCParticle* particle, CCPoint newPosition) { + CC_UNUSED_PARAM(particle); + CC_UNUSED_PARAM(newPosition); // should be overriden } void CCParticleSystem::postStep() diff --git a/cocos2dx/platform/CCFileUtils.cpp b/cocos2dx/platform/CCFileUtils.cpp index 14db6e74a5..921d381579 100644 --- a/cocos2dx/platform/CCFileUtils.cpp +++ b/cocos2dx/platform/CCFileUtils.cpp @@ -62,9 +62,9 @@ public: CCDictMaker() : m_pRootDict(NULL), m_pCurDict(NULL), - m_tState(SAX_NONE), - m_pArray(NULL), - m_bInArray(false) + m_tState(SAX_NONE), + m_bInArray(false), + m_pArray(NULL) { } @@ -88,6 +88,8 @@ public: void startElement(void *ctx, const char *name, const char **atts) { + CC_UNUSED_PARAM(ctx); + CC_UNUSED_PARAM(atts); std::string sName((char*)name); if( sName == "dict" ) { @@ -137,6 +139,7 @@ public: void endElement(void *ctx, const char *name) { + CC_UNUSED_PARAM(ctx); std::string sName((char*)name); if( sName == "dict" ) { @@ -185,6 +188,7 @@ public: void textHandler(void *ctx, const char *ch, int len) { + CC_UNUSED_PARAM(ctx); if (m_tState == SAX_NONE) { return; @@ -213,6 +217,8 @@ public: } break; } + default: + break; } pText->release(); } @@ -274,7 +280,7 @@ unsigned char* CCFileUtils::getFileDataFromZip(const char* pszZipFilePath, const pBuffer = new unsigned char[FileInfo.uncompressed_size]; int nSize = 0; nSize = unzReadCurrentFile(pFile, pBuffer, FileInfo.uncompressed_size); - CCAssert(nSize == 0 || nSize == FileInfo.uncompressed_size, "the file size is wrong"); + CCAssert(nSize == 0 || nSize == (int)FileInfo.uncompressed_size, "the file size is wrong"); *pSize = FileInfo.uncompressed_size; unzCloseCurrentFile(pFile); diff --git a/cocos2dx/platform/CCImage.cpp b/cocos2dx/platform/CCImage.cpp index af26146165..8bd29f8b62 100644 --- a/cocos2dx/platform/CCImage.cpp +++ b/cocos2dx/platform/CCImage.cpp @@ -86,6 +86,7 @@ CCImage::~CCImage() bool CCImage::initWithImageFile(const char * strPath, EImageFormat eImgFmt/* = eFmtPng*/) { + CC_UNUSED_PARAM(eImgFmt); CCFileData data(CCFileUtils::fullPathFromRelativePath(strPath), "rb"); return initWithImageData(data.getBuffer(), data.getSize()); } @@ -153,8 +154,8 @@ bool CCImage::_initWithJpgData(void * data, int nSize) jpeg_start_decompress( &cinfo ); /* init image info */ - m_nWidth = cinfo.image_width; - m_nHeight = cinfo.image_height; + m_nWidth = (short)(cinfo.image_width); + m_nHeight = (short)(cinfo.image_height); m_bHasAlpha = false; m_bPreMulti = false; m_nBitsPerComponent = 8; @@ -206,7 +207,7 @@ bool CCImage::_initWithPngData(void * pData, int nDatalen) // init png_info info_ptr = png_create_info_struct(png_ptr); - CC_BREAK_IF(! info_ptr || setjmp(png_jmpbuf(png_ptr))); + CC_BREAK_IF(!info_ptr || setjmp(png_jmpbuf(png_ptr))); // set the read call back function tImageSource imageSource; diff --git a/cocos2dx/platform/CCImage.h b/cocos2dx/platform/CCImage.h index 30498ef6c9..2fb3e2e422 100644 --- a/cocos2dx/platform/CCImage.h +++ b/cocos2dx/platform/CCImage.h @@ -100,7 +100,7 @@ public: /** @brief Save the CCImage data to specified file with specified format. */ - bool saveToFile(const char * pszFilePath) { return false; } + bool saveToFile(const char * pszFilePath) { CC_UNUSED_PARAM(pszFilePath);return false; } CC_SYNTHESIZE_READONLY(short, m_nWidth, Width); CC_SYNTHESIZE_READONLY(short, m_nHeight, Height); diff --git a/cocos2dx/platform/CCPlatformConfig.h b/cocos2dx/platform/CCPlatformConfig.h index f13a62c77a..d2dacd0d7c 100644 --- a/cocos2dx/platform/CCPlatformConfig.h +++ b/cocos2dx/platform/CCPlatformConfig.h @@ -151,7 +151,7 @@ There are config below: // Check the supportive of platform #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - +#pragma warning (disable:4127) #endif // CC_PLATFORM_WIN32 #endif // __CC_PLATFORM_CONFIG_H__ diff --git a/cocos2dx/platform/CCPlatformMacros.h b/cocos2dx/platform/CCPlatformMacros.h index eaf61e208f..4228af2417 100644 --- a/cocos2dx/platform/CCPlatformMacros.h +++ b/cocos2dx/platform/CCPlatformMacros.h @@ -120,9 +120,9 @@ public: inline void set##funName(varType var){ varName = var; } // cocos2d debug #if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0 -#define CCLOG(...) do {} while (0) -#define CCLOGINFO(...) do {} while (0) -#define CCLOGERROR(...) do {} while (0) +#define CCLOG(...) +#define CCLOGINFO(...) +#define CCLOGERROR(...) #elif COCOS2D_DEBUG == 1 #define CCLOG(format, ...) cocos2d::CCLog(format, ##__VA_ARGS__) @@ -141,6 +141,9 @@ public: inline void set##funName(varType var){ varName = var; } // assertion #include #define CC_ASSERT(cond) assert(cond) +#define CC_UNUSED_PARAM(unusedparam) unusedparam + + // platform depended macros diff --git a/cocos2dx/platform/CCSAXParser.cpp b/cocos2dx/platform/CCSAXParser.cpp index d666dab5aa..cc1dfeeb62 100644 --- a/cocos2dx/platform/CCSAXParser.cpp +++ b/cocos2dx/platform/CCSAXParser.cpp @@ -43,6 +43,7 @@ CCSAXParser::~CCSAXParser(void) bool CCSAXParser::init(const char *pszEncoding) { + CC_UNUSED_PARAM(pszEncoding); // nothing to do return true; } diff --git a/cocos2dx/platform/android/CCEGLView_android.cpp b/cocos2dx/platform/android/CCEGLView_android.cpp index 159d4b75d4..4f9c17ff82 100644 --- a/cocos2dx/platform/android/CCEGLView_android.cpp +++ b/cocos2dx/platform/android/CCEGLView_android.cpp @@ -35,9 +35,9 @@ THE SOFTWARE. namespace cocos2d { CCEGLView::CCEGLView() -: m_pDelegate(NULL), - m_fScreenScaleFactor(1.0), - m_bNotHVGA(false) + : m_bNotHVGA(false), + m_pDelegate(NULL), + m_fScreenScaleFactor(1.0) { } diff --git a/cocos2dx/platform/android/Cocos2dJni.cpp b/cocos2dx/platform/android/Cocos2dJni.cpp index 32c6b60bf6..07df9bf6c1 100644 --- a/cocos2dx/platform/android/Cocos2dJni.cpp +++ b/cocos2dx/platform/android/Cocos2dJni.cpp @@ -350,7 +350,7 @@ extern "C" void setKeyboardStateJNI(int bOpen) { TMethodJNI t; - jint open = bOpen; + //jint open = bOpen; if (getMethodID(t , "org/cocos2dx/lib/Cocos2dxGLSurfaceView" , (bOpen) ? "openIMEKeyboard" : "closeIMEKeyboard" diff --git a/cocos2dx/platform/platform.cpp b/cocos2dx/platform/platform.cpp index 62fc83cc11..725aef515c 100644 --- a/cocos2dx/platform/platform.cpp +++ b/cocos2dx/platform/platform.cpp @@ -30,6 +30,7 @@ NS_CC_BEGIN; int CCTime::gettimeofdayCocos2d(struct cc_timeval *tp, void *tzp) { + CC_UNUSED_PARAM(tzp); if (tp) { gettimeofday((struct timeval *)tp, 0); diff --git a/cocos2dx/platform/win32/CCAccelerometer_win32.h b/cocos2dx/platform/win32/CCAccelerometer_win32.h index 827c90104f..513a88a8dc 100644 --- a/cocos2dx/platform/win32/CCAccelerometer_win32.h +++ b/cocos2dx/platform/win32/CCAccelerometer_win32.h @@ -35,8 +35,8 @@ public: static CCAccelerometer* sharedAccelerometer() { return NULL; } - void removeDelegate(CCAccelerometerDelegate* pDelegate) {} - void addDelegate(CCAccelerometerDelegate* pDelegate) {} + void removeDelegate(CCAccelerometerDelegate* pDelegate) {CC_UNUSED_PARAM(pDelegate);} + void addDelegate(CCAccelerometerDelegate* pDelegate) {CC_UNUSED_PARAM(pDelegate);} }; }//namespace cocos2d diff --git a/cocos2dx/platform/win32/CCEGLView_win32.cpp b/cocos2dx/platform/win32/CCEGLView_win32.cpp index 2613034ec6..21f76cfeab 100644 --- a/cocos2dx/platform/win32/CCEGLView_win32.cpp +++ b/cocos2dx/platform/win32/CCEGLView_win32.cpp @@ -182,8 +182,8 @@ static LRESULT CALLBACK _WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM CCEGLView::CCEGLView() : m_bCaptured(false) -, m_bOrientationInitVertical(false) , m_bOrientationReverted(false) +, m_bOrientationInitVertical(false) , m_pDelegate(NULL) , m_pEGL(NULL) , m_hWnd(NULL) diff --git a/cocos2dx/platform/win32/CCFileUtils_win32.cpp b/cocos2dx/platform/win32/CCFileUtils_win32.cpp index debe32ee24..34ba8695e0 100644 --- a/cocos2dx/platform/win32/CCFileUtils_win32.cpp +++ b/cocos2dx/platform/win32/CCFileUtils_win32.cpp @@ -144,6 +144,7 @@ unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* psz void CCFileUtils::setResource(const char* pszZipFileName) { + CC_UNUSED_PARAM(pszZipFileName); CCAssert(0, "Have not implement!"); } @@ -155,6 +156,7 @@ const char* CCFileUtils::getResourcePath(void) void CCFileUtils::setRelativePath(const char* pszRelativePath) { + CC_UNUSED_PARAM(pszRelativePath); CCAssert(0, "Have not implement!"); } diff --git a/cocos2dx/platform/win32/CCImage_win32.cpp b/cocos2dx/platform/win32/CCImage_win32.cpp index b204f0e5c7..92fae8adf0 100644 --- a/cocos2dx/platform/win32/CCImage_win32.cpp +++ b/cocos2dx/platform/win32/CCImage_win32.cpp @@ -235,8 +235,7 @@ public: // draw text HGDIOBJ hOldFont = SelectObject(m_hDC, m_hFont); HGDIOBJ hOldBmp = SelectObject(m_hDC, m_hBmp); - - RECT rc = {0, 0, tSize.cx, tSize.cy}; + SetBkMode(m_hDC, TRANSPARENT); SetTextColor(m_hDC, RGB(255, 255, 255)); // white color @@ -282,8 +281,7 @@ bool CCImage::initWithString( unsigned char * pImageData = 0; do { - CC_BREAK_IF(! pText); - int nLen = strlen(pText); + CC_BREAK_IF(! pText); BitmapDC& dc = sharedBitmapDC(); diff --git a/cocos2dx/sprite_nodes/CCSprite.cpp b/cocos2dx/sprite_nodes/CCSprite.cpp index d876617c1a..21570e1771 100644 --- a/cocos2dx/sprite_nodes/CCSprite.cpp +++ b/cocos2dx/sprite_nodes/CCSprite.cpp @@ -117,6 +117,9 @@ CCSprite* CCSprite::spriteWithTexture(CCTexture2D *pTexture, CCRect rect) CCSprite* CCSprite::spriteWithTexture(CCTexture2D *pTexture, CCRect rect, CCPoint offset) { + CC_UNUSED_PARAM(pTexture); + CC_UNUSED_PARAM(rect); + CC_UNUSED_PARAM(offset); // not implement assert(0); return NULL; diff --git a/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp b/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp index f1702587f7..f42d618247 100644 --- a/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp +++ b/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp @@ -537,7 +537,7 @@ namespace cocos2d pobSprite->useSelfRender(); unsigned int uIndex = m_pobDescendants->indexOfObject(pobSprite); - if (uIndex != -1) + if ((int)uIndex != -1) { m_pobDescendants->removeObjectAtIndex(uIndex); diff --git a/cocos2dx/sprite_nodes/CCSpriteFrame.cpp b/cocos2dx/sprite_nodes/CCSpriteFrame.cpp index ad31316345..4f00c15c0e 100644 --- a/cocos2dx/sprite_nodes/CCSpriteFrame.cpp +++ b/cocos2dx/sprite_nodes/CCSpriteFrame.cpp @@ -79,6 +79,7 @@ CCSpriteFrame::~CCSpriteFrame(void) CCObject* CCSpriteFrame::copyWithZone(CCZone *pZone) { + CC_UNUSED_PARAM(pZone); CCSpriteFrame *pCopy = new CCSpriteFrame(); pCopy->initWithTexture(m_pobTexture, m_obRectInPixels, m_bRotated, m_obOffsetInPixels, m_obOriginalSizeInPixels); diff --git a/cocos2dx/sprite_nodes/CCSpriteFrameCache.cpp b/cocos2dx/sprite_nodes/CCSpriteFrameCache.cpp index 46f1801b90..cc45a4a5fe 100644 --- a/cocos2dx/sprite_nodes/CCSpriteFrameCache.cpp +++ b/cocos2dx/sprite_nodes/CCSpriteFrameCache.cpp @@ -95,7 +95,7 @@ void CCSpriteFrameCache::addSpriteFramesWithDictionary(CCDictionarybegin(); std::string key = ""; CCDictionary *frameDict = NULL; - while( frameDict = (CCDictionary*)framesDict->next(&key) ) + while( (frameDict = (CCDictionary*)framesDict->next(&key)) ) { CCSpriteFrame *spriteFrame = m_pSpriteFrames->objectForKey(key); if (spriteFrame) @@ -237,7 +237,7 @@ void CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist) // stringByDeletingLastPathComponent string textureBase(pszPath); int indexOfLastSeperator = textureBase.find_last_of('/'); - if (indexOfLastSeperator == textureBase.length() - 1) + if (indexOfLastSeperator == (int)textureBase.length() - 1) { textureBase.erase(indexOfLastSeperator, 1); indexOfLastSeperator = textureBase.find_last_of('/'); @@ -293,7 +293,7 @@ void CCSpriteFrameCache::removeUnusedSpriteFrames(void) m_pSpriteFrames->begin(); std::string key = ""; CCSpriteFrame *spriteFrame = NULL; - while( spriteFrame = m_pSpriteFrames->next(&key) ) + while( (spriteFrame = m_pSpriteFrames->next(&key)) ) { if( spriteFrame->retainCount() == 1 ) { @@ -343,7 +343,7 @@ void CCSpriteFrameCache::removeSpriteFramesFromDictionary(CCDictionarybegin(); std::string key = ""; CCDictionary *frameDict = NULL; - while( frameDict = (CCDictionary*)framesDict->next(&key) ) + while( (frameDict = (CCDictionary*)framesDict->next(&key)) ) { if (m_pSpriteFrames->objectForKey(key)) { @@ -366,7 +366,7 @@ void CCSpriteFrameCache::removeSpriteFramesFromTexture(CCTexture2D* texture) m_pSpriteFrames->begin(); std::string key = ""; CCDictionary *frameDict = NULL; - while( frameDict = (CCDictionary*)m_pSpriteFrames->next(&key) ) + while( (frameDict = (CCDictionary*)m_pSpriteFrames->next(&key)) ) { CCSpriteFrame *frame = m_pSpriteFrames->objectForKey(key); if (frame && (frame->getTexture() == texture)) diff --git a/cocos2dx/support/data_support/ccCArray.h b/cocos2dx/support/data_support/ccCArray.h index 493a069b0e..482d8e5381 100644 --- a/cocos2dx/support/data_support/ccCArray.h +++ b/cocos2dx/support/data_support/ccCArray.h @@ -118,13 +118,13 @@ static inline unsigned int ccArrayGetIndexOfObject(ccArray *arr, CCObject* objec } } - return -1; + return (unsigned int)-1; } /** Returns a Boolean value that indicates whether object is present in array. */ static inline bool ccArrayContainsObject(ccArray *arr, CCObject* object) { - return ccArrayGetIndexOfObject(arr, object) != -1; + return (int)ccArrayGetIndexOfObject(arr, object) != -1; } /** Appends an object. Bahaviour undefined if array doesn't have enough capacity. */ @@ -210,7 +210,7 @@ static inline void ccArrayFastRemoveObjectAtIndex(ccArray *arr, unsigned int ind static inline void ccArrayFastRemoveObject(ccArray *arr, CCObject* object) { unsigned int index = ccArrayGetIndexOfObject(arr, object); - if (index != -1) + if ((int)index != -1) ccArrayFastRemoveObjectAtIndex(arr, index); } @@ -220,7 +220,7 @@ static inline void ccArrayRemoveObject(ccArray *arr, CCObject* object) { unsigned int index = ccArrayGetIndexOfObject(arr, object); - if (index != -1) + if ((int)index != -1) { ccArrayRemoveObjectAtIndex(arr, index); } @@ -422,7 +422,7 @@ static inline void ccCArrayFastRemoveValueAtIndex(ccCArray *arr, unsigned int in static inline void ccCArrayRemoveValue(ccCArray *arr, void* value) { unsigned int index = ccCArrayGetIndexOfValue(arr, value); - if (index != -1) + if ((int)index != -1) { ccCArrayRemoveValueAtIndex(arr, index); } diff --git a/cocos2dx/text_input_node/CCTextFieldTTF.cpp b/cocos2dx/text_input_node/CCTextFieldTTF.cpp index b419aa9383..b947152289 100644 --- a/cocos2dx/text_input_node/CCTextFieldTTF.cpp +++ b/cocos2dx/text_input_node/CCTextFieldTTF.cpp @@ -33,7 +33,7 @@ static int _calcCharCount(const char * pszText) { int n = 0; char ch = 0; - while (ch = *pszText) + while ((ch = *pszText)) { CC_BREAK_IF(! ch); @@ -174,7 +174,7 @@ void CCTextFieldTTF::insertText(const char * text, int len) // insert \n means input end int nPos = sInsert.find('\n'); - if (sInsert.npos != nPos) + if ((int)sInsert.npos != nPos) { len = nPos; sInsert.erase(nPos); @@ -194,7 +194,7 @@ void CCTextFieldTTF::insertText(const char * text, int len) setString(sText.c_str()); } - if (sInsert.npos == nPos) { + if ((int)sInsert.npos == nPos) { return; } diff --git a/cocos2dx/textures/CCTexture2D.cpp b/cocos2dx/textures/CCTexture2D.cpp index f919629ed5..cb631674ab 100644 --- a/cocos2dx/textures/CCTexture2D.cpp +++ b/cocos2dx/textures/CCTexture2D.cpp @@ -62,12 +62,12 @@ namespace cocos2d { static CCTexture2DPixelFormat g_defaultAlphaPixelFormat = kCCTexture2DPixelFormat_Default; CCTexture2D::CCTexture2D() -: m_uName(0) -, m_bHasPremultipliedAlpha(false) +: m_uPixelsWide(0) +, m_uPixelsHigh(0) +, m_uName(0) , m_fMaxS(0.0) , m_fMaxT(0.0) -, m_uPixelsHigh(0) -, m_uPixelsWide(0) +, m_bHasPremultipliedAlpha(false) { } @@ -145,6 +145,7 @@ void CCTexture2D::releaseData(void *data) void* CCTexture2D::keepData(void *data, unsigned int length) { + CC_UNUSED_PARAM(length); //The texture data mustn't be saved becuase it isn't a mutable texture. return data; } @@ -291,7 +292,7 @@ bool CCTexture2D::initPremultipliedATextureWithImage(CCImage *image, unsigned in tempData = (unsigned char*)(image->getData()); CCAssert(tempData != NULL, "NULL image data."); - if(image->getWidth() == POTWide && image->getHeight() == POTHigh) + if(image->getWidth() == (short)POTWide && image->getHeight() == (short)POTHigh) { data = new unsigned char[POTHigh * POTWide * 4]; memcpy(data, tempData, POTHigh * POTWide * 4); @@ -315,7 +316,7 @@ bool CCTexture2D::initPremultipliedATextureWithImage(CCImage *image, unsigned in case kCCTexture2DPixelFormat_RGB888: tempData = (unsigned char*)(image->getData()); CCAssert(tempData != NULL, "NULL image data."); - if(image->getWidth() == POTWide && image->getHeight() == POTHigh) + if(image->getWidth() == (short)POTWide && image->getHeight() == (short)POTHigh) { data = new unsigned char[POTHigh * POTWide * 3]; memcpy(data, tempData, POTHigh * POTWide * 3); diff --git a/cocos2dx/textures/CCTextureAtlas.cpp b/cocos2dx/textures/CCTextureAtlas.cpp index a0a75a7daa..8f75651bea 100644 --- a/cocos2dx/textures/CCTextureAtlas.cpp +++ b/cocos2dx/textures/CCTextureAtlas.cpp @@ -40,8 +40,8 @@ THE SOFTWARE. namespace cocos2d { CCTextureAtlas::CCTextureAtlas() - :m_pTexture(NULL) - ,m_pIndices(NULL) + :m_pIndices(NULL) + ,m_pTexture(NULL) ,m_pQuads(NULL) {} @@ -189,14 +189,14 @@ void CCTextureAtlas::initIndices() m_pIndices[i*6+4] = i*4+3; m_pIndices[i*6+5] = i*4+3; #else - m_pIndices[i*6+0] = i*4+0; - m_pIndices[i*6+1] = i*4+1; - m_pIndices[i*6+2] = i*4+2; + m_pIndices[i*6+0] = (GLushort)(i*4+0); + m_pIndices[i*6+1] = (GLushort)(i*4+1); + m_pIndices[i*6+2] = (GLushort)(i*4+2); // inverted index. issue #179 - m_pIndices[i*6+3] = i*4+3; - m_pIndices[i*6+4] = i*4+2; - m_pIndices[i*6+5] = i*4+1; + m_pIndices[i*6+3] = (GLushort)(i*4+3); + m_pIndices[i*6+4] = (GLushort)(i*4+2); + m_pIndices[i*6+5] = (GLushort)(i*4+1); // m_pIndices[i*6+3] = i*4+2; // m_pIndices[i*6+4] = i*4+3; // m_pIndices[i*6+5] = i*4+1; diff --git a/cocos2dx/textures/CCTextureCache.cpp b/cocos2dx/textures/CCTextureCache.cpp index 23223f285d..be99392999 100644 --- a/cocos2dx/textures/CCTextureCache.cpp +++ b/cocos2dx/textures/CCTextureCache.cpp @@ -363,7 +363,7 @@ CCTexture2D* CCTextureCache::addUIImage(CCImage *image, const char *key) do { // If key is nil, then create a new texture each time - if(texture = m_pTextures->objectForKey(forKey)) + if((texture = m_pTextures->objectForKey(forKey))) { break; } @@ -456,10 +456,10 @@ VolatileTexture::VolatileTexture(CCTexture2D *t) , m_bIsString(false) , m_strFileName("") , m_FmtImage(CCImage::kFmtPng) +, m_alignment(CCTextAlignmentCenter) , m_strFontName("") , m_strText("") , m_fFontSize(0.0f) -, m_alignment(CCTextAlignmentCenter) { m_size = CCSizeMake(0, 0); textures.push_back(this); diff --git a/cocos2dx/tileMap_parallax_nodes/CCParallaxNode.cpp b/cocos2dx/tileMap_parallax_nodes/CCParallaxNode.cpp index 1d407ba0bb..533ff00122 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCParallaxNode.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCParallaxNode.cpp @@ -71,6 +71,9 @@ namespace cocos2d { } void CCParallaxNode::addChild(CCNode * child, int zOrder, int tag) { + CC_UNUSED_PARAM(zOrder); + CC_UNUSED_PARAM(child); + CC_UNUSED_PARAM(tag); CCAssert(0,"ParallaxNode: use addChild:z:parallaxRatio:positionOffset instead"); } void CCParallaxNode::addChild(CCNode *child, int z, CCPoint ratio, CCPoint offset) diff --git a/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp b/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp index 2643e45c89..05a37258bc 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCTMXLayer.cpp @@ -92,14 +92,14 @@ namespace cocos2d { return false; } CCTMXLayer::CCTMXLayer() - :m_pTiles(NULL) + :m_tLayerSize(CCSizeZero) + ,m_tMapTileSize(CCSizeZero) + ,m_pTiles(NULL) ,m_pTileSet(NULL) ,m_pProperties(NULL) + ,m_sLayerName("") ,m_pReusedTile(NULL) - ,m_pAtlasIndexArray(NULL) - ,m_tLayerSize(CCSizeZero) - ,m_tMapTileSize(CCSizeZero) - ,m_sLayerName("") + ,m_pAtlasIndexArray(NULL) {} CCTMXLayer::~CCTMXLayer() { @@ -446,6 +446,9 @@ namespace cocos2d { } void CCTMXLayer::addChild(CCNode * child, int zOrder, int tag) { + CC_UNUSED_PARAM(child); + CC_UNUSED_PARAM(zOrder); + CC_UNUSED_PARAM(tag); CCAssert(0, "addChild: is not supported on CCTMXLayer. Instead use setTileGID:at:/tileAt:"); } void CCTMXLayer::removeChild(CCNode* node, bool cleanup) diff --git a/cocos2dx/tileMap_parallax_nodes/CCTMXObjectGroup.cpp b/cocos2dx/tileMap_parallax_nodes/CCTMXObjectGroup.cpp index 6ddcc43935..a3cbd0ce5d 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCTMXObjectGroup.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCTMXObjectGroup.cpp @@ -30,8 +30,8 @@ namespace cocos2d { //implementation CCTMXObjectGroup CCTMXObjectGroup::CCTMXObjectGroup() - :m_sGroupName("") - ,m_tPositionOffset(CCPointZero) + :m_tPositionOffset(CCPointZero) + ,m_sGroupName("") { m_pObjects = new CCMutableArray(); m_pProperties = new CCStringToStringDictionary(); diff --git a/cocos2dx/tileMap_parallax_nodes/CCTMXTiledMap.cpp b/cocos2dx/tileMap_parallax_nodes/CCTMXTiledMap.cpp index 40f3355784..0aaff71dbf 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCTMXTiledMap.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCTMXTiledMap.cpp @@ -104,8 +104,8 @@ namespace cocos2d{ return true; } CCTMXTiledMap::CCTMXTiledMap() - :m_tTileSize(CCSizeZero) - ,m_tMapSize(CCSizeZero) + :m_tMapSize(CCSizeZero) + ,m_tTileSize(CCSizeZero) ,m_pObjectGroups(NULL) ,m_pProperties(NULL) ,m_pTileProperties(NULL) diff --git a/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp b/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp index 716d48fc31..ee6f456b23 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCTMXXMLParser.cpp @@ -64,12 +64,12 @@ namespace cocos2d { } // implementation CCTMXLayerInfo CCTMXLayerInfo::CCTMXLayerInfo() - :m_bOwnTiles(true) - ,m_uMinGID(100000) - ,m_uMaxGID(0) - ,m_sName("") - ,m_pTiles(NULL) - ,m_tOffset(CCPointZero) + : m_sName("") + , m_pTiles(NULL) + , m_bOwnTiles(true) + , m_uMinGID(100000) + , m_uMaxGID(0) + , m_tOffset(CCPointZero) { m_pProperties= new CCStringToStringDictionary();; } @@ -150,13 +150,13 @@ namespace cocos2d { return parseXMLFile(m_sTMXFileName.c_str()); } CCTMXMapInfo::CCTMXMapInfo() - :m_bStoringCharacters(false) - ,m_nLayerAttribs(0) - ,m_tMapSize(CCSizeZero) - ,m_tTileSize(CCSizeZero) - ,m_pLayers(NULL) - ,m_pTilesets(NULL) - ,m_pObjectGroups(NULL) + :m_tMapSize(CCSizeZero) + ,m_tTileSize(CCSizeZero) + ,m_pLayers(NULL) + ,m_pTilesets(NULL) + ,m_pObjectGroups(NULL) + ,m_nLayerAttribs(0) + ,m_bStoringCharacters(false) ,m_pProperties(NULL) ,m_pTileProperties(NULL) { @@ -239,6 +239,7 @@ namespace cocos2d { // the XML parser calls here with all the elements void CCTMXMapInfo::startElement(void *ctx, const char *name, const char **atts) { + CC_UNUSED_PARAM(ctx); CCTMXMapInfo *pTMXMapInfo = this; std::string elementName = (char*)name; std::map *attributeDict = new std::map(); @@ -519,6 +520,7 @@ namespace cocos2d { void CCTMXMapInfo::endElement(void *ctx, const char *name) { + CC_UNUSED_PARAM(ctx); CCTMXMapInfo *pTMXMapInfo = this; std::string elementName = (char*)name; @@ -586,6 +588,7 @@ namespace cocos2d { void CCTMXMapInfo::textHandler(void *ctx, const char *ch, int len) { + CC_UNUSED_PARAM(ctx); CCTMXMapInfo *pTMXMapInfo = this; std::string pText((char*)ch,0,len); diff --git a/cocos2dx/tileMap_parallax_nodes/CCTileMapAtlas.cpp b/cocos2dx/tileMap_parallax_nodes/CCTileMapAtlas.cpp index f2422ac9b3..e5d9a51f58 100644 --- a/cocos2dx/tileMap_parallax_nodes/CCTileMapAtlas.cpp +++ b/cocos2dx/tileMap_parallax_nodes/CCTileMapAtlas.cpp @@ -59,8 +59,8 @@ namespace cocos2d { return false; } CCTileMapAtlas::CCTileMapAtlas() - :m_pPosToAtlasIndex(NULL) - ,m_pTGAInfo(NULL) + :m_pTGAInfo(NULL) + ,m_pPosToAtlasIndex(NULL) ,m_nItemsToRender(0) { } diff --git a/cocos2dx/touch_dispatcher/CCTouchDispatcher.cpp b/cocos2dx/touch_dispatcher/CCTouchDispatcher.cpp index e4571ee705..c26e28e125 100644 --- a/cocos2dx/touch_dispatcher/CCTouchDispatcher.cpp +++ b/cocos2dx/touch_dispatcher/CCTouchDispatcher.cpp @@ -231,6 +231,8 @@ void CCTouchDispatcher::removeAllDelegates(void) void CCTouchDispatcher::setPriority(int nPriority, CCTouchDelegate *pDelegate) { + CC_UNUSED_PARAM(nPriority); + CC_UNUSED_PARAM(pDelegate); assert(0); } From 9266be444b0511d68eccc5f64b283705267a55a8 Mon Sep 17 00:00:00 2001 From: Walzer Date: Sat, 11 Jun 2011 16:53:48 +0800 Subject: [PATCH 03/11] issue #398, add xcode4 templates, semi-finished. --- .../Resources/iTunesArtwork | Bin 0 -> 61982 bytes .../Classes/AppDelegate.cpp | 110 +++++++++++ .../Classes/AppDelegate.h | 51 +++++ .../Classes/HelloWorldScene.cpp | 187 ++++++++++++++++++ .../Classes/HelloWorldScene.h | 36 ++++ .../xcode4/cocos2d-x.xctemplate/Prefix.pch | 8 + .../cocos2d-x.xctemplate/TemplateIcon.icns | Bin 0 -> 53803 bytes .../cocos2d-x.xctemplate/ios/AppController.h | 14 ++ .../cocos2d-x.xctemplate/ios/AppController.mm | 99 ++++++++++ .../xcode4/cocos2d-x.xctemplate/ios/main.m | 16 ++ 10 files changed, 521 insertions(+) create mode 100644 template/xcode4/base_ios.xctemplate/Resources/iTunesArtwork create mode 100644 template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.cpp create mode 100644 template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.h create mode 100755 template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp create mode 100755 template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h create mode 100755 template/xcode4/cocos2d-x.xctemplate/Prefix.pch create mode 100644 template/xcode4/cocos2d-x.xctemplate/TemplateIcon.icns create mode 100644 template/xcode4/cocos2d-x.xctemplate/ios/AppController.h create mode 100644 template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm create mode 100755 template/xcode4/cocos2d-x.xctemplate/ios/main.m diff --git a/template/xcode4/base_ios.xctemplate/Resources/iTunesArtwork b/template/xcode4/base_ios.xctemplate/Resources/iTunesArtwork new file mode 100644 index 0000000000000000000000000000000000000000..b1cc056ba575a346e1bfa3baa189c20efbfe496b GIT binary patch literal 61982 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 SlutY{?~w5D*Pu9-FCCu<>yh` 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 Hu0mjfpM?{b literal 0 HcmV?d00001 diff --git a/template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.cpp b/template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.cpp new file mode 100644 index 0000000000..fb9ffc4e46 --- /dev/null +++ b/template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.cpp @@ -0,0 +1,110 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppDelegate.cpp +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#include "AppDelegate.h" + +#include "cocos2d.h" +#include "HelloWorldScene.h" + +USING_NS_CC; + +AppDelegate::AppDelegate() +{ + +} + +AppDelegate::~AppDelegate() +{ +} + +bool AppDelegate::initInstance() +{ + bool bRet = false; + do + { +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + + // Initialize OpenGLView instance, that release by CCDirector when application terminate. + // The HelloWorld is designed as HVGA. + CCEGLView * pMainWnd = new CCEGLView(); + CC_BREAK_IF(! pMainWnd + || ! pMainWnd->Create(TEXT("cocos2d: Hello World"), 320, 480)); + +#endif // CC_PLATFORM_WIN32 + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + // OpenGLView initialized in testsAppDelegate.mm on ios platform, nothing need to do here. +#endif // CC_PLATFORM_IOS + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + // android does not do anything +#endif + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WOPHONE) + + // Initialize OpenGLView instance, that release by CCDirector when application terminate. + // The HelloWorld is designed as HVGA. + CCEGLView* pMainWnd = new CCEGLView(this); + CC_BREAK_IF(! pMainWnd || ! pMainWnd->Create(320,480)); + +#ifndef _TRANZDA_VM_ + // on wophone emulator, we copy resources files to Work7/TG3/APP/ folder instead of zip file + cocos2d::CCFileUtils::setResource("HelloWorld.zip"); +#endif + +#endif // CC_PLATFORM_WOPHONE + + bRet = true; + } while (0); + return bRet; +} + +bool AppDelegate::applicationDidFinishLaunching() +{ + // initialize director + CCDirector *pDirector = CCDirector::sharedDirector(); + pDirector->setOpenGLView(&CCEGLView::sharedOpenGLView()); + + // enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices. +// pDirector->enableRetinaDisplay(true); + + // sets landscape mode + pDirector->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft); + + // turn on display FPS + pDirector->setDisplayFPS(true); + + // set FPS. the default value is 1.0/60 if you don't call this + pDirector->setAnimationInterval(1.0 / 60); + + // create a scene. it's an autorelease object + CCScene *pScene = HelloWorld::scene(); + + // run + pDirector->runWithScene(pScene); + + return true; +} + +// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +void AppDelegate::applicationDidEnterBackground() +{ + CCDirector::sharedDirector()->pause(); + + // if you use SimpleAudioEngine, it must be pause + // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); +} + +// this function will be called when the app is active again +void AppDelegate::applicationWillEnterForeground() +{ + CCDirector::sharedDirector()->resume(); + + // if you use SimpleAudioEngine, it must resume here + // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); +} diff --git a/template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.h b/template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.h new file mode 100644 index 0000000000..3161a11d65 --- /dev/null +++ b/template/xcode4/cocos2d-x.xctemplate/Classes/AppDelegate.h @@ -0,0 +1,51 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppDelegate.h +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#ifndef _APP_DELEGATE_H_ +#define _APP_DELEGATE_H_ + +#include "CCApplication.h" + +/** +@brief The cocos2d Application. + +The reason for implement as private inheritance is to hide some interface call by CCDirector. +*/ +class AppDelegate : private cocos2d::CCApplication +{ +public: + AppDelegate(); + virtual ~AppDelegate(); + + /** + @brief Implement for initialize OpenGL instance, set source path, etc... + */ + virtual bool initInstance(); + + /** + @brief Implement CCDirector and CCScene init code here. + @return true Initialize success, app continue. + @return false Initialize failed, app terminate. + */ + virtual bool applicationDidFinishLaunching(); + + /** + @brief The function be called when the application enter background + @param the pointer of the application + */ + virtual void applicationDidEnterBackground(); + + /** + @brief The function be called when the application enter foreground + @param the pointer of the application + */ + virtual void applicationWillEnterForeground(); +}; + +#endif // _APP_DELEGATE_H_ + diff --git a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp new file mode 100755 index 0000000000..8a7419439d --- /dev/null +++ b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp @@ -0,0 +1,187 @@ +// +// HelloWorldScene.cpp +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + + +#include "HelloWorldScene.h" + +using namespace cocos2d; + +enum { + kTagBatchNode = 1, +}; + +static void +eachShape(void *ptr, void* unused) +{ + cpShape *shape = (cpShape*) ptr; + CCSprite *sprite = (CCSprite*)shape->data; + if( sprite ) + { + cpBody *body = shape->body; + + // TIP: cocos2d and chipmunk uses the same struct to store it's position + // chipmunk uses: cpVect, and cocos2d uses CGPoint but in reality the are the same + // since v0.7.1 you can mix them if you want. + sprite->setPosition(CCPointMake(body->p.x, body->p.y)); + + sprite->setRotation((float) CC_RADIANS_TO_DEGREES( -body->a )); + } +} + +HelloWorld::HelloWorld() +{ +} + +HelloWorld::~HelloWorld() +{ +} + +CCScene* HelloWorld::scene() +{ + // 'scene' is an autorelease object. + CCScene *scene = CCScene::node(); + + // 'layer' is an autorelease object. + HelloWorld *layer = HelloWorld::node(); + + // add layer as a child to scene + scene->addChild(layer); + + // return the scene + return scene; +} + + +void HelloWorld::addNewSpriteX(float x, float y) +{ + int posx, posy; + + CCSpriteBatchNode *batch = (CCSpriteBatchNode*) getChildByTag(kTagBatchNode); + + posx = (CCRANDOM_0_1() * 200); + posy = (CCRANDOM_0_1() * 200); + + posx = (posx % 4) * 85; + posy = (posy % 3) * 121; + + CCSprite *sprite = CCSprite::spriteWithBatchNode(batch, CCRectMake(posx, posy, 85, 121)); + batch->addChild(sprite); + + sprite->setPosition(ccp(x, y)); + + int num = 4; + cpVect verts[] = { + cpv(-24,-54), + cpv(-24, 54), + cpv( 24, 54), + cpv( 24,-54), + }; + + cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpv(0, 0))); + + // TIP: + // since v0.7.1 you can assign CGPoint to chipmunk instead of cpVect. + // cpVect == CGPoint + body->p = cpv(x, y); + cpSpaceAddBody(space, body); + + cpShape* shape = cpPolyShapeNew(body, num, verts, cpv(0, 0)); + shape->e = 0.5f; shape->u = 0.5f; + shape->data = sprite; + cpSpaceAddShape(space, shape); +} + +bool HelloWorld::init() +{ + bool ret = false; + + if (ret = CCLayer::init()) + { + setIsTouchEnabled(true); + + CCSize wins = CCDirector::sharedDirector()->getWinSize(); + cpInitChipmunk(); + + cpBody *staticBody = cpBodyNew(INFINITY, INFINITY); + space = cpSpaceNew(); + cpSpaceResizeStaticHash(space, 400.0f, 40); + cpSpaceResizeActiveHash(space, 100, 600); + + space->gravity = cpv(0, 0); + space->elasticIterations = space->iterations; + + cpShape *shape; + + // bottom + shape = cpSegmentShapeNew(staticBody, cpv(0,0), cpv(wins.width,0), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + // top + shape = cpSegmentShapeNew(staticBody, cpv(0,wins.height), cpv(wins.width,wins.height), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + // left + shape = cpSegmentShapeNew(staticBody, cpv(0,0), cpv(0,wins.height), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + // right + shape = cpSegmentShapeNew(staticBody, cpv(wins.width,0), cpv(wins.width,wins.height), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + CCSpriteBatchNode *batch = CCSpriteBatchNode::batchNodeWithFile("grossini_dance_atlas.png", 100); + addChild(batch, 0, kTagBatchNode); + + addNewSpriteX(200, 200); + + schedule(schedule_selector(HelloWorld::step)); + } + + return ret; +} + +void HelloWorld::onEnter() +{ + CCLayer::onEnter(); +} + +void HelloWorld::step(ccTime delta) +{ + int steps = 2; + CGFloat dt = delta/(CGFloat)steps; + + for(int i=0; iactiveShapes, &eachShape, NULL); + cpSpaceHashEach(space->staticShapes, &eachShape, NULL); +} + + +void HelloWorld::ccTouchesEnded(CCSet *touches, CCEvent *event) +{ + CCSetIterator it; + CCTouch *touch; + + for (it = touches->begin(); it != touches->end(); it++) { + touch = (CCTouch*)(*it); + + if (! touch) { + break; + } + + CCPoint location = touch->locationInView(touch->view()); + location = CCDirector::sharedDirector()->convertToGL(location); + addNewSpriteX(location.x, location.y); + } +} + diff --git a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h new file mode 100755 index 0000000000..0c5cf16215 --- /dev/null +++ b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h @@ -0,0 +1,36 @@ +// +// HelloWorldScene.h +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#ifndef __HELLOW_WORLD_H__ +#define __HELLOW_WORLD_H__ + +#include "cocos2d.h" + +// include Chipmunk headers +#include "chipmunk.h" + +// HelloWorld Layer +class HelloWorld : public cocos2d::CCLayer { +public: + HelloWorld(); + ~HelloWorld(); + + static cocos2d::CCScene* scene(); + void step(cocos2d::ccTime dt); + void addNewSpriteX(float x, float y); + virtual void onEnter(); + virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent *event); + + LAYER_NODE_FUNC(HelloWorld); + +private: + bool init(); + cpSpace *space; +}; + +#endif // __HELLOW_WORLD_H__ diff --git a/template/xcode4/cocos2d-x.xctemplate/Prefix.pch b/template/xcode4/cocos2d-x.xctemplate/Prefix.pch new file mode 100755 index 0000000000..aa3260079c --- /dev/null +++ b/template/xcode4/cocos2d-x.xctemplate/Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the '___PROJECTNAME___' target in the '___PROJECTNAME___' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/template/xcode4/cocos2d-x.xctemplate/TemplateIcon.icns b/template/xcode4/cocos2d-x.xctemplate/TemplateIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..b2997c4ec2c9dc803041c2676a6cebfd065aa955 GIT binary patch literal 53803 zcmeEvXIxcR_V%Xts$xaTy%)t;qp=s@Hmbc>>?lp7ThF}|yJ#$QktV%&X@V4MCX-~6 z$xJ5I*igYP<#OIerZ``vc7N1&vyKW?RoZGL4TaF zYsHf1Y%i;L{-RgGwk-+X9Xw%w8_V{-z;*W2=DoiDo|Z1Jas3(l@|L^zuE4-uOUYMk z&-1739m9a2y*@qx%Sj>I{p{dV_U@8B+t=^%+vq^z@r$SIlbzeowT6b=$frL)ecGc4 zTmMBn{Q=k z3k9=kZ?&{Gm6SBK+^85Y6grai6|LOQ*KT=@bGCDsN2Xo5-c(Z5RCnPMJA0AHeiBK& z*-(_pp& z;_}M5pEZ|e-~M{7Y3}7qX(hFXNiAEjkG(SI!7R}tob0k>`HB@w zSFOUomoIUd?BcP*)6;v)91owJUY_VM-Iv1GZYug~taYCOZ? zJMat7a|kZGIOI*V2;6_9<+E0*6lPo}I{E}pkw zv8`$2wUVsQZ_OjF3+K&{y3HbaY<>t^LngXOXH2md2?tw-%^>RsstHB*Q^wDlGxrl? zLWU5HX>;bx8b5mKWZU5;!*x~628|dqdFtq4qsET49c9Dk+l;auJ9gAC|LNYIgs5l_ zEbZ)7^!?M@Svs&39{%>9UKUs1{kgaEouBA!h=kw$qj>-N|L>naMDKlm-^Dq;KsL)^FQ+2}ZN)mPVPp2OqZb!yWeNGKDi6R_PQV7H^&6cYN* z<1$uoz-_;O0I-7sf>%4Z4kf?BXWl;D&i+XD`mfj>!~~8C2=;Jrnor6A-*;WXUcH$= z?x4pyzo5X~enCOI93=~e?qS&R^g1N#VQ-Peo8$gJRiKqlZ|(6*fc{yUZm9o@*!tU}TCieB$wZyR_A1_bWezc*l4aKM4huC9_r z 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 { + UIWindow *window; +} + +@end + diff --git a/template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm b/template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm new file mode 100644 index 0000000000..1966a57513 --- /dev/null +++ b/template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm @@ -0,0 +1,99 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppController.mm +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// +#import +#import "___PROJECTNAMEASIDENTIFIER___AppController.h" +#import "cocos2d.h" +#import "EAGLView.h" +#import "___PROJECTNAMEASIDENTIFIER___AppDelegate.h" + +@implementation ___PROJECTNAMEASIDENTIFIER___AppController + +#pragma mark - +#pragma mark Application lifecycle + +// cocos2d application instance +static AppDelegate s_sharedApplication; + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + + // Override point for customization after application launch. + + // Add the view controller's view to the window and display. + window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; + EAGLView *__glView = [EAGLView viewWithFrame: [window bounds] + pixelFormat: kEAGLColorFormatRGBA8 + depthFormat: GL_DEPTH_COMPONENT16_OES + preserveBackbuffer: NO + sharegroup: nil + multiSampling: NO + numberOfSamples: 0 ]; + [window addSubview: __glView]; + [window makeKeyAndVisible]; + + [[UIApplication sharedApplication] setStatusBarHidden: YES]; + + cocos2d::CCApplication::sharedApplication().run(); + return YES; +} + + +- (void)applicationWillResignActive:(UIApplication *)application { + /* + Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + */ + cocos2d::CCDirector::sharedDirector()->pause(); +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + /* + Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + */ + cocos2d::CCDirector::sharedDirector()->resume(); +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + /* + Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + If your application supports background execution, called instead of applicationWillTerminate: when the user quits. + */ + cocos2d::CCDirector::sharedDirector()->stopAnimation(); +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + /* + Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. + */ + cocos2d::CCDirector::sharedDirector()->startAnimation(); +} + + +- (void)applicationWillTerminate:(UIApplication *)application { + /* + Called when the application is about to terminate. + See also applicationDidEnterBackground:. + */ +} + + +#pragma mark - +#pragma mark Memory management + +- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { + /* + Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. + */ +} + + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/template/xcode4/cocos2d-x.xctemplate/ios/main.m b/template/xcode4/cocos2d-x.xctemplate/ios/main.m new file mode 100755 index 0000000000..106d54c93e --- /dev/null +++ b/template/xcode4/cocos2d-x.xctemplate/ios/main.m @@ -0,0 +1,16 @@ +// +// main.m +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) { + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppController"); + [pool release]; + return retVal; +} From 3b7d82eed7147be99dbb1365cbd9c0aff5d18772 Mon Sep 17 00:00:00 2001 From: Walzer Date: Mon, 13 Jun 2011 13:47:01 +0800 Subject: [PATCH 05/11] add gitignore for xcode4 --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 097e6d58a8..191551f868 100644 --- a/.gitignore +++ b/.gitignore @@ -43,5 +43,10 @@ build_*_xcode/ # Ignore files build by xcode *.mode*v* *.pbxuser +*.xcbkptlist +*.xcscheme +*.xcworkspacedata +*.xcuserstate +xcschememanagement.plist build/ .DS_Store From a308196868923e0da61aa5cfd67aaf78304c8247 Mon Sep 17 00:00:00 2001 From: Walzer Date: Mon, 13 Jun 2011 14:31:25 +0800 Subject: [PATCH 06/11] issue #398, cocos2d-x only template for xcode is ok now. hura! --- .../Classes/HelloWorldScene.cpp | 269 ++++++------------ .../Classes/HelloWorldScene.h | 58 ++-- .../cocos2d-x.xctemplate/ios/AppController.mm | 4 +- 3 files changed, 106 insertions(+), 225 deletions(-) mode change 100755 => 100644 template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp mode change 100755 => 100644 template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h diff --git a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp old mode 100755 new mode 100644 index 8a7419439d..76d2dbbd3d --- a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp +++ b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp @@ -1,187 +1,82 @@ -// -// HelloWorldScene.cpp -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. -// - - -#include "HelloWorldScene.h" - -using namespace cocos2d; - -enum { - kTagBatchNode = 1, -}; - -static void -eachShape(void *ptr, void* unused) -{ - cpShape *shape = (cpShape*) ptr; - CCSprite *sprite = (CCSprite*)shape->data; - if( sprite ) - { - cpBody *body = shape->body; - - // TIP: cocos2d and chipmunk uses the same struct to store it's position - // chipmunk uses: cpVect, and cocos2d uses CGPoint but in reality the are the same - // since v0.7.1 you can mix them if you want. - sprite->setPosition(CCPointMake(body->p.x, body->p.y)); - - sprite->setRotation((float) CC_RADIANS_TO_DEGREES( -body->a )); - } -} - -HelloWorld::HelloWorld() -{ -} - -HelloWorld::~HelloWorld() -{ -} - -CCScene* HelloWorld::scene() -{ - // 'scene' is an autorelease object. - CCScene *scene = CCScene::node(); - - // 'layer' is an autorelease object. - HelloWorld *layer = HelloWorld::node(); - - // add layer as a child to scene - scene->addChild(layer); - - // return the scene - return scene; -} - - -void HelloWorld::addNewSpriteX(float x, float y) -{ - int posx, posy; - - CCSpriteBatchNode *batch = (CCSpriteBatchNode*) getChildByTag(kTagBatchNode); - - posx = (CCRANDOM_0_1() * 200); - posy = (CCRANDOM_0_1() * 200); - - posx = (posx % 4) * 85; - posy = (posy % 3) * 121; - - CCSprite *sprite = CCSprite::spriteWithBatchNode(batch, CCRectMake(posx, posy, 85, 121)); - batch->addChild(sprite); - - sprite->setPosition(ccp(x, y)); - - int num = 4; - cpVect verts[] = { - cpv(-24,-54), - cpv(-24, 54), - cpv( 24, 54), - cpv( 24,-54), - }; - - cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpv(0, 0))); - - // TIP: - // since v0.7.1 you can assign CGPoint to chipmunk instead of cpVect. - // cpVect == CGPoint - body->p = cpv(x, y); - cpSpaceAddBody(space, body); - - cpShape* shape = cpPolyShapeNew(body, num, verts, cpv(0, 0)); - shape->e = 0.5f; shape->u = 0.5f; - shape->data = sprite; - cpSpaceAddShape(space, shape); -} - -bool HelloWorld::init() -{ - bool ret = false; - - if (ret = CCLayer::init()) - { - setIsTouchEnabled(true); - - CCSize wins = CCDirector::sharedDirector()->getWinSize(); - cpInitChipmunk(); - - cpBody *staticBody = cpBodyNew(INFINITY, INFINITY); - space = cpSpaceNew(); - cpSpaceResizeStaticHash(space, 400.0f, 40); - cpSpaceResizeActiveHash(space, 100, 600); - - space->gravity = cpv(0, 0); - space->elasticIterations = space->iterations; - - cpShape *shape; - - // bottom - shape = cpSegmentShapeNew(staticBody, cpv(0,0), cpv(wins.width,0), 0.0f); - shape->e = 1.0f; shape->u = 1.0f; - cpSpaceAddStaticShape(space, shape); - - // top - shape = cpSegmentShapeNew(staticBody, cpv(0,wins.height), cpv(wins.width,wins.height), 0.0f); - shape->e = 1.0f; shape->u = 1.0f; - cpSpaceAddStaticShape(space, shape); - - // left - shape = cpSegmentShapeNew(staticBody, cpv(0,0), cpv(0,wins.height), 0.0f); - shape->e = 1.0f; shape->u = 1.0f; - cpSpaceAddStaticShape(space, shape); - - // right - shape = cpSegmentShapeNew(staticBody, cpv(wins.width,0), cpv(wins.width,wins.height), 0.0f); - shape->e = 1.0f; shape->u = 1.0f; - cpSpaceAddStaticShape(space, shape); - - CCSpriteBatchNode *batch = CCSpriteBatchNode::batchNodeWithFile("grossini_dance_atlas.png", 100); - addChild(batch, 0, kTagBatchNode); - - addNewSpriteX(200, 200); - - schedule(schedule_selector(HelloWorld::step)); - } - - return ret; -} - -void HelloWorld::onEnter() -{ - CCLayer::onEnter(); -} - -void HelloWorld::step(ccTime delta) -{ - int steps = 2; - CGFloat dt = delta/(CGFloat)steps; - - for(int i=0; iactiveShapes, &eachShape, NULL); - cpSpaceHashEach(space->staticShapes, &eachShape, NULL); -} - - -void HelloWorld::ccTouchesEnded(CCSet *touches, CCEvent *event) -{ - CCSetIterator it; - CCTouch *touch; - - for (it = touches->begin(); it != touches->end(); it++) { - touch = (CCTouch*)(*it); - - if (! touch) { - break; - } - - CCPoint location = touch->locationInView(touch->view()); - location = CCDirector::sharedDirector()->convertToGL(location); - addNewSpriteX(location.x, location.y); - } -} - +#include "HelloWorldScene.h" + +USING_NS_CC; + +CCScene* HelloWorld::scene() +{ + // 'scene' is an autorelease object + CCScene *scene = CCScene::node(); + + // 'layer' is an autorelease object + HelloWorld *layer = HelloWorld::node(); + + // add layer as a child to scene + scene->addChild(layer); + + // return the scene + return scene; +} + +// on "init" you need to initialize your instance +bool HelloWorld::init() +{ + ////////////////////////////// + // 1. super init first + if ( !CCLayer::init() ) + { + return false; + } + + ///////////////////////////// + // 2. add a menu item with "X" image, which is clicked to quit the program + // you may modify it. + + // add a "close" icon to exit the progress. it's an autorelease object + CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage( + "CloseNormal.png", + "CloseSelected.png", + this, + menu_selector(HelloWorld::menuCloseCallback) ); + pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) ); + + // create menu, it's an autorelease object + CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem, NULL); + pMenu->setPosition( CCPointZero ); + this->addChild(pMenu, 1); + + ///////////////////////////// + // 3. add your codes below... + + // add a label shows "Hello World" + // create and initialize a label + CCLabelTTF* pLabel = CCLabelTTF::labelWithString("Hello World", "Thonburi", 34); + + // ask director the window size + CCSize size = CCDirector::sharedDirector()->getWinSize(); + + // position the label on the center of the screen + pLabel->setPosition( ccp(size.width / 2, size.height - 20) ); + + // add the label as a child to this layer + this->addChild(pLabel, 1); + + // add "HelloWorld" splash screen" + CCSprite* pSprite = CCSprite::spriteWithFile("HelloWorld.png"); + + // position the sprite on the center of the screen + pSprite->setPosition( ccp(size.width/2, size.height/2) ); + + // add the sprite as a child to this layer + this->addChild(pSprite, 0); + + return true; +} + +void HelloWorld::menuCloseCallback(CCObject* pSender) +{ + CCDirector::sharedDirector()->end(); + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + exit(0); +#endif +} diff --git a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h old mode 100755 new mode 100644 index 0c5cf16215..274a176df0 --- a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h +++ b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.h @@ -1,36 +1,22 @@ -// -// HelloWorldScene.h -// ___PROJECTNAME___ -// -// Created by ___FULLUSERNAME___ on ___DATE___. -// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. -// - -#ifndef __HELLOW_WORLD_H__ -#define __HELLOW_WORLD_H__ - -#include "cocos2d.h" - -// include Chipmunk headers -#include "chipmunk.h" - -// HelloWorld Layer -class HelloWorld : public cocos2d::CCLayer { -public: - HelloWorld(); - ~HelloWorld(); - - static cocos2d::CCScene* scene(); - void step(cocos2d::ccTime dt); - void addNewSpriteX(float x, float y); - virtual void onEnter(); - virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent *event); - - LAYER_NODE_FUNC(HelloWorld); - -private: - bool init(); - cpSpace *space; -}; - -#endif // __HELLOW_WORLD_H__ +#ifndef __HELLOWORLD_SCENE_H__ +#define __HELLOWORLD_SCENE_H__ + +#include "cocos2d.h" + +class HelloWorld : public cocos2d::CCLayer +{ +public: + // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone + virtual bool init(); + + // there's no 'id' in cpp, so we recommand to return the exactly class pointer + static cocos2d::CCScene* scene(); + + // a selector callback + virtual void menuCloseCallback(CCObject* pSender); + + // implement the "static node()" method manually + LAYER_NODE_FUNC(HelloWorld); +}; + +#endif // __HELLOWORLD_SCENE_H__ diff --git a/template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm b/template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm index 1966a57513..5e28a17a2e 100644 --- a/template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm +++ b/template/xcode4/cocos2d-x.xctemplate/ios/AppController.mm @@ -6,10 +6,10 @@ // Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. // #import -#import "___PROJECTNAMEASIDENTIFIER___AppController.h" +#import "AppController.h" #import "cocos2d.h" #import "EAGLView.h" -#import "___PROJECTNAMEASIDENTIFIER___AppDelegate.h" +#import "AppDelegate.h" @implementation ___PROJECTNAMEASIDENTIFIER___AppController From 91326028ece9e410fa0e3124664ea7aaa1f28ac8 Mon Sep 17 00:00:00 2001 From: liswei Date: Mon, 13 Jun 2011 16:58:55 +0800 Subject: [PATCH 08/11] fixed #516 Undefined Behaviour in ccCArray.h (signed / unsigned conversion) --- cocos2dx/actions/CCActionManager.cpp | 2 +- cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp | 5 +++-- cocos2dx/support/data_support/ccCArray.h | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/cocos2dx/actions/CCActionManager.cpp b/cocos2dx/actions/CCActionManager.cpp index ee1d8ee150..a46deed4e5 100644 --- a/cocos2dx/actions/CCActionManager.cpp +++ b/cocos2dx/actions/CCActionManager.cpp @@ -286,7 +286,7 @@ void CCActionManager::removeAction(cocos2d::CCAction *pAction) if (pElement) { unsigned int i = ccArrayGetIndexOfObject(pElement->actions, pAction); - if ((int)i != -1) + if (UINT_MAX == i) { removeActionAtIndex(i, pElement); } diff --git a/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp b/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp index f42d618247..8a009bcce8 100644 --- a/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp +++ b/cocos2dx/sprite_nodes/CCSpriteBatchNode.cpp @@ -422,7 +422,8 @@ namespace cocos2d // ignore parent Z if parent is spriteSheet bool bIgnoreParent = (CCSpriteBatchNode*)(pobSprite->getParent()) == this; CCSprite *pPrevious = NULL; - if (uChildIndex > 0) + if (uChildIndex > 0 && + uChildIndex < UINT_MAX) { pPrevious = (CCSprite*)(pBrothers->objectAtIndex(uChildIndex - 1)); } @@ -537,7 +538,7 @@ namespace cocos2d pobSprite->useSelfRender(); unsigned int uIndex = m_pobDescendants->indexOfObject(pobSprite); - if ((int)uIndex != -1) + if (uIndex != UINT_MAX) { m_pobDescendants->removeObjectAtIndex(uIndex); diff --git a/cocos2dx/support/data_support/ccCArray.h b/cocos2dx/support/data_support/ccCArray.h index 482d8e5381..13ec6983ce 100644 --- a/cocos2dx/support/data_support/ccCArray.h +++ b/cocos2dx/support/data_support/ccCArray.h @@ -118,13 +118,13 @@ static inline unsigned int ccArrayGetIndexOfObject(ccArray *arr, CCObject* objec } } - return (unsigned int)-1; + return UINT_MAX; } /** Returns a Boolean value that indicates whether object is present in array. */ static inline bool ccArrayContainsObject(ccArray *arr, CCObject* object) { - return (int)ccArrayGetIndexOfObject(arr, object) != -1; + return ccArrayGetIndexOfObject(arr, object) != UINT_MAX; } /** Appends an object. Bahaviour undefined if array doesn't have enough capacity. */ @@ -210,7 +210,7 @@ static inline void ccArrayFastRemoveObjectAtIndex(ccArray *arr, unsigned int ind static inline void ccArrayFastRemoveObject(ccArray *arr, CCObject* object) { unsigned int index = ccArrayGetIndexOfObject(arr, object); - if ((int)index != -1) + if (index != UINT_MAX) ccArrayFastRemoveObjectAtIndex(arr, index); } @@ -220,7 +220,7 @@ static inline void ccArrayRemoveObject(ccArray *arr, CCObject* object) { unsigned int index = ccArrayGetIndexOfObject(arr, object); - if ((int)index != -1) + if (index != UINT_MAX) { ccArrayRemoveObjectAtIndex(arr, index); } @@ -422,7 +422,7 @@ static inline void ccCArrayFastRemoveValueAtIndex(ccCArray *arr, unsigned int in static inline void ccCArrayRemoveValue(ccCArray *arr, void* value) { unsigned int index = ccCArrayGetIndexOfValue(arr, value); - if ((int)index != -1) + if (index != UINT_MAX) { ccCArrayRemoveValueAtIndex(arr, index); } From ac9c735cb59c9d42379b8b968a560091c060fd2d Mon Sep 17 00:00:00 2001 From: Walzer Date: Mon, 13 Jun 2011 18:20:57 +0800 Subject: [PATCH 09/11] issue #398, add template_generator.py & generator shell script, add box2d/chipmunk/cocosdenshion ctemplate --- generate_xcode4_templates.sh | 17 +++ template/xcode4/template_generator.py | 200 ++++++++++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100755 generate_xcode4_templates.sh create mode 100644 template/xcode4/template_generator.py diff --git a/generate_xcode4_templates.sh b/generate_xcode4_templates.sh new file mode 100755 index 0000000000..c333fa08a8 --- /dev/null +++ b/generate_xcode4_templates.sh @@ -0,0 +1,17 @@ +echo "generating libcocos2dx" +mkdir -p template/xcode4/lib_cocos2dx.xctemplate +python ./template/xcode4/template_generator.py --directory cocos2dx --identifier libcocos2dx --prefix libs --exclude "android win32 airplay wophone third_party CCImage.cpp Android.mk" > ./template/xcode4/lib_cocos2dx.xctemplate/TemplateInfo.plist + +echo "generating libcocosdenshion" +mkdir -p template/xcode4/lib_cocosdenshion.xctemplate +python ./template/xcode4/template_generator.py --directory CocosDenshion --identifier libcocosdenshion --prefix libs --exclude "android win32 airplay wophone Android.mk" > ./template/xcode4/lib_cocosdenshion.xctemplate/TemplateInfo.plist + +echo "generating libbox2d" +mkdir -p template/xcode4/lib_box2d.xctemplate +python ./template/xcode4/template_generator.py --directory Box2D --identifier libbox2d --prefix libs --exclude "android win32 airplay wophone Android.mk" > ./template/xcode4/lib_box2d.xctemplate/TemplateInfo.plist + +echo "generating libchipmunk" +mkdir -p template/xcode4/lib_chipmunk.xctemplate +python ./template/xcode4/template_generator.py --directory chipmunk --identifier libchipmunk --prefix libs --exclude "android win32 airplay wophone Android.mk" > ./template/xcode4/lib_chipmunk.xctemplate/TemplateInfo.plist + +echo "done" \ No newline at end of file diff --git a/template/xcode4/template_generator.py b/template/xcode4/template_generator.py new file mode 100644 index 0000000000..affdc14ab3 --- /dev/null +++ b/template/xcode4/template_generator.py @@ -0,0 +1,200 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# ---------------------------------------------------------------------------- +# Xcode 4 template generator for cocos2d project +# (c) 2011 Ricardo Quesada +# +# LICENSE: Dual License: MIT & GNU GPL v2 Whatever suits you best. +# +# Given a directory, it generates the "Definitions" and "Nodes" elements +# +# Format taken from: http://blog.boreal-kiss.net/2011/03/11/a-minimal-project-template-for-xcode-4/ +# ---------------------------------------------------------------------------- +''' +Xcode 4 template generator +''' + +__docformat__ = 'restructuredtext' + +_template_open_body = """ + + + + + Description + This is a template description. + Identifier + org.cocos2d-x.%s + Kind + Xcode.Xcode3.ProjectTemplateUnitKind +""" + +_template_close_body = "\n" + +# python +import sys +import os +import getopt +import glob + +class Xcode4Template(object): + def __init__( self, directory, group=0, identifier="XXX", prefix="libs", exclude=[] ): + self.directory = directory + self.files_to_include = [] + self.wildcard = '*' + self.ignore_extensions = ['h','txt','html','patch'] + self.prefix = prefix + # self.ignore_keywords = ['win32','airplay','android','Android','wophone', 'CCImage.cpp', 'third_party'] + self.group_start_index = group # eg: if 1 then libs/cocos2d/support -> ["cocos2d", "support"] ignoring "libs" + self.output = [] + self.identifier = identifier + + def scandirs(self, path): + for currentFile in glob.glob( os.path.join(path, self.wildcard) ): + bExclude = False + for exclude_keyword in exclude: + if currentFile.find(exclude_keyword) >= 0: + bExclude = True + break + + if bExclude is False: + if os.path.isdir(currentFile): + self.scandirs(currentFile) + else: + self.files_to_include.append( currentFile ) + + # + # append the definitions + # + def append_definition( self, output_body, path, group, dont_index ): + #add 'libs/' + path = self.prefix + '/' + path + group = [ self.prefix ] + group; + + output_body.append("\t\t%s" % path ) + + output_body.append("\t\t") + if group: + output_body.append("\t\t\tGroup") + output_body.append("\t\t\t") + for g in group: + output_body.append("\t\t\t\t%s" % g ) + output_body.append("\t\t\t") + + + output_body.append("\t\t\tPath\n\t\t\t%s" % path ) + + if dont_index: + output_body.append("\t\t\tTargetIndices\n\t\t\t") + + output_body.append("\t\t") + + # + # Generate the "Definitions" section + # + def generate_definitions( self ): + output_header = "\tDefinitions" + output_dict_open = "\t" + output_dict_close = "\t" + + output_body = [] + for path in self.files_to_include: + + # group name + group = [] + # obtain group name from directory + dirs = os.path.dirname(path) + group = dirs.split('/') + + group = group[self.group_start_index:] + + # get the extension + filename = os.path.basename(path) + name_extension= filename.split('.') + extension = None + if len(name_extension) == 2: + extension = name_extension[1] + + self.append_definition( output_body, path, group, extension in self.ignore_extensions ) + + self.output.append( output_header ) + self.output.append( output_dict_open ) + self.output.append( "\n".join( output_body ) ) + self.output.append( output_dict_close ) + + # + # Generates the "Nodes" section + # + def generate_nodes( self ): + output_header = "\tNodes" + output_open = "\t" + output_close = "\t" + + output_body = [] + for path in self.files_to_include: + path = self.prefix + '/' + path + output_body.append("\t\t%s" % path ) + + self.output.append( output_header ) + self.output.append( output_open ) + self.output.append( "\n".join( output_body ) ) + self.output.append( output_close ) + + # + # Generates the plist. Send it to to stdout + # + def generate_xml( self ): + self.output.append( _template_open_body % self.identifier ) + self.generate_definitions() + self.generate_nodes() + self.output.append( _template_close_body ) + + print "\n".join( self.output ) + + def generate( self ): + self.scandirs( self.directory ) + self.generate_xml() + +def help(): + print "%s v1.0 - An utility to generate Xcode 4 templates" % sys.argv[0] + print "Usage:" + print "\t-d directory (directory to parse)" + print "\t-g directory_used_as_starting_group (if 1, then 'libs/cocos2d/Support/' -> ['cocos2d','Support'] ignoring 'libs')" + print "\t-i identifier (Xcode4 template identifier)" + print "\nExample:" + print "\t%s -d cocos2d -g 0 -i cocos2dlib" % sys.argv[0] + sys.exit(-1) + +if __name__ == "__main__": + if len( sys.argv ) == 1: + help() + + directory = None + group = None + identifier = None + prefix = "" + exclude = [] + + argv = sys.argv[1:] + try: + opts, args = getopt.getopt(argv, "d:g:i:p:e:", ["directory=","group=","identifier=","prefix=", "exclude="]) + for opt, arg in opts: + if opt in ("-d","--directory"): + directory = arg + if opt in ("-g","--group"): + group = arg + if opt in ("-i","--identifier"): + identifier = arg + if opt in ("-p","--prefix"): + prefix = arg + if opt in ("-e","--exclude"): + exclude = arg.split() + except getopt.GetoptError,e: + print e + + if directory == None: + help() + + #generate libs/cocos2dx + gen = Xcode4Template( directory=directory, group=group, identifier=identifier, prefix=prefix, exclude=exclude ) + gen.generate() From 362ab18c97711ddb2c9633bc95175f200f568e1a Mon Sep 17 00:00:00 2001 From: Walzer Date: Mon, 13 Jun 2011 20:35:39 +0800 Subject: [PATCH 10/11] issue #398, xcode4 template for box2d & chipmunk --- .../Classes/HelloWorldScene.cpp | 4 +- .../Classes/AppDelegate.cpp | 110 +++++++++ .../Classes/AppDelegate.h | 51 ++++ .../Classes/HelloWorldScene.cpp | 217 ++++++++++++++++++ .../Classes/HelloWorldScene.h | 33 +++ .../cocos2d_box2d.xctemplate/Prefix.pch | 8 + .../TemplateIcon.icns | Bin 0 -> 53803 bytes .../ios/AppController.h | 14 ++ .../ios/AppController.mm | 98 ++++++++ .../cocos2d_box2d.xctemplate/ios/main.m | 16 ++ .../Classes/AppDelegate.cpp | 110 +++++++++ .../Classes/AppDelegate.h | 51 ++++ .../Classes/HelloWorldScene.cpp | 189 +++++++++++++++ .../Classes/HelloWorldScene.h | 36 +++ .../cocos2d_chipmunk.xctemplate/Prefix.pch | 8 + .../TemplateIcon.icns | Bin 0 -> 53803 bytes .../ios/AppController.h | 14 ++ .../ios/AppController.mm | 99 ++++++++ .../cocos2d_chipmunk.xctemplate/ios/main.m | 16 ++ 19 files changed, 1073 insertions(+), 1 deletion(-) create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.cpp create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.h create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.cpp create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.h create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/Prefix.pch create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/TemplateIcon.icns create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/ios/AppController.h create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/ios/AppController.mm create mode 100644 template/xcode4/cocos2d_box2d.xctemplate/ios/main.m create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.cpp create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.h create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.cpp create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.h create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/Prefix.pch create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/TemplateIcon.icns create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/ios/AppController.h create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/ios/AppController.mm create mode 100644 template/xcode4/cocos2d_chipmunk.xctemplate/ios/main.m diff --git a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp index 76d2dbbd3d..89b2f49a1a 100644 --- a/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp +++ b/template/xcode4/cocos2d-x.xctemplate/Classes/HelloWorldScene.cpp @@ -1,6 +1,8 @@ #include "HelloWorldScene.h" +#include "SimpleAudioEngine.h" -USING_NS_CC; +using namespace cocos2d; +using namespace CocosDenshion; CCScene* HelloWorld::scene() { diff --git a/template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.cpp b/template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.cpp new file mode 100644 index 0000000000..fb9ffc4e46 --- /dev/null +++ b/template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.cpp @@ -0,0 +1,110 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppDelegate.cpp +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#include "AppDelegate.h" + +#include "cocos2d.h" +#include "HelloWorldScene.h" + +USING_NS_CC; + +AppDelegate::AppDelegate() +{ + +} + +AppDelegate::~AppDelegate() +{ +} + +bool AppDelegate::initInstance() +{ + bool bRet = false; + do + { +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + + // Initialize OpenGLView instance, that release by CCDirector when application terminate. + // The HelloWorld is designed as HVGA. + CCEGLView * pMainWnd = new CCEGLView(); + CC_BREAK_IF(! pMainWnd + || ! pMainWnd->Create(TEXT("cocos2d: Hello World"), 320, 480)); + +#endif // CC_PLATFORM_WIN32 + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + // OpenGLView initialized in testsAppDelegate.mm on ios platform, nothing need to do here. +#endif // CC_PLATFORM_IOS + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + // android does not do anything +#endif + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WOPHONE) + + // Initialize OpenGLView instance, that release by CCDirector when application terminate. + // The HelloWorld is designed as HVGA. + CCEGLView* pMainWnd = new CCEGLView(this); + CC_BREAK_IF(! pMainWnd || ! pMainWnd->Create(320,480)); + +#ifndef _TRANZDA_VM_ + // on wophone emulator, we copy resources files to Work7/TG3/APP/ folder instead of zip file + cocos2d::CCFileUtils::setResource("HelloWorld.zip"); +#endif + +#endif // CC_PLATFORM_WOPHONE + + bRet = true; + } while (0); + return bRet; +} + +bool AppDelegate::applicationDidFinishLaunching() +{ + // initialize director + CCDirector *pDirector = CCDirector::sharedDirector(); + pDirector->setOpenGLView(&CCEGLView::sharedOpenGLView()); + + // enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices. +// pDirector->enableRetinaDisplay(true); + + // sets landscape mode + pDirector->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft); + + // turn on display FPS + pDirector->setDisplayFPS(true); + + // set FPS. the default value is 1.0/60 if you don't call this + pDirector->setAnimationInterval(1.0 / 60); + + // create a scene. it's an autorelease object + CCScene *pScene = HelloWorld::scene(); + + // run + pDirector->runWithScene(pScene); + + return true; +} + +// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +void AppDelegate::applicationDidEnterBackground() +{ + CCDirector::sharedDirector()->pause(); + + // if you use SimpleAudioEngine, it must be pause + // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); +} + +// this function will be called when the app is active again +void AppDelegate::applicationWillEnterForeground() +{ + CCDirector::sharedDirector()->resume(); + + // if you use SimpleAudioEngine, it must resume here + // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); +} diff --git a/template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.h b/template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.h new file mode 100644 index 0000000000..3161a11d65 --- /dev/null +++ b/template/xcode4/cocos2d_box2d.xctemplate/Classes/AppDelegate.h @@ -0,0 +1,51 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppDelegate.h +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#ifndef _APP_DELEGATE_H_ +#define _APP_DELEGATE_H_ + +#include "CCApplication.h" + +/** +@brief The cocos2d Application. + +The reason for implement as private inheritance is to hide some interface call by CCDirector. +*/ +class AppDelegate : private cocos2d::CCApplication +{ +public: + AppDelegate(); + virtual ~AppDelegate(); + + /** + @brief Implement for initialize OpenGL instance, set source path, etc... + */ + virtual bool initInstance(); + + /** + @brief Implement CCDirector and CCScene init code here. + @return true Initialize success, app continue. + @return false Initialize failed, app terminate. + */ + virtual bool applicationDidFinishLaunching(); + + /** + @brief The function be called when the application enter background + @param the pointer of the application + */ + virtual void applicationDidEnterBackground(); + + /** + @brief The function be called when the application enter foreground + @param the pointer of the application + */ + virtual void applicationWillEnterForeground(); +}; + +#endif // _APP_DELEGATE_H_ + diff --git a/template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.cpp b/template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.cpp new file mode 100644 index 0000000000..cdb2f51b64 --- /dev/null +++ b/template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.cpp @@ -0,0 +1,217 @@ +// +// HelloWorldScene.cpp +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// +#include "HelloWorldScene.h" +#include "SimpleAudioEngine.h" + +using namespace cocos2d; +using namespace CocosDenshion; + +#define PTM_RATIO 32 +enum +{ + kTagTileMap = 1, + kTagSpriteManager = 1, + kTagAnimation1 = 1, +}; + +HelloWorld::HelloWorld() +{ + setIsTouchEnabled( true ); + setIsAccelerometerEnabled( true ); + + CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); + //UXLOG(L"Screen width %0.2f screen height %0.2f",screenSize.width,screenSize.height); + + // Define the gravity vector. + b2Vec2 gravity; + gravity.Set(0.0f, -10.0f); + + // Do we want to let bodies sleep? + bool doSleep = true; + + // Construct a world object, which will hold and simulate the rigid bodies. + world = new b2World(gravity, doSleep); + + world->SetContinuousPhysics(true); + + /* + m_debugDraw = new GLESDebugDraw( PTM_RATIO ); + world->SetDebugDraw(m_debugDraw); + + uint flags = 0; + flags += b2DebugDraw::e_shapeBit; + flags += b2DebugDraw::e_jointBit; + flags += b2DebugDraw::e_aabbBit; + flags += b2DebugDraw::e_pairBit; + flags += b2DebugDraw::e_centerOfMassBit; + m_debugDraw->SetFlags(flags); + */ + + // Define the ground body. + b2BodyDef groundBodyDef; + groundBodyDef.position.Set(0, 0); // bottom-left corner + + // Call the body factory which allocates memory for the ground body + // from a pool and creates the ground box shape (also from a pool). + // The body is also added to the world. + b2Body* groundBody = world->CreateBody(&groundBodyDef); + + // Define the ground box shape. + b2PolygonShape groundBox; + + // bottom + groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(screenSize.width/PTM_RATIO,0)); + groundBody->CreateFixture(&groundBox, 0); + + // top + groundBox.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO)); + groundBody->CreateFixture(&groundBox, 0); + + // left + groundBox.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(0,0)); + groundBody->CreateFixture(&groundBox, 0); + + // right + groundBox.SetAsEdge(b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,0)); + groundBody->CreateFixture(&groundBox, 0); + + + //Set up sprite + + CCSpriteBatchNode *mgr = CCSpriteBatchNode::spriteSheetWithFile("blocks.png", 150); + addChild(mgr, 0, kTagSpriteManager); + + addNewSpriteWithCoords( CCPointMake(screenSize.width/2, screenSize.height/2) ); + + CCLabelTTF *label = CCLabelTTF::labelWithString("Tap screen", "Marker Felt", 32); + addChild(label, 0); + label->setColor( ccc3(0,0,255) ); + label->setPosition( CCPointMake( screenSize.width/2, screenSize.height-50) ); + + schedule( schedule_selector(HelloWorld::tick) ); +} + +HelloWorld::~HelloWorld() +{ + delete world; + world = NULL; + + //delete m_debugDraw; +} + +void HelloWorld::draw() +{ + // Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY + // Needed states: GL_VERTEX_ARRAY, + // Unneeded states: GL_TEXTURE_2D, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY + glDisable(GL_TEXTURE_2D); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + //world->DrawDebugData(); + + // restore default GL states + glEnable(GL_TEXTURE_2D); + glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); +} + +void HelloWorld::addNewSpriteWithCoords(CCPoint p) +{ + //UXLOG(L"Add sprite %0.2f x %02.f",p.x,p.y); + CCSpriteBatchNode* sheet = (CCSpriteBatchNode*)getChildByTag(kTagSpriteManager); + + //We have a 64x64 sprite sheet with 4 different 32x32 images. The following code is + //just randomly picking one of the images + int idx = (CCRANDOM_0_1() > .5 ? 0:1); + int idy = (CCRANDOM_0_1() > .5 ? 0:1); + CCSprite *sprite = sheet->createSpriteWithRect( CCRectMake(32 * idx,32 * idy,32,32)); + sheet->addChild(sprite); + + sprite->setPosition( CCPointMake( p.x, p.y) ); + + // Define the dynamic body. + //Set up a 1m squared box in the physics world + b2BodyDef bodyDef; + bodyDef.type = b2_dynamicBody; + bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO); + bodyDef.userData = sprite; + b2Body *body = world->CreateBody(&bodyDef); + + // Define another box shape for our dynamic body. + b2PolygonShape dynamicBox; + dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box + + // Define the dynamic body fixture. + b2FixtureDef fixtureDef; + fixtureDef.shape = &dynamicBox; + fixtureDef.density = 1.0f; + fixtureDef.friction = 0.3f; + body->CreateFixture(&fixtureDef); +} + + +void HelloWorld::tick(ccTime dt) +{ + //It is recommended that a fixed time step is used with Box2D for stability + //of the simulation, however, we are using a variable time step here. + //You need to make an informed choice, the following URL is useful + //http://gafferongames.com/game-physics/fix-your-timestep/ + + int velocityIterations = 8; + int positionIterations = 1; + + // Instruct the world to perform a single step of simulation. It is + // generally best to keep the time step and iterations fixed. + world->Step(dt, velocityIterations, positionIterations); + + //Iterate over the bodies in the physics world + for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) + { + if (b->GetUserData() != NULL) { + //Synchronize the AtlasSprites position and rotation with the corresponding body + CCSprite* myActor = (CCSprite*)b->GetUserData(); + myActor->setPosition( CCPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO) ); + myActor->setRotation( -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()) ); + } + } +} + +void HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event) +{ + //Add a new body/atlas sprite at the touched location + CCSetIterator it; + CCTouch* touch; + + for( it = touches->begin(); it != touches->end(); it++) + { + touch = (CCTouch*)(*it); + + if(!touch) + break; + + CCPoint location = touch->locationInView(touch->view()); + + location = CCDirector::sharedDirector()->convertToGL(location); + + addNewSpriteWithCoords( location ); + } +} + +CCScene* HelloWorld::scene() +{ + // 'scene' is an autorelease object + CCScene *scene = CCScene::node(); + + // add layer as a child to scene + CCLayer* layer = new HelloWorld(); + scene->addChild(layer); + layer->release(); + + return scene; +} diff --git a/template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.h b/template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.h new file mode 100644 index 0000000000..f37c94f836 --- /dev/null +++ b/template/xcode4/cocos2d_box2d.xctemplate/Classes/HelloWorldScene.h @@ -0,0 +1,33 @@ +// +// HelloWorldScene.h +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// +#ifndef __HELLO_WORLD_H__ +#define __HELLO_WORLD_H__ + +// When you import this file, you import all the cocos2d classes +#include "cocos2d.h" +#include "Box2D.h" + +class HelloWorld : public cocos2d::CCLayer { +public: + ~HelloWorld(); + HelloWorld(); + + // returns a Scene that contains the HelloWorld as the only child + static cocos2d::CCScene* scene(); + + // adds a new sprite at a given coordinate + void addNewSpriteWithCoords(cocos2d::CCPoint p); + virtual void draw(); + virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event); + void tick(cocos2d::ccTime dt); + +private: + b2World* world; +}; + +#endif // __HELLO_WORLD_H__ diff --git a/template/xcode4/cocos2d_box2d.xctemplate/Prefix.pch b/template/xcode4/cocos2d_box2d.xctemplate/Prefix.pch new file mode 100644 index 0000000000..aa3260079c --- /dev/null +++ b/template/xcode4/cocos2d_box2d.xctemplate/Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the '___PROJECTNAME___' target in the '___PROJECTNAME___' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/template/xcode4/cocos2d_box2d.xctemplate/TemplateIcon.icns b/template/xcode4/cocos2d_box2d.xctemplate/TemplateIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..b2997c4ec2c9dc803041c2676a6cebfd065aa955 GIT binary patch literal 53803 zcmeEvXIxcR_V%Xts$xaTy%)t;qp=s@Hmbc>>?lp7ThF}|yJ#$QktV%&X@V4MCX-~6 z$xJ5I*igYP<#OIerZ``vc7N1&vyKW?RoZGL4TaF zYsHf1Y%i;L{-RgGwk-+X9Xw%w8_V{-z;*W2=DoiDo|Z1Jas3(l@|L^zuE4-uOUYMk z&-1739m9a2y*@qx%Sj>I{p{dV_U@8B+t=^%+vq^z@r$SIlbzeowT6b=$frL)ecGc4 zTmMBn{Q=k z3k9=kZ?&{Gm6SBK+^85Y6grai6|LOQ*KT=@bGCDsN2Xo5-c(Z5RCnPMJA0AHeiBK& z*-(_pp& z;_}M5pEZ|e-~M{7Y3}7qX(hFXNiAEjkG(SI!7R}tob0k>`HB@w zSFOUomoIUd?BcP*)6;v)91owJUY_VM-Iv1GZYug~taYCOZ? zJMat7a|kZGIOI*V2;6_9<+E0*6lPo}I{E}pkw zv8`$2wUVsQZ_OjF3+K&{y3HbaY<>t^LngXOXH2md2?tw-%^>RsstHB*Q^wDlGxrl? zLWU5HX>;bx8b5mKWZU5;!*x~628|dqdFtq4qsET49c9Dk+l;auJ9gAC|LNYIgs5l_ zEbZ)7^!?M@Svs&39{%>9UKUs1{kgaEouBA!h=kw$qj>-N|L>naMDKlm-^Dq;KsL)^FQ+2}ZN)mPVPp2OqZb!yWeNGKDi6R_PQV7H^&6cYN* z<1$uoz-_;O0I-7sf>%4Z4kf?BXWl;D&i+XD`mfj>!~~8C2=;Jrnor6A-*;WXUcH$= z?x4pyzo5X~enCOI93=~e?qS&R^g1N#VQ-Peo8$gJRiKqlZ|(6*fc{yUZm9o@*!tU}TCieB$wZyR_A1_bWezc*l4aKM4huC9_r z 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 { + UIWindow *window; +} + +@end + diff --git a/template/xcode4/cocos2d_box2d.xctemplate/ios/AppController.mm b/template/xcode4/cocos2d_box2d.xctemplate/ios/AppController.mm new file mode 100644 index 0000000000..aa03fb04e8 --- /dev/null +++ b/template/xcode4/cocos2d_box2d.xctemplate/ios/AppController.mm @@ -0,0 +1,98 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppController.mm +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// +#import +#import "AppController.h" +#import "cocos2d.h" +#import "EAGLView.h" +#import "AppDelegate.h" + +@implementation ___PROJECTNAMEASIDENTIFIER___AppController + +#pragma mark - +#pragma mark Application lifecycle + +// cocos2d application instance +static AppDelegate s_sharedApplication; + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + + // Override point for customization after application launch. + + // Add the view controller's view to the window and display. + window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; + EAGLView *__glView = [EAGLView viewWithFrame: [window bounds] + pixelFormat: kEAGLColorFormatRGBA8 + depthFormat: GL_DEPTH_COMPONENT16_OES + preserveBackbuffer: NO + sharegroup: nil + multiSampling: NO + numberOfSamples:0 ]; + [window addSubview: __glView]; + [window makeKeyAndVisible]; + + [[UIApplication sharedApplication] setStatusBarHidden: YES]; + + cocos2d::CCApplication::sharedApplication().run(); + return YES; +} + + +- (void)applicationWillResignActive:(UIApplication *)application { + /* + Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + */ + cocos2d::CCDirector::sharedDirector()->pause(); +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + /* + Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + */ + cocos2d::CCDirector::sharedDirector()->resume(); +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + /* + Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + If your application supports background execution, called instead of applicationWillTerminate: when the user quits. + */ + cocos2d::CCDirector::sharedDirector()->stopAnimation(); +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + /* + Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. + */ + cocos2d::CCDirector::sharedDirector()->startAnimation(); +} + +- (void)applicationWillTerminate:(UIApplication *)application { + /* + Called when the application is about to terminate. + See also applicationDidEnterBackground:. + */ +} + + +#pragma mark - +#pragma mark Memory management + +- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { + /* + Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. + */ +} + + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/template/xcode4/cocos2d_box2d.xctemplate/ios/main.m b/template/xcode4/cocos2d_box2d.xctemplate/ios/main.m new file mode 100644 index 0000000000..106d54c93e --- /dev/null +++ b/template/xcode4/cocos2d_box2d.xctemplate/ios/main.m @@ -0,0 +1,16 @@ +// +// main.m +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) { + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppController"); + [pool release]; + return retVal; +} diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.cpp b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.cpp new file mode 100644 index 0000000000..fb9ffc4e46 --- /dev/null +++ b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.cpp @@ -0,0 +1,110 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppDelegate.cpp +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#include "AppDelegate.h" + +#include "cocos2d.h" +#include "HelloWorldScene.h" + +USING_NS_CC; + +AppDelegate::AppDelegate() +{ + +} + +AppDelegate::~AppDelegate() +{ +} + +bool AppDelegate::initInstance() +{ + bool bRet = false; + do + { +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + + // Initialize OpenGLView instance, that release by CCDirector when application terminate. + // The HelloWorld is designed as HVGA. + CCEGLView * pMainWnd = new CCEGLView(); + CC_BREAK_IF(! pMainWnd + || ! pMainWnd->Create(TEXT("cocos2d: Hello World"), 320, 480)); + +#endif // CC_PLATFORM_WIN32 + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) + // OpenGLView initialized in testsAppDelegate.mm on ios platform, nothing need to do here. +#endif // CC_PLATFORM_IOS + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) + // android does not do anything +#endif + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WOPHONE) + + // Initialize OpenGLView instance, that release by CCDirector when application terminate. + // The HelloWorld is designed as HVGA. + CCEGLView* pMainWnd = new CCEGLView(this); + CC_BREAK_IF(! pMainWnd || ! pMainWnd->Create(320,480)); + +#ifndef _TRANZDA_VM_ + // on wophone emulator, we copy resources files to Work7/TG3/APP/ folder instead of zip file + cocos2d::CCFileUtils::setResource("HelloWorld.zip"); +#endif + +#endif // CC_PLATFORM_WOPHONE + + bRet = true; + } while (0); + return bRet; +} + +bool AppDelegate::applicationDidFinishLaunching() +{ + // initialize director + CCDirector *pDirector = CCDirector::sharedDirector(); + pDirector->setOpenGLView(&CCEGLView::sharedOpenGLView()); + + // enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices. +// pDirector->enableRetinaDisplay(true); + + // sets landscape mode + pDirector->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft); + + // turn on display FPS + pDirector->setDisplayFPS(true); + + // set FPS. the default value is 1.0/60 if you don't call this + pDirector->setAnimationInterval(1.0 / 60); + + // create a scene. it's an autorelease object + CCScene *pScene = HelloWorld::scene(); + + // run + pDirector->runWithScene(pScene); + + return true; +} + +// This function will be called when the app is inactive. When comes a phone call,it's be invoked too +void AppDelegate::applicationDidEnterBackground() +{ + CCDirector::sharedDirector()->pause(); + + // if you use SimpleAudioEngine, it must be pause + // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); +} + +// this function will be called when the app is active again +void AppDelegate::applicationWillEnterForeground() +{ + CCDirector::sharedDirector()->resume(); + + // if you use SimpleAudioEngine, it must resume here + // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); +} diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.h b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.h new file mode 100644 index 0000000000..3161a11d65 --- /dev/null +++ b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/AppDelegate.h @@ -0,0 +1,51 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppDelegate.h +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#ifndef _APP_DELEGATE_H_ +#define _APP_DELEGATE_H_ + +#include "CCApplication.h" + +/** +@brief The cocos2d Application. + +The reason for implement as private inheritance is to hide some interface call by CCDirector. +*/ +class AppDelegate : private cocos2d::CCApplication +{ +public: + AppDelegate(); + virtual ~AppDelegate(); + + /** + @brief Implement for initialize OpenGL instance, set source path, etc... + */ + virtual bool initInstance(); + + /** + @brief Implement CCDirector and CCScene init code here. + @return true Initialize success, app continue. + @return false Initialize failed, app terminate. + */ + virtual bool applicationDidFinishLaunching(); + + /** + @brief The function be called when the application enter background + @param the pointer of the application + */ + virtual void applicationDidEnterBackground(); + + /** + @brief The function be called when the application enter foreground + @param the pointer of the application + */ + virtual void applicationWillEnterForeground(); +}; + +#endif // _APP_DELEGATE_H_ + diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.cpp b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.cpp new file mode 100644 index 0000000000..d65c1fc721 --- /dev/null +++ b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.cpp @@ -0,0 +1,189 @@ +// +// HelloWorldScene.cpp +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + + +#include "HelloWorldScene.h" +#include "SimpleAudioEngine.h" + +using namespace cocos2d; +using namespace CocosDenshion; + +enum { + kTagBatchNode = 1, +}; + +static void +eachShape(void *ptr, void* unused) +{ + cpShape *shape = (cpShape*) ptr; + CCSprite *sprite = (CCSprite*)shape->data; + if( sprite ) + { + cpBody *body = shape->body; + + // TIP: cocos2d and chipmunk uses the same struct to store it's position + // chipmunk uses: cpVect, and cocos2d uses CGPoint but in reality the are the same + // since v0.7.1 you can mix them if you want. + sprite->setPosition(CCPointMake(body->p.x, body->p.y)); + + sprite->setRotation((float) CC_RADIANS_TO_DEGREES( -body->a )); + } +} + +HelloWorld::HelloWorld() +{ +} + +HelloWorld::~HelloWorld() +{ +} + +CCScene* HelloWorld::scene() +{ + // 'scene' is an autorelease object. + CCScene *scene = CCScene::node(); + + // 'layer' is an autorelease object. + HelloWorld *layer = HelloWorld::node(); + + // add layer as a child to scene + scene->addChild(layer); + + // return the scene + return scene; +} + + +void HelloWorld::addNewSpriteX(float x, float y) +{ + int posx, posy; + + CCSpriteBatchNode *batch = (CCSpriteBatchNode*) getChildByTag(kTagBatchNode); + + posx = (CCRANDOM_0_1() * 200); + posy = (CCRANDOM_0_1() * 200); + + posx = (posx % 4) * 85; + posy = (posy % 3) * 121; + + CCSprite *sprite = CCSprite::spriteWithBatchNode(batch, CCRectMake(posx, posy, 85, 121)); + batch->addChild(sprite); + + sprite->setPosition(ccp(x, y)); + + int num = 4; + cpVect verts[] = { + cpv(-24,-54), + cpv(-24, 54), + cpv( 24, 54), + cpv( 24,-54), + }; + + cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpv(0, 0))); + + // TIP: + // since v0.7.1 you can assign CGPoint to chipmunk instead of cpVect. + // cpVect == CGPoint + body->p = cpv(x, y); + cpSpaceAddBody(space, body); + + cpShape* shape = cpPolyShapeNew(body, num, verts, cpv(0, 0)); + shape->e = 0.5f; shape->u = 0.5f; + shape->data = sprite; + cpSpaceAddShape(space, shape); +} + +bool HelloWorld::init() +{ + bool ret = false; + + if (ret = CCLayer::init()) + { + setIsTouchEnabled(true); + + CCSize wins = CCDirector::sharedDirector()->getWinSize(); + cpInitChipmunk(); + + cpBody *staticBody = cpBodyNew(INFINITY, INFINITY); + space = cpSpaceNew(); + cpSpaceResizeStaticHash(space, 400.0f, 40); + cpSpaceResizeActiveHash(space, 100, 600); + + space->gravity = cpv(0, 0); + space->elasticIterations = space->iterations; + + cpShape *shape; + + // bottom + shape = cpSegmentShapeNew(staticBody, cpv(0,0), cpv(wins.width,0), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + // top + shape = cpSegmentShapeNew(staticBody, cpv(0,wins.height), cpv(wins.width,wins.height), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + // left + shape = cpSegmentShapeNew(staticBody, cpv(0,0), cpv(0,wins.height), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + // right + shape = cpSegmentShapeNew(staticBody, cpv(wins.width,0), cpv(wins.width,wins.height), 0.0f); + shape->e = 1.0f; shape->u = 1.0f; + cpSpaceAddStaticShape(space, shape); + + CCSpriteBatchNode *batch = CCSpriteBatchNode::batchNodeWithFile("grossini_dance_atlas.png", 100); + addChild(batch, 0, kTagBatchNode); + + addNewSpriteX(200, 200); + + schedule(schedule_selector(HelloWorld::step)); + } + + return ret; +} + +void HelloWorld::onEnter() +{ + CCLayer::onEnter(); +} + +void HelloWorld::step(ccTime delta) +{ + int steps = 2; + CGFloat dt = delta/(CGFloat)steps; + + for(int i=0; iactiveShapes, &eachShape, NULL); + cpSpaceHashEach(space->staticShapes, &eachShape, NULL); +} + + +void HelloWorld::ccTouchesEnded(CCSet *touches, CCEvent *event) +{ + CCSetIterator it; + CCTouch *touch; + + for (it = touches->begin(); it != touches->end(); it++) { + touch = (CCTouch*)(*it); + + if (! touch) { + break; + } + + CCPoint location = touch->locationInView(touch->view()); + location = CCDirector::sharedDirector()->convertToGL(location); + addNewSpriteX(location.x, location.y); + } +} + diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.h b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.h new file mode 100644 index 0000000000..0c5cf16215 --- /dev/null +++ b/template/xcode4/cocos2d_chipmunk.xctemplate/Classes/HelloWorldScene.h @@ -0,0 +1,36 @@ +// +// HelloWorldScene.h +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#ifndef __HELLOW_WORLD_H__ +#define __HELLOW_WORLD_H__ + +#include "cocos2d.h" + +// include Chipmunk headers +#include "chipmunk.h" + +// HelloWorld Layer +class HelloWorld : public cocos2d::CCLayer { +public: + HelloWorld(); + ~HelloWorld(); + + static cocos2d::CCScene* scene(); + void step(cocos2d::ccTime dt); + void addNewSpriteX(float x, float y); + virtual void onEnter(); + virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent *event); + + LAYER_NODE_FUNC(HelloWorld); + +private: + bool init(); + cpSpace *space; +}; + +#endif // __HELLOW_WORLD_H__ diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/Prefix.pch b/template/xcode4/cocos2d_chipmunk.xctemplate/Prefix.pch new file mode 100644 index 0000000000..aa3260079c --- /dev/null +++ b/template/xcode4/cocos2d_chipmunk.xctemplate/Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the '___PROJECTNAME___' target in the '___PROJECTNAME___' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/TemplateIcon.icns b/template/xcode4/cocos2d_chipmunk.xctemplate/TemplateIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..b2997c4ec2c9dc803041c2676a6cebfd065aa955 GIT binary patch literal 53803 zcmeEvXIxcR_V%Xts$xaTy%)t;qp=s@Hmbc>>?lp7ThF}|yJ#$QktV%&X@V4MCX-~6 z$xJ5I*igYP<#OIerZ``vc7N1&vyKW?RoZGL4TaF zYsHf1Y%i;L{-RgGwk-+X9Xw%w8_V{-z;*W2=DoiDo|Z1Jas3(l@|L^zuE4-uOUYMk z&-1739m9a2y*@qx%Sj>I{p{dV_U@8B+t=^%+vq^z@r$SIlbzeowT6b=$frL)ecGc4 zTmMBn{Q=k z3k9=kZ?&{Gm6SBK+^85Y6grai6|LOQ*KT=@bGCDsN2Xo5-c(Z5RCnPMJA0AHeiBK& z*-(_pp& z;_}M5pEZ|e-~M{7Y3}7qX(hFXNiAEjkG(SI!7R}tob0k>`HB@w zSFOUomoIUd?BcP*)6;v)91owJUY_VM-Iv1GZYug~taYCOZ? zJMat7a|kZGIOI*V2;6_9<+E0*6lPo}I{E}pkw zv8`$2wUVsQZ_OjF3+K&{y3HbaY<>t^LngXOXH2md2?tw-%^>RsstHB*Q^wDlGxrl? zLWU5HX>;bx8b5mKWZU5;!*x~628|dqdFtq4qsET49c9Dk+l;auJ9gAC|LNYIgs5l_ zEbZ)7^!?M@Svs&39{%>9UKUs1{kgaEouBA!h=kw$qj>-N|L>naMDKlm-^Dq;KsL)^FQ+2}ZN)mPVPp2OqZb!yWeNGKDi6R_PQV7H^&6cYN* z<1$uoz-_;O0I-7sf>%4Z4kf?BXWl;D&i+XD`mfj>!~~8C2=;Jrnor6A-*;WXUcH$= z?x4pyzo5X~enCOI93=~e?qS&R^g1N#VQ-Peo8$gJRiKqlZ|(6*fc{yUZm9o@*!tU}TCieB$wZyR_A1_bWezc*l4aKM4huC9_r z zox9%N{<5=&?XcgqS9<){U)XgyZp$ySH4m#@q~zahm!k6}cY~tWe}n&$hP$M`!+pZ9 zjpXz1f<{f=Rmyhb`V#i#Ou#rbA%=u%8|Dy?T^n`^$aFWjPghS*_nQ}w z+n&Adl64!gnZ)bBz7@*Uz6kzDUL`UF_)WXvecE z=y>w{HGci-<--SxXV2U3{+kW|~ zA?Lh&|6ac>Yu0Y_-?u*^wxIc&Umvx1JiE(2c&>Q)wEfY&AOHFJ_2#RMjaOT4e(|rL z?mzB$`ck#``2&X4ynFxQqsNb*9BtQm^5pTOM-T7cWm(N^_F{TgPHtG9YC&#pWS)L* zPFDIwHk(Z?sIIIGt5Uz5UsF>VS*2H5SzVCIUMwiRTz5s@pn0YB)6Lbb^$`tvSL!a8 z7F^7zzTD8%EN{_jzFtnoXWVWMZ_#OPYPejTkyTmO6yB=Ue7pK%OY-Th$X2bUy2`Aa z$}7!btvb!ODjdkXsU+f71a7%fnUh=9&?0ZuZ@yK=A3T1B!$cB(t0k;etEHhTHxHL& zt%fZ(t4EI)%@vEMjU%UT<7Rp>PkGVkTJwToZbj&2@E`i!Y@YRn|0S5vh3IXz$A> ziL(>Qypyw%OeW`>Yilcu(o+j6s_RR}*g5g#-~Ynq5t72z+$#``Bq?>5t1AjpQ}WBI zs%w@^o+~Z?mDD|5Ozt+4zkjupST7E*t18P+NzN^)tgPR!KWAAb4ciEUuvPqRkRRcZ z?AnTw+~lO3;_`~>RAMhme~GvaB|jr>D_0C5`|8Tei*u4LWEGZ`msPDDGd}1h%l^lB zL_{z9)qw$nCKpwdl@(@PNX#rKDJ`i?CgM@sa~s^oyAr>1%XMr>Y*k5FNkL{}{H46& zl9J*ohB%KS|6_rz_4rQ&B&5Ru;<-KCLvQ=GEgM$2+Dlh%*zU=AGd|khzFWwkHGbaSG9SiU z$8-CJl~R}0TReTje6@Ubdkoei3wKBOYWsL@S?%JwcAIyYua3{|ZC1o`Fmc2ME$?k> zT^Fp|?k)G#_u0M0NXN|F$^=*Fp4GhS--MC-Nr|&A`%k%LU6I*K@f5*3q zyWNRE#?u)w!rEF#UyV%K#rPU2FK_qu-Q~M$ioqyr8E*vNnmvH6M%spC;ns~C*DR5U7Oq@}DrFQD zqDsgFYo0B_SJ#j@Z(P4_H5{Hm$})` zbzZc5-(m9!NoDJPi9*%pymI;SMb2|)N#-wJveatiut~9ZNZm6xa<7qm z*(f0C`ZqR%JyDpmVESx^oPU_-1U#M+9 zCF~i(H<f|{hsiUK_rTKsr6)gKbAqd~*b-J3y5+_HgXwKwG zGwnoTv2-@E9_$of?@T@>en+PgH8N8w5{v9+P8vULj=h6}y=bfo--IEmHUn%KvPO@L z7t!C&nKpjxl$mqw=Goafj8eBAKV_Jfq523*V=~rZ9)3A@=9ICvA5WV#XZEa_)2CSw z%>hQ5+S*#`gg<@y%-OT&%$oMGt<8jwKl$Y2v4Rn%19Vl0in&ax6?RsyM(0@;F7t2o0WAX1l`=^V|yZ`Qn<^B75+53Nj-GAr%8<_sz_x~4- zfxrCc|E~X~dQh1E-}S%J!228K_wVifkbi$DK0Xv*ABs=JcmAKncRu2KM*!VGAE+Yu z=P;{N&$8K%+8(yGJ&JtX@FeoF&Z9Q`^eCHU>(8=UcOJGq?dg8~OxAw8L)NbK3>&_u zZ4d99VRfH8Y*V~={G`33yxVNhE7n&pvwinv#F| z?D>nAFPT^J*UX!Je2>sS3xJ%0W0VFVuO=_iB--n?Nt}qd+`W8>XF5COUGd%8iv5Jx-(cC!%x-y?VP_{Edij#_ z_vEqSft)pZ(gu;}GZ5iTXIGcJJFZ8si_JyxOpZKcd%7?6$h)n&x;jDb6@3tLwPDj$ z&vGm(AH;J^x4cJ1(G#uE?`FRu<|aI%SBu1+qEP8k$a|P>3kty@Kr=lL@%)`OsuZXa zymobUGd+=tbG_(lJmC>-Vg-+Sj7|52-be-0W7*9;4Pl|z$JEMg3d;41m#?^IdwLi} zQm+9UK!&Oi!%@WIHoCUyy^O*d+gkc4^h7yVJj9bPpd(IP5bZ(VH>uYI?THLxO$HJC zi=_3kJ#2cfl|sQi%rOmhy=Y?}JW~>-4AV#Dy@{-`0xelSwjP8G;E|xGtRjV#_m1SA zg}_R>&mKHb^ifqlDeFyQO?ufjqE4p!+L;s8(PaAftRj__^;#$&rK$qeo(B)Ru{BmI zsTCd8HmbkgU|LH-@N z(Zo|ePwfkRU0}@>Y}WxY$^g%+=#kAK0YPXQIgKY|G}-o&Rb1>xfcUT%Jd8tlg{}s* zaxbiGp5&jeZtTad4W! z?{f7{bivW1X>ch5Ap=DU2=*pxLjxiLjnR%2I#T(jQ2EeN{SBut-hPjBo;Fh16U0`9 ztOQ2^p=-tj9|<%HS|;L9CK3%ExymYH-*WROC?*Ovo7ifQMO3VSP_cVxz~Mku#DQF@ z?KFlM4ItmLikQDfImc=%*cM`~Pn<(!foeg!7X}>-R7V3==qQtFJ6a*Q#y(*c(Lfo> zY39H1(%Z|S{6sVd!Tsbw@$m{i7N`>B8z$9p6c0i_!yBF4XvC{Br2Y#A(~HHrmwn|% zMv~F~K>=ZbBq$sZL1C1ewGNJqR7c`uuL=dHunHMVI#2(#U}spJUg+3{XnKYO91Bzr z+TaVdrr9JjWVxvZ&;^Tqp!OL9ygXEO4bq-LI zk;HjC89>Y)1MMmKiS0f4*KnsPYYzx^qHdu9Cj(U%*)O4@`bJ0%97kfU*aw`yp*O4e z0L~d!eGhJ*7!{}msT>{F1_#LcY$uoMJ3440psQInjx2i<_17Goq5{^__}>`<0d)d` zw+kI54m&9zb*M0^vFQYDgSKAuw*Ss5PW&}s6cw?37(`qa8gL>|3nrYi$y4kW4(EWI zhe`FFY_J+1{|_SXB-{HzG_79tED?|?L8ri+^Wwk|Zz1vuL#0LRg+Xy5eWIzciWm~J zCv5NWzvk{F7587nLX~)gfIGc_kR4LLpnwpsg#j?DYJeLAHlTSyT?0!C9|wer4xrWTfbIz9?16+8jzF*`nkGbLF!A|-Sx?ZAyaj28`$1e)oHxkf z9sXgkgpVXbs^VxTBbq9zL&%S8@39XFs@1cB45w-4G#5}bsMLa%Pz$J2uT^J=I*(jp z6(0aPj)Nt(711;r2~Q;`AckswGnGr0S<)MUBO?#+gxpC( zD8yq!a18bSNU1)TK_`xbWBh|vd;sbg<%rfuV~{H}1A={ptAoLoTF_#VV}w*!GLX!h zgWyQ~AP{(Z7RGA#vImJJSw)%B2ntwWw+dWAMt3TsE@ez2G0`V(Z$6+XIW67F!9MZ| z`wJONEO*1Dz~367cxg~xi)8mNR&nI7mBvAq*;7CTn+6*!q)ciC zdy1vvg#myJ@^_USLVA=s&7`g4{{hg5Mtc!u@|6T3;}sl+6tc|TRqC=k=olR3DEM3< zbUZB8a1`m95$_KQ4Zs>gzGvw_sgr~UlhD;#_QhqQ~e3D(}^;CMu;g;-E0 zZEWx14@nN(YC_yGIB^QbTu%kp30^MQ73w405lj)WVEF|d2D>{&U{_n>JQ*%=gH?PG z8C!xHG8Ni-`Uz1*q{#zygM5X^2O%5Rg#;Xe$wD^G@d(DBRD=ASj!Lzh=7NJ{CGvk+ z3Y9f&FAiEcWWi8!_gmOX6arOf1ca<#LDQAWwtyqh!UFphSn$;X7Kk|&i;V^mpJQC5 z%@v%=8XcA1Z&fz7^EiJ6ay8)%A-hfxbFv{6j<33GSI|lL0;G4`#pwZNQ!1F)bg&3E z3p_~+_`WKf7JpnJt1QA%`pbI_dH~DE3Wm<*0AISW1$%9xiBTJATj=P3KS$D7z+%U# zcmmw^Tejy=?=S%Oar|3>%Wb^6v2~L7>MMbX$pAGn13sn}yo07R^+m#kq6LwGnpo#U zkVGh`(+qG>M?o3IU=H)$qPef=r5+9h@Ncb~mI1P-DVya~tG zSiqnMCp#pQ3-7|xJzIY*{s&k!j4o)BEg=EXf!e{I^EQP9ZCn6E?SPPNt^vWGB2Kj; zgJCE<6~A%%Cy<=K3nH&^@_zGFKEChvLa6mXbY`%lfF3B-SjGf!~4ptHQR*`?jo(usM>2s)Ymvpb|6)2oCkzykHbxFm|fFqmvSpPb&WxPz8?X&52V; zz|lZM!1(W2zkJ#1t-C@(0#VQzhkCn?Bt%z3OJ7sXa;B4`BpeLSgBCCSZ`k({ZFbZ- zGy(!cy`x?_5yUWEreEL0TUUbdA#a!S>ZqFEY6*s*dMvjC1+?rs2lF8MaPQ!-*<&& zCDrM}ut9aA#OAzD>`#OOF&c~5?uG>lDWn03sVOZfxerim=CDP)xUrC> zD;4Sr)Ykc-Voq(#e{V^1{1pkDQ$Z zA@hO*kcEgTxrbk{Z+0`p>^qiyUQ$+CnWaNi z?P)JzA}ZS-Sf*QrWj{cbbImnGcO$&ldhoL>tVkmBdDcA zg!*WTp=U%B(JUf-#j<}ZC@-z@Aexh%QTL5P`{=HWRejyg%Klo`a0SxONvH-(B@^fp z5W1R>4V4fUgFlZ5v9Um_k=B`Kh^{asaM#d5kOso`Vz$R}3|fNhL(skaDbcq^uflPp z4q3>uk8fX`^*Pn_fA!pcErW75dl^206@m#g4G3`{$hQnT8AoTV2+wV3WB)mc=v&blw$7^3vdT;yG7!Bau`y1G%lD(7yX(VxhQ!}PkH}xL zK)ZmkIOv6*t2$ZsI58hUmVNuQIv)ah6S8jK5-pMhwI3!M3F=}#DTVOOMHsf2MGPDq z9qlk5AtUM&$Uiaq_Caxb*q6>k!`u%eYfeFa=44_)d0FvQkUEd8q6zI46`)|wCq_>D zM5d%3f4)xiO^xUX#&@9m8E!9iBRcaOou;FP(6AbANo0tEzor|ZSlWYP*@~cQ3k(eQ zHYIb5%gYN<5@W=5BHGC#Y%x~W!+uGOr-#lqAfMv`dRjQ0A4$%myvK1?c?p#MK z|C&h1P~CTIHzhmtk9kRH-5zw=CwHTdWJ8>3G6?oEB6gJQO-QQK4rTjdPbl`??20U zg42k1NTSgm*`wXX>DPhAt^OoJk`NB1FDNB!5FsS~bf1usLG$(L&Q8Xvq3j1ey)J$n^3BXWoB4(}NTiho9u0Y$TJ_UUw@qveg3a;TJ$L)E1f`M*%baoAYI zdfERF!||bO2@)|jb7mMD%&#cD>`k;jMp}}f$HPZFbw%K$X7Ha=I@B|u3u~HyHZlW3 zk!V*{AT3AeVuhggGN_9#JR7dT}osX(Pm_4QLeR;~lY$O8J(l9<7%FSA{de@)|X z&wy^0flr`F3<$xo&CbgpaqTc`)XP3nA!J8T$SSNLFX@af)bzR%87KqWjhT=GeVE~7 zTesrShe()pA#AM(G74Q7O-bD4l8StEfg)J!lQYTSDM4^Ys}Z#65r&f$mTf7*eAp7A zZGoi;1%~Pf?Ay91nW2AXjqdJaJ%f6K5q{JdA+Y+Cg38je;)irjcw7(S*OaWIW?Bo= zHqhXr|L?t7P*zd7gP0K%O;X7qs4Ru;I)a4pr#{VeAL+5~V!wvURI!`~`3=`0i%Xyu zT3b-q9=3Bm(VE0H66PT=>rhlMtl6{1{POCeP58xBkV2b#7+LbFxBKv4>+UFZ=EEpK z=Fl~KE4DTBbE?Zr3cl`UXs7bkZbTvW{!E}%(C&}mDW76ddj55Jc}@BGnYeiZwbC@A zIgIM>$cIQtyV+lft`T=g06n4q9aUCcRao=gbC&&PKKvYACX_G!{=vJ(f-X6enUaxp zF=7GTe@~)*jS->IB%kd%`qz|>_2_r81-Mnu8&ZX?mk}f9!)Zl@*_jvjArp`#bivbF z=N}lnTS!JQIHsC3m?4J7#DIF8qsRm%+}nHnuZbM*(NuJ8hCh7Fp!g5<7)=ZqqC3gX z9*m=$To=NiObc1F3^^h=&~Avzkbw*_)znupm>`CI9Hr*)?YZqN+=}TQ_D8RyXIb=| zw)=RGQ5QzM4NQq6cghp6)I6Mw)iWh_-hJie9D0%zv{K?YcY^hhL1rVz%n)NEgDQka zOx3YObsg_9@6TvBzs6DY`$_af&nI1MEg7XrI|rEN4&A*@^pUx-nP9@??Rzj94iUU0 zB6PiR#w3+G0bML{r2nCLa}?1ViCo@w;x{TdxbCNdJqNcGLXwj`qq?!g+v4bI55)`$ z4GHk`^6?K?xL_x=6d2^^B6i*t6uc4JP$|J?Mn!^+1|^^=K*7;<@+|@GWEx^T;0_;^ zyBa9#WVcOMPp2Pk*RKu*U?4V;LBT*hmxg1U^Rj}loBrR3SQ~pn|B&UOQci6yp--FV_%E}uMVd+>llQUxo0<#hK@KrSJpHON3mcONP_6hIG&oTMU| zR8=fSn?@go!vW|p9r|We*Xi!zeJdS3Y^0d?`}c1Ylfex`I@za~yfr2&06#T`uNkT-8$cE31- z193vkXNesbuixPp7_?`b(D4M$Q>0FgQ}u|pC7Jzo?<-7ssC0J9x{kaRo;%{lZub8D z=X9c>U!x30DVQ#6SP^E#cn2m=o<8Y#UZzLPFtj;NC>04E7p>a3%>})n5tPO(b9&H3 z0)Kq@sBgsN6_|v%l}IDr@rSnO_wT)aSJ#;J5GW@!UT_}sgigla`T6_rerdre@c>n# zIo`q9N$g-RJR%iHK+Q=q1I3swYTMX<|M2f0f4*}MgY|UegpRgwWSK5=O!fCGkDB83 zy?dSXCZ+mb%idUE00liOF1A4LmmmN0udl!S+pTL&bq%$rQ1}>P%PW{6c6M>bzL_9& zFq-aUBbhS}4NMG&l4WU)we>C6Z-4%efByUXpMJUf;Gt4~FCjRlWXy2-$c=40df0jI z4(5aUuF77G?VFZC#NGe(=O6z4&6j_>(R`(*qBt)z?Lu7AsdXA4u1<)7V9H#PB-}|u zDz=+ui+sn^*TV}R{;`R1$(OPVN~>xcTW@{-)wloo5ybo9U&>z%;)KGa$;0*s?EMaC z8bUwEfY4}aMd;$;y*odB|Ls5ieyg>ywxTFEBPB8V%*kVi!@?s2U3H*W0~MrRox#>N zW5#}D!yj%SBPx2x#=Hsc2M@`^j~qXBF7`rdW`1c^ebbH4zWnC9A1Hn0#1E*LQYxsS z+d5F7-s?niY;R|tj#f@CQR2V;{GWgQc_tE7G} zZT9ZnHty|`cFc}Fd5m8xo$IU5uH$tNDs{s7(n}c2 zhE;xM+Qo#JbEo0rk>O!7=HP+-`}ge&-}}+Nef#$xICxMd505;2^u(z%(eX*CnYl&f z)%8u+Z-eM}KOnO_pj6x8Nm@$qH}@h~?T7cCbCzxo>#(J>dz9$iJ3syK9a6~Wx2`ug z)LkwwF38PHPf1FMi#dPx)6=J-qE5(_131w`r7KM%JR~Z;-bQWg8Y1@z^1UMxVW^eqN=*KzTs-i^_#ap|MDN- z{Oh~#kv)G!`sBie8%{Lp8!@CpJ--XLj%4-k-h1=l?JeO?EtM0CkHFf4`}cnR^_QQ2 z`tgVVeE08fzy0Rxe|+`j7hn9H`CRrl=5zBezWDO1e|-JTKfnF=cmMg}$De-w<<8xE z_wPS^_y{_ELLK-i!2qOwzvUi2cysSA#v0p@Hs}l{ZelP`sq*xxoHIJy8Z?=Q>JRSU zzju$htMcowvO5vK$nMB~Rlj@p-o5+G1M-k*QwKct6g-4UOr~9zvk(wF?_p?Clg0|< zVcOK_eaw@nb~W7aMD{rB(TTS3M{@k?R6FxTjS^$pG$~IkTaV-NyLaz*c02@QvPY?p z$)n82vPaq&4}I9tdH?QR41(ObcdwnkVAj_5_eVNyZS>8u_Ivm4oMlNp=JFqabZ+`RmPf%#OXJ!_qCQ?T+t!GnG3NwI<7n+MpO3TX1 z%fl;FD=RBbRjO4~SCyw#s#a81hF6%DmzR}s?wJpQ8HFh+bk@|Afs}cf*|~WIMR>Tp z0{6-@7t1<;v1$sCoMFn}e*_n9|o{`fBvs3djppZg1d3i-;)#b}f zbxe&`bz|JbWJF_j4O4A;`EpeyeYUs|TFl5x&1M-HeKe&AB=ZYPO3N$oTy;&2tTwt% zr}j#@9to^ys;$kalhvBm)Kug73d9tBIxku)JK2C+n|VVH#o^^%|~) z)8g2p^m=1MdLz>?>dKXRKvaW%86}^UnU+Aw!!$X0%ExPJ>*^aCn8qVlqnh*^ucwiL zxE_nPxTYglnMQs?Lw#LsjS?X*2L=QE64}f&@vdHN1Sd6@k)4Y2m3*Y;W-Fzjxv3Ga@-xke zc>b0QyKim!PB=N(a-%7=g=ywBHPOeB+^8b*vU1b2le028@MUl6=e`Vt0*O{i0Z$*60|Af%`Gj-t)?wERuf}2hnbdUbY_&q z-)_az)-5fRb^~ZvmV@=2qO`R9Z0M~oBP*XB*nGPf^G{@&bdog+Y7-4|$x=!E3iQsgo|B#q z!=ph6vB5Y@mDD=4<=V~Tv^Sti%thjPJOR&usNqTJ1h!w1LB%<_PkPCQ&qvaQYMlBj9H^}!j||}Uh}Q0*>q1fRyvoEF+wAC z2Ql6d9cK+3U<2pM4G7(bQ>Vnq%><6p9hKa~wGL^%Sv`&7Oq58b5M4W|oyH8jpb85y zd>tjy@}}!83BMsx8|VK4DYkWB^Uaz$w3{+TB9z#YiBh3t)?^7IGLn1(;W)0$$)?t8 zVE!#vZ?XD<1YE&eV(?b(jRt4R)fA~vBpPHOWJD@rpGN-Q~$AP65E_kU6(&&2+ zD5ll$hBxjd9|J}xonj_FB2p9MHC>7_n5YgVF`qTZ{&y4_{YrMugPq&q6b7y%0*=iz ziSV#URXmp`=W7cF5G{R@b-Ov{9UNsYc#oTNt=i3>#gQTE#8x81;|}AGgPV`71aiKX zAr338F5iUce<4y6baNIUw+e{59z0Nv$L;2ck3q|J;e2hLHnQ8&mTPz)n_N510X1<- z{)28P(3w`9mg`q$VuLV@%FBv@s)k z#JK84^Nku(aI59yhu}^_#+&8Xy^@cl!jmG^k1WQ9Q)NZ+^$nma_v_8KlS%mP4+DML zs&Q>SmcC(8B2By}F0h+ z0pnh|2tA*h{|lT}%gxCYV_4CAr_@C3t&iW)}phLJP3n?Hyb)v9%E1$_1+ zi7-l}E1oyX)v*C;E>nx#MO^{rOiHV);=34HKj0Tyj! zO&UA1J`u-IuRp}sqp5T7AoxT2t>&XG=Ct&ATR`Mwz5_!udUy-D7S^KKd@BVpY!-oN zw6mHdiKB8wf*~zpF%n3jH}o^O=dQ2Cewy%|=&mo*{>CUTtozn?kfz<{?>VipN`y;*WAT4%aw} z*qmS`IKo%ARx>1vk2RZ9Jh~kAmqE%xid%sin*eBd_0}mua&9!dmmx)tjeqI3&Ma zHHxSqxa1-oIL|DJP%?FjQ8KI-}0 z>`TC>g$At(sea{628}nO$S`A4cnQj|fil!2Qzl|bB{Ppw$FiIV4Xcc?KFU|;VJ>XR z(I#`MUgZvfZc+LW!7;bD0HWd5n^9z_FEynL^z_3kB^!l5w2_ zeV5a$OZW=R+kF&-mtWOyxDHMMiMFo=w+PL)NA6Pp$ZCxBm`IT(KC(hHhSFb$lGE24 z4qY|x+o379S6S&wP$-mhSb%a01*i&UJtk1;i9M3P*q(3WFcpRh6KRR3;oB}VmCRb= ztTpsnBgN&s78@@b^uSf_x~L~mOUbWlG+aN47Z}mKRV6beF@Tvfa+*Xubxb(cy_uth z61dh;z9vuIgt#|zfXc08-##!sEi+rW6UJT&i1J4LE7wkvA!;9iQ*C=>H66)xYkXow zxd32gwwx@T%RA23(9Kond}Tc#fjN)E*(uC zkK&hzBSacPTg!R&ykoGAu`02uXl{sXoX|ksNExQsDW+qq+`mbs{53SA~Ne3a^);5d|rd%m?KR@wbn;oF|VhpS2C2FbtyHK;-Du&{jQec=+?JH z?Nq#j3o2M7^>}+?bC*;{n-7GWVka8uNM-CMMTR41{;X2^ibN+nd=@B zv`7p-psvJkbA+GAP-v7oer1mnWoyvI&+ZWx@Vl9r6>Q6 zPA%wY)i!KIzr#)(DHf137rvtXR7t9i`kd*Phbqz zLV(>g%8|h&>c7#vkjnXTpTVlbYP72xE+9BiGlz-v#dBb<@PbQO$v@MvR=n@UjkV4b zgQD1c$nVEmucTyO%G*wij5vxzu}Z}^R7cjBSN9pNkY>Tu3mir2hzRbgYEaawuFpe` zw!o%xv_zmm*5+npU!-q5zBAKmY>nDof(f|aW?F}1ruFHi%#55wZK7r=;PVB8!R)0g zm#dL_L1Jh_=ruRiI<9}L716h!`7E(gv6Y zuBj`C4z!KEf{wMhvO`TXAJ&LI(zF>)yUUkBTKjUt5%?cg2${%4!q+8Xc^O$L_%Oil zM_UK$*hyy?{$aHBO)i>U30g#l$LI4jw1{2g8no9I)yhE_lxcUGTLw}tBqq}o&UMov zb5;0dt*ZJ|*oTJ#VIJDT(K(ry@;d)8+G_NP(}dxF9Br*m&B{ujN_4FFNIpbOM$|3I zh59PlW%DYfrfE<6QfhJ{M;6OA*Tk=?iny#*T{?xR!^n)tNsJ-Kk5aO-(yE}%_hws1 z+BzcH{9(4W1>NBcDbd4XW$9(PnmR86j|KLrEZ((aRZo*tPAy2*5y_r38}XZX;3IW)+tUZHR{2JlaMcr9<}PpepHy_vc%O z43T~^kT7)o6tkgUCm~5}C5A(|WK6p{{M15S<2sTrouk=5!B6G}O56`PAkEk%GB#No4 zU{S+o@#2!+(f|q2Fe|T4frSy2BC)-W28qti$ij;e{Zp=k@%coIkSnKL73_COSjhs2 zsR6WxP5%%QSz8_nBJ>=tpGZ<%+y&~9)HSHq%8rzqR;__&(0WmVIl4_W%i*k4IpwN0 zM=Y7F^4pZ_E1LM@G39CwNzgYmCXQtlhsw?A2_wFyjMF+e--Wo?#EV!hIU4Z4vcu(O zWq5I9AQeO?o(+kj@-Agx{5QUPtDJMS7=eDhgOTNLbFMYWW0|hRz<_GZf}mTJP+i6m zqDP^WPfdurX~2O!^9MvIi%gg^r>7q>Z(t-p|BSQzkVBa zZA{M0&fW<2sCl?{Z$LG8Hs_4id!SC#13XE1G!n(r+>@JEXX=G z75AD^TMZ|wMkM|+*nW>z45gJuh z4LzC2O!Dz~=vFMU($X{^g7Yk06K!=f9?d`c@bWP^6<~HG$Q1oXCMG%_eom!q7xx2uQ~w6?YyqlpY5f zMMcFYONJI#?7+TOdFX_l8Vam=c0%D8+u0}(bj9|gcsBUB>r^Yjap0N~)xm_R!eb+g zi>QW_e%y}>@8T>DTbw8{E-o!vfaC;Z5msLOj}e=QB(p56CqwDI}RhX>8)(%N+w#_SWXs= zw-g)$oAj7 zJ*Tzik4HUcJz)&R)3veGB3c7TV0kg_wea(o>(H5qfsy!ImcSYSGDGG9O8%u^N9N@J}tKD$IIaGVt^M*1GQgbIKrVKdGT-< ztFSD4KK;L`nRa(}~e> zN)>TtERYxSDHY7*WTRHQgqfU+7ZT%Q5)b1=QEghHTH6SCR+exzbR&5q@X-r3DA6M( zE+#%PDLExA{Suwq!Qf6_em=lPf@f-9PG51+iKkB|p68qp8iQzgvV8M?TIrNjd~Ebt zItdrS$PaE9Nr(pWm+=T5V{;fmDd3Hy7E{$AWU6=AL0ROH<58cUi;ja+!^Qwq$|}nr zhCF~Eg)$Rj&nKRaI**&c9n6%O6_!0(DHtxsoj-%IzX;iZJwdyDJhyG$zIFzdX$@pD zb>pEH*8Fgq2P}sV&|-+4I#fN}ansh#9$vcwg7+T8+$H|DgBYs3R8DA6&w*i}+SKHv z#JK2l=cAa@G3RNJP_Y-f#8_7y)2(Xi46z(G!)?jJ#miT&*|2HbP9Oi^eM~r}P0v7jD%hor z3|Z!oOPA8qI3=EsIi1Z$CDJ)QP)|*hrSsC#Qj6E+st;P7hUHsT)YgVH*fdy3*2)cj8aDSgXgEFrKev? zPp5tYp<~V^M&X-Ir_V;m#)EQliY(P81)nj-l;K%ScSbOKgLiv-Y;j+^a@pdA^Ict> zo$-xVCl~3Qv4b(+s-mhAPDUAznl5s7#;={6on74)ELyr^_4-ZQJa+|#9tb;x$xG@# zKu%@ShNh+@!#g>j!MAhR(+TH5H}OK!#bhRBWHK0vkA;Pg9}YjbC&~13U$t)I)}6iqq5I{Bj-CAU z931_^MJ8oVf5FgE)X<@UeqL|IcB5j4 zI}UKdf29(ky`8;KEOo*lH*_I$w4!uf@k!l2xhY{8rfi{8U_-Q&6ef8n#O5Y9PvMI^ znAM6(prjM1=(1!hkcKI!Zy$}6bH2TE>!$T<-$?mo8bfaKU^xH&<82MefYF2wYv=+~zM>xM=axDae)<;l!NK5mHT23ey{C})`W1PAQ)_1@{R zb;~CA4eQpfS-pDIs<4&3RjXF7S-Wn%`^L>%x9{-s@xvzq_8pXmA3A!1QbaBXNd`0x z-qMUceU47>88YmVQ?cAFRLQu7hg%>n=*D7#_RQ(1lgE!9J`}-?5bp`4Z)5oT?+*8~ z+`Surn?q1==$?K14>FixKYaA~iKx?O&Yq8sjfT`6v&Ph= zU|4!%;sr`oo-Dgal9&raK$g;tjy`|x>=`<}d-CLo8+{%+g$G4aT1Pv=tUN9{{$!jg zRB$d{9>>HQ#Kb@msHaa;VVD#2bE52ts8iZtc9{_67G8m3q;kgw#0`UYf5fy@ z6)t00J93KE#!a|K;^HcEQE_#Zxi!z1xzRtkXuGrL0uU|Y3fIUWQ#C!qstCuavTtew!w(PjR^CCl&_B5=b7 zcX!#wbDOj_Ze3`$Wb5XQ8JlDq2fDj&*sy-xT0FmO$-?y9-n?nkMjGj>S7Jq*@8aa_z!HWXXvgAnmUwdM z@>OeS+;7^vW$RY?Hre(w+jKo95Ms7yhsV}!+b`fZ@@=+Tw{F=C80cWt@})qLI@z;! z_&~Qvgiq-eMc-G+^uwrt(DjoB{uIJZO3!%Iwyyr~<#cX%Z4kb5xOM{V1NoU?HQ zg;=r>AKVv#5j$4s?Bv=9uxT?0Zuekz9NKxxQ-7z=N}`DpN@Kp4*Uos)Lpzxr0*~$6 zw{6|LsSm@|$yo?4@Ygc9ETD@pQstJd+dXzLJHtHBdl`CqZ`DQb5OvYVTYNn|lf1$_ znVkZBR~~Et0She@DS{7z1vk2w_C3FIr>CdfOU2tO)?0r(hG~haF40-B%iHUMw~Cjy z+>7t&xpQY93hI-EZX6pzC)Wjwm#bl?D9_X zk$W?Mpa7dUu3x)q`QimGPNHQ(sgv76%7gnR?r|?K`WFer`5OD|UX5q*X)&UvO(xEGH*DOp4GaLl2REzuZDWX@p#{d3FqbvZ z-QOq0SK#9V06f2K%f=0BS3wcZE<%y3%Yr480lEV01bv@mQ1`>vCRMD5qf1XK=jHxs zzScgVy>kcHr=*uGaB&rh;rB~du7T*=wo}4*a-fg@W=xxr5rTo(`_szNWw$R#Tj6QX zo!hrT_BAWPw~H7LFQQy;>f;&@5At7yLK6kNz}i4d3kTlX#NKxoE?9C;gY8X}?L~N6 z;xZpvhvhh?y&>>WA74K=P=wO;d3*~k9c@*-21Ta&_yNEI0F-w)05m_}MIw1eXv+Bo zUrnD~zIO0D8D@d4c>JLnI{4N+4#p;U`T1Pr06gCjULtj+T3hc9(RWaQL;(1CPa%4$ zn1;oO9=6LSnmRg=MvvHf`hh{p10d+?Pxa?2mAWdm*ROyC{M8VCJ3pdB2}VXTVq%8B zbHP$aTN^DqfQ$mj1>ceVno#P|Rq6;ArY7hENr0wzdsyLqV#?E@TMA@Kt=j5IBc#E$_+GXja39yJ09G)yN-itoHvPA6$l=1)>TsMk`GwyVzaopaB< z=e%?8y+FRQ1YaScG(RKvzPkP)p?sxIB~=@gb%HS|>)~%fQ6Pj0*vLkf#+pil{B3%V zHo|tq`H(K%Xd{rTafF59hENIFKv!S{cSOMz9^ZOe6dG-Nz9N$qMc5c5DySOEhFZI* zq(B8A6BT%li5=lpH*mYijcFoNp@cxD!~rsT#l?p~#eixTJ9!gY zYgBfI5Xmx+utmd9_1_Ob<>n$~w53W|)_E(oAWAuB3X6gsgUWVcWBs>O8kg5J8i(h< zM&mb0k~2up)Qdax9=Eb7>lAlPL>LfRGww8D*YCZUh;aQfRkua&Hy}cVDguJJh3&e5 z+fLY(Uxfl-#T?*PNC~@JiI5mk(MBF;VoNva29)Wm*YCVYmiGyi1#%UKvMn2x60;Yy zvO?KlA_LTcLwT*KK=qRz=k@bbfqA1A~7Yp=&r}O&yjiYq)%M0ne ze~r7|fp3`a$h_i)>sP2k!B`Qo0AZ7^oY@#>o-5a1Na`*rc#wR@rQDVUc(5pP5*&d1 zCn{PoA~1iPzlMs^u^a2#FVgT1X?Rh9hE>pzSITvECvS}cF*r4ZgF6ar;57IRZu~0L z`1KnjFj&DoS@fC<5jHqGWK#!POr*Ou<;#AYZtW@g-Qw2>5=1@k!eYA`AX!fZv8^^Du1mLcCte# zqt|9EQ%E(;7;qm9Us2SdJ^a#o`l^KKN1fhJq9Sr&c6yqKVS3N5%EDI*uWZa7!|g^_ zuUtEgH45hiLBvO)7_uo&J|UU~BZXU@EnmNqQt4r-cb4XQqKCPD;jp^Wgr1kM&NN)U zK2sUGB3!;U3DeUE=0HXiY~NNLGKJZQG@ZJBIdw&XZ0h3Y#4#+Pv2eiRg<>}*eNr`i zrSS5#Ikx8-@VjV7)yNHPxniS5w0OP+bxS!@T0|X-HEyb;E@;cY!&t-Z*49zk)$7`& z@MYVjYgk1sudl5i2Kz$DB`T89>M7+YnlpDA1hF;2Qu49{s#x_? zt%R2BQ&Thhu_icrCmS(jOmG%lR8?D5ff>-K*mX7dTjw!t zqJ;~L$F8m=FA-I$flwlV+nA;TGua#f>vu>SUb9}jx|hK>PLc-}Lsmm=Who|B=19YZ ztj1D^tg{K5DxwYPHA$5c`3==9_ss+X+JYX|L1uOS0uj8jmx(~X7o)=g)98ym2(~;a zY;r3}vJejo@p_zHdiK)A#F_-XS68q^*OvH!UGPTAwcw5r@_hJW!G+5+kPZRHfJGI} zNLUL|z^&j!gh(QZd6UqDr?RC>7ZMjGq+u&?M>PwZo!+G;Pbi)ued%wz$lDWv^y;%|f%6&nGTOnwWr+vY9N+MP#I>Am}QxO5?dpdzctP z^^{dYapt)TZ*q%fZxu`v!F*HYQWOWdCz@M$HoTTRFHy#M8mhzSL~~M2R*xK8rW)1C zD$!iq!vvM4gcu_zPQ6`GsxZq4io=4K&Xc`$9BaF9?p*x5w7Rl_1eTzr{B?4I+(=D+ zRUyOY_|=QkOwgg!t221M2_LHFJy_F8Gz;>IhpVV{@mr!%uV>Dcr;>n z2|5zFDKu6FzG>bDq*siQ42~C>%_Vj!sU^ z0HQ-jsOoX@RQR-bYGno=MKjWQtKy6D09!v&P+{?j!Y2B z@PH+f;$--gaPrIn43bKWpNR6lT!1%oQn^8IFmi%uN>b$D+2q-i@lz6%Ierv%+j#z?nw@XX)7S6DPtag%hU_VrnSGs?&lN0GFexs@myMFxG8~yNu&Z7SU`q8}z&> zA@bz!gJ({}Pf90F96yG_5*2BtL3Vgtt*uZI7=@wb$O-<`B9mXGF^TDTFVXUtX?5w}clLN25=o04wo1rlUX$L%R)6rtKmJ83csu>x5-rQI z2tyR$*wD$uaS7EnRs8+4d!{DGhK5E7YfK6QF2@)}(u1sjb&&b8=KO=-A1l@ne!&(4$uX1pMgG;K+D@ zZit*;KrL@+DSDJ&?uI;02yDh{b(|8s6@T|{9%!wn#3LeCDdpHK_N4Rl@7_tqx85#c zMg#ID)IWGOwwyTXTv|f;kNC{&4vdcs4vfIW8eogWD11~{T1M#sLm`GW6CzRR#&#ke z{?S)$rwV=-lI@BUhIy*%^l#rx$F?@07IHl}D#s?4mtsd<#7`?!;^d?8k%56>vXBZN zN})%NgqMUP$ENY|as=f9#RUtkZO2mY;PCFRnoiw_TXw}#^K8@UAHJK4Zysa?`jEP? zGqT;spurJTS6#T+99309lT0=|&=0PGX|>I0JA`c>y?0Xk3rEs{*6Zt+ZyJY5TXvqyu6^+%Ra*>xY*%DMYzXQl(- z+}{UxQ4yY-r{eG8;qW4V_)s;|aabf+6*p4ix6+CD=6^lgdy0bqkrNcVp6@;V^livF zi&K)R&R__#hJ8m4FD)(19|q+`DkRU(!A()u93ATGgA?tVf~)Swdz^(s(M93Vk!A!1 zCuWlY#m=)S(0UV%dS5)#dg?4j6y)fX$!A(me*(^%SAaGu0tImLip9folbtqP-X2_( zi1C5_@ZBlcc(4z5HjYnD0dJJN!8&?KSU55Sr>X+yVx`E;);8m*cmCz8&QnD_RJF?J zsl{oh&mXG#i`%h8>Rk@KpUAUtit}I{QfJR%_>iO)+wp>Q8ZYW_9b_+@YXWcU=nWnC zMi+#Gi_=(^6k&7>Vbr{tPQ>n@$@jT4Rm&Z9l`i%XZ2!!es=xbQDj98L2)&{ZRdbic zgP{dUt?$pGSRa^xWA*m*4~-JacyB;V;|IAp1T!P9AszMz%o9!~gP)*#>baIvPibAT z_v5x`p}hK}mb306o#OGSuJG(+|_qdr5jRICmg6FC18C zf@NzkPDT_r&zfV&)H{C+jh;JC)m2bybAG+!^v~Z;Cz7K$MiZqTtdz{idZR#b*Di-?aK8^*B|y zaw6WVDywF8kiY(5^ngTfT=wD>Glmabsk;kSC4}iE?7sc`<8%Ch8Dw$1Hz*ep)5d5r zb?f(^?=~$$;nn8&dbjBx+=5Y&8VV)>CpJ;f1PjdXkIYH?i7Ad81i-LrS646DRZ|wP zLKFM>19e$|eO{4Ohmy(ghYyMC)2FFAnN=?GJlAb1KKLM_`7Z(^7B^UZABgRj@Um6Y zk}TTW)k!uTo6z)}olWfH4-5j^VuacP3&(yvok+y~{kcw4&ZLxkp6@jMc`zB@T&Hmw zqInY2bzm;GPnrccQf~sF_V;vl!kB=S6a=n&6SL*}_E?Z!;{sb5r6sny8Bf3Q_s{p4 zR-0<8?RaxTeWp0e`VB;c188$WMBtHb8d>XHeAc-ajL3Qb66Wjd=*DHOqvNER$|^ov zzIT5!RI4CX4vvkd5KVC-RkqL6TU6^3vVEqehaZNMsbB?a$5e*op^UJ5-`?n~TVp~y zi$;eA`no&X$zZ?_eO<(6W^a6kpB<-y4E)66LC*hXI-a`quTMHnYpN94?A1C=&5tra zfG%4nm{pG&qYj#M@0-~hnQ>`75L1Ckz(!VTZ|{Pg2so$%M#-7-J$t?QJg5OTk?lud zyLCVFIG$}c<&jj_E!lR{@<*Bf+=?aA@9G&AUTR%c&+H%~0WjD`g{;4)tKHw(1JFnv zl}&O_#q{1G1TxMGE-uWmH#cMHH*qX-EW^>Msvb)aS&_k`b(_L8kADw-o)}_g%#8w~ zrJjxKolfkLG&ZEnKwnR%-`~+qu#t6u+wSyq#U3ZvR8S!qN9WasQ}JZ*Cpc|8oblrR zJdkscp4H5~(`<@^ng8hRR5C@Ut_yHD!mep%cXC>SLIE-l;nv;ZZ|i`CfE?+B-n;Z} z501t)P+b(~E*mUtD2`|l#_Woty%D$2YFcFqBSR}P6z#N{e(}*;>CNagIBByVv?`%< z6s0L}f`#C3Fi}TaYkL;HapD!&oGPCt6KRteg;@!W=VA%F zha*+L_^Wv2cH&wiK4>HxA=c>G&~$prg)X$oiSaCU?X9i;PC`#riTF&V0`A?TG~kd% z5J)&W;8J31^X>P)`^7_QGxehM6Ot>uXbBVaZf4rve(mP1H_rA`p9B@UWL+V-OerrR_A+*^N|jib3RXd9j8L6k&n#mBobwaABHR+rn4p0J-ptHTLxmhy})X;crO^OrPEC;14YY|QrucO!`@OUf7IcvjM zggFJ?iH!g#mcrg)RFhC2Ch~gLN#tEw@dIf=#BP%C^X>NfF@!)uCs1bL4Yj>35C(SW2W(u zBCuu^GIEGQrG)3KPNj@9a}{!lN($C9u)2wRV@^n=-nrdFe%IWH>##{*2sSuOwC;=* zjE)c4h?rRIRj`7#(K}9FET*MWiH$?jYc?T_0ze;hyz_)&e=lj;+SE{=)wPe59Ui$i zY8x3Jgm|#1rP76t)G(4kXeja_Q7;G}m>r0$ar`$%-6O-KX&=S~sao$NWwR0zxzUl} zXmlhtS~M~?gwtCKZgryL(lFLy6(gP-xIRFwo!M*VkWL1y1P0%+Wj4k zB@spyVv*;J+_q>S4q;ZPbNbuybzGd@(+m0fg9E`GBCbJ**h^}_dSF$HE71va;ss3x z2EzlDqyj#ovcNEJZ17Mzmudh?QZf8w(RYh5OF&66Rj^yAq zK}0!&fcjRH)#xo{*7q(p}JzWSZzfmrR7!CHBMqmn)<=C zt2@}kdV@W76{j}Xt=^~Ll6jx@34%Y;WhX1Ok}$Qh+ezF?iVCd-7Qh!0^w8-8Kx*WJ z!T^Q^aY8?8MHQ(BOi4Q;)790D|GGNcL8=*~>b;qamww;WLh5%!Ix9Q;+OKN8Zpi`s zN{Va+7PCnV3K3p!H0W+)?C6aVFscG0OM#X8UZGKzPYd{T1UqZMgaqC(2HIgroyKPH z@wbONs@nZeuyaYUQ)%%NK5^d2A)>=bM#7Mb@9?syyed`n$WK&Skq&!%ds{0xyU!=1 zy(H+HSiA|(k^0$Ev^n`bVkLup#r6uq=xPiq?&K<{cD`=9; z7TAUOl$L{$>f(e+;|?fRRbVJoPmtkqjslixQhdHFvmlsxh#9zHVAt27dEeu9N{(uK zRb_cuX-P?OQBh%G(&jBJEGjB4DJd;0uc)+xk<;bz%C$SJTH92`Y)^4hnlda*swpZv zO`@=$wTJx%F^cpQ`B8OZkN+3)zkzX@#>(%QBxy1oh~;fQiRt!5*QSkTUuJd zD(nxohx}H8h=lg}6eYu=)M@9DeVRz*6K!#SxGmJmwGgMKV56a-p}s!o3)ZD-Lv=x) zp}xMM0Y7a5-C#?wHPROI2ivTz_&BJ7j_jdsJlj~tM^s4wpo$MB+M=z&mS}UNDcu-r zisH-B)?{0-)kfb`1;TfI)ca>euOQT?FVnX}&GD8{>t@Rb&6_Q{R{RtH+iaz;KneJQ zf`-9#rkKI8Wd%Q}Z=mlrHZ^{)sThCK$6z8~J$xdAn`tsU$OE3bX#Hmm(Rv=ffK?Q`C+V%*4WQI^giWdDt6(raAY4Z=Xs3#4MF@7c1?oc z(+}j?z;@^dkl|D(XU}TQZGeG}UK3`@&cVq?7GgOoT$*X-HWc~>+X$S#5`}9?7PpW>2ySj+Kk==Op z+LHheGB>~+$uM?XV1gT>-TfZ|NdvW#s9Or%=6Es`SbYa{V(r-IYb~I|8fXESm*K2OKOg_{{+IW^ zTq2P7zg(i9kAHdp%llt05y<;rF451&zyJ6Cm+Su9T=yU6y8k-Y{pY#vzt8plgWT@F z_y-aLX%D3JQ*1|jMcWW*|Lvzw@4r { + UIWindow *window; +} + +@end + diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/ios/AppController.mm b/template/xcode4/cocos2d_chipmunk.xctemplate/ios/AppController.mm new file mode 100644 index 0000000000..5e28a17a2e --- /dev/null +++ b/template/xcode4/cocos2d_chipmunk.xctemplate/ios/AppController.mm @@ -0,0 +1,99 @@ +// +// ___PROJECTNAMEASIDENTIFIER___AppController.mm +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// +#import +#import "AppController.h" +#import "cocos2d.h" +#import "EAGLView.h" +#import "AppDelegate.h" + +@implementation ___PROJECTNAMEASIDENTIFIER___AppController + +#pragma mark - +#pragma mark Application lifecycle + +// cocos2d application instance +static AppDelegate s_sharedApplication; + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + + // Override point for customization after application launch. + + // Add the view controller's view to the window and display. + window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; + EAGLView *__glView = [EAGLView viewWithFrame: [window bounds] + pixelFormat: kEAGLColorFormatRGBA8 + depthFormat: GL_DEPTH_COMPONENT16_OES + preserveBackbuffer: NO + sharegroup: nil + multiSampling: NO + numberOfSamples: 0 ]; + [window addSubview: __glView]; + [window makeKeyAndVisible]; + + [[UIApplication sharedApplication] setStatusBarHidden: YES]; + + cocos2d::CCApplication::sharedApplication().run(); + return YES; +} + + +- (void)applicationWillResignActive:(UIApplication *)application { + /* + Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + */ + cocos2d::CCDirector::sharedDirector()->pause(); +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + /* + Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + */ + cocos2d::CCDirector::sharedDirector()->resume(); +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + /* + Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + If your application supports background execution, called instead of applicationWillTerminate: when the user quits. + */ + cocos2d::CCDirector::sharedDirector()->stopAnimation(); +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + /* + Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. + */ + cocos2d::CCDirector::sharedDirector()->startAnimation(); +} + + +- (void)applicationWillTerminate:(UIApplication *)application { + /* + Called when the application is about to terminate. + See also applicationDidEnterBackground:. + */ +} + + +#pragma mark - +#pragma mark Memory management + +- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { + /* + Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. + */ +} + + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/template/xcode4/cocos2d_chipmunk.xctemplate/ios/main.m b/template/xcode4/cocos2d_chipmunk.xctemplate/ios/main.m new file mode 100644 index 0000000000..106d54c93e --- /dev/null +++ b/template/xcode4/cocos2d_chipmunk.xctemplate/ios/main.m @@ -0,0 +1,16 @@ +// +// main.m +// ___PROJECTNAME___ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) { + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + int retVal = UIApplicationMain(argc, argv, nil, @"___PROJECTNAMEASIDENTIFIER___AppController"); + [pool release]; + return retVal; +} From 176dc46d9bdfe3a2ad15d657eb5c69bd6e9b02f1 Mon Sep 17 00:00:00 2001 From: Walzer Date: Mon, 13 Jun 2011 21:09:06 +0800 Subject: [PATCH 11/11] [ios] fixed #398, rename install-templates-xcode3.sh to install-templates-xcode4.sh, do the magic of xcode4 template in it. --- install-templates-xcode.sh | 309 ++++++++++++++++++++++++++++++++++++ install-templates-xcode3.sh | 186 ---------------------- 2 files changed, 309 insertions(+), 186 deletions(-) create mode 100755 install-templates-xcode.sh delete mode 100755 install-templates-xcode3.sh diff --git a/install-templates-xcode.sh b/install-templates-xcode.sh new file mode 100755 index 0000000000..41ae5141e7 --- /dev/null +++ b/install-templates-xcode.sh @@ -0,0 +1,309 @@ +#!/bin/bash + +echo 'cocos2d-x template installer' + +COCOS2D_VER='cocos2d-0.99.5-x-0.8.4' +BASE_TEMPLATE_DIR="/Library/Application Support/Developer/Shared/Xcode" +BASE_TEMPLATE_USER_DIR="$HOME/Library/Application Support/Developer/Shared/Xcode" + +force= +user_dir= + +usage(){ +cat << EOF +usage: $0 [options] + +Install / update templates for ${COCOS2D_VER} + +OPTIONS: + -f force overwrite if directories exist + -h this help + -u install in user's Library directory instead of global directory +EOF +} + +while getopts "fhu" OPTION; do + case "$OPTION" in + f) + force=1 + ;; + h) + usage + exit 0 + ;; + u) + user_dir=1 + ;; + esac +done + +# Make sure only root can run our script +if [[ ! $user_dir && "$(id -u)" != "0" ]]; then + echo "" + echo "Error: This script must be run as root in order to copy templates to ${BASE_TEMPLATE_DIR}" 1>&2 + echo "" + echo "Try running it with 'sudo', or with '-u' to install it only you:" 1>&2 + echo " sudo $0" 1>&2 + echo "or:" 1>&2 + echo " $0 -u" 1>&2 +exit 1 +fi + +# Make sure root and user_dir is not executed at the same time +if [[ $user_dir && "$(id -u)" == "0" ]]; then + echo "" + echo "Error: Do not run this script as root with the '-u' option." 1>&2 + echo "" + echo "Either use the '-u' option or run it as root, but not both options at the same time." 1>&2 + echo "" + echo "RECOMMENDED WAY:" 1>&2 + echo " $0 -u -f" 1>&2 + echo "" +exit 1 +fi + +copy_files(){ + # SRC_DIR="${SCRIPT_DIR}/${1}" + rsync -r --exclude=.svn "$1" "$2" +} + +check_dst_dir(){ + if [[ -d $DST_DIR ]]; then + if [[ $force ]]; then + echo "removing old libraries: ${DST_DIR}" + rm -rf "${DST_DIR}" + else + echo "templates already installed. To force a re-install use the '-f' parameter" + exit 1 + fi + fi + + echo ...creating destination directory: $DST_DIR + mkdir -p "$DST_DIR" +} + +# copy_base_mac_files(){ +# echo ...copying cocos2dx files +# copy_files cocos2dx "$LIBS_DIR" + +# echo ...copying CocosDenshion files +# copy_files CocosDenshion "$LIBS_DIR" +# } + +copy_base_files(){ + echo ...copying cocos2dx files + copy_files cocos2dx "$LIBS_DIR" + + echo ...copying CocosDenshion files + copy_files CocosDenshion "$LIBS_DIR" +} + +copy_cocos2d_files(){ + echo ...copying cocos2d files + copy_files cocos2dx "$LIBS_DIR" + copy_files LICENSE.cocos2d-x "$LIBS_DIR" +} + +copy_cocosdenshion_files(){ + echo ...copying CocosDenshion files + copy_files CocosDenshion "$LIBS_DIR" + # copy_files LICENSE_CocosDenshion.txt "$LIBS_DIR" +} + +# copy_cocosdenshionextras_files(){ +# echo ...copying CocosDenshionExtras files +# copy_files CocosDenshion/CocosDenshionExtras "$LIBS_DIR" +# } + +# copy_fontlabel_files(){ +# echo ...copying FontLabel files +# copy_files external/FontLabel "$LIBS_DIR" +# copy_files LICENSE_FontLabel.txt "$LIBS_DIR" +# } + +# copy_cocoslive_files(){ +# echo ...copying cocoslive files +# copy_files cocoslive "$LIBS_DIR" + +# echo ...copying TouchJSON files +# copy_files external/TouchJSON "$LIBS_DIR" +# copy_files LICENSE_TouchJSON.txt "$LIBS_DIR" +# } + +print_template_banner(){ + echo '' + echo '' + echo '' + echo "$1" + echo '----------------------------------------------------' + echo '' +} + +# copies project-based templates +copy_xcode3_project_templates(){ + if [[ $user_dir ]]; then + TEMPLATE_DIR="${BASE_TEMPLATE_USER_DIR}/Project Templates/${COCOS2D_VER}/" + else + TEMPLATE_DIR="${BASE_TEMPLATE_DIR}/Project Templates/${COCOS2D_VER}/" + fi + + if [[ ! -d "$TEMPLATE_DIR" ]]; then + echo '...creating cocos2d template directory' + echo '' + mkdir -p "$TEMPLATE_DIR" + fi + + print_template_banner "Installing Xcode 3 cocos2d-x iOS template" + + DST_DIR="$TEMPLATE_DIR""cocos2d-x Application/" + LIBS_DIR="$DST_DIR"libs + + check_dst_dir + + echo ...copying template files + copy_files template/xcode3/cocos2d-x_app/ "$DST_DIR" + + copy_base_files + + echo done! + + print_template_banner "Installing cocos2d-x iOS + box2d template" + + DST_DIR="$TEMPLATE_DIR""cocos2d-x Box2d Application/" + LIBS_DIR="$DST_DIR"libs + + check_dst_dir + + echo ...copying template files + copy_files template/xcode3/cocos2d-x_box2d_app/ "$DST_DIR" + + copy_base_files + + echo ...copying Box2D files + copy_files Box2D "$LIBS_DIR" + + echo done! + + print_template_banner "Installing cocos2d-x iOS + chipmunk template" + + DST_DIR="$TEMPLATE_DIR""cocos2d-x chipmunk Application/" + LIBS_DIR="$DST_DIR"libs + + check_dst_dir + + echo ...copying template files + copy_files template/xcode3/cocos2d-x_chipmunk_app/ "$DST_DIR" + + copy_base_files + + echo ...coping chipmunk files + copy_files chipmunk "$LIBS_DIR" + + echo done! +} + +copy_xcode3_file_templates(){ + if [[ $user_dir ]]; then + TEMPLATE_DIR="${BASE_TEMPLATE_USER_DIR}/File Templates/${COCOS2D_VER}/" + else + TEMPLATE_DIR="${BASE_TEMPLATE_DIR}/File Templates/${COCOS2D_VER}/" + fi + + echo ...copying file templates + + DST_DIR="$TEMPLATE_DIR" + check_dst_dir + + if [[ ! -d "$TEMPLATE_DIR" ]]; then + echo '...creating cocos2d template directory' + echo '' + mkdir -p "$TEMPLATE_DIR" + fi + + # print_template_banner "Installing CCNode file templates..." + + # copy_files "templates/file-templates/CCNode class" "$DST_DIR" + + echo done! +} + +# Xcode4 templates +copy_xcode4_project_templates(){ + TEMPLATE_DIR="$HOME/Library/Developer/Xcode/Templates/cocos2d-x/" + + print_template_banner "Installing Xcode 4 cocos2d-x iOS template" + + DST_DIR="$TEMPLATE_DIR" + check_dst_dir + + LIBS_DIR="$DST_DIR""lib_cocos2dx.xctemplate/libs/" + mkdir -p "$LIBS_DIR" + copy_cocos2d_files + + + # LIBS_DIR="$DST_DIR""lib_cocoslive.xctemplate/libs/" + # mkdir -p "$LIBS_DIR" + # copy_cocoslive_files + + LIBS_DIR="$DST_DIR""lib_cocosdenshion.xctemplate/libs/" + mkdir -p "$LIBS_DIR" + copy_cocosdenshion_files + + # LIBS_DIR="$DST_DIR""lib_cocosdenshionextras.xctemplate/libs/" + # mkdir -p "$LIBS_DIR" + # copy_cocosdenshionextras_files + + # LIBS_DIR="$DST_DIR""lib_fontlabel.xctemplate/libs/" + # mkdir -p "$LIBS_DIR" + # copy_fontlabel_files + + echo ...copying template files + copy_files template/xcode4/ "$DST_DIR" + + echo done! + + print_template_banner "Installing Xcode 4 Chipmunk iOS template" + + + LIBS_DIR="$DST_DIR""lib_chipmunk.xctemplate/libs/" + mkdir -p "$LIBS_DIR" + + echo ...copying Chipmunk files + copy_files chipmunk "$LIBS_DIR" + copy_files LICENSE.chipmunk "$LIBS_DIR" + + echo done! + + print_template_banner "Installing Xcode 4 Box2d iOS template" + + + LIBS_DIR="$DST_DIR""lib_box2d.xctemplate/libs/" + mkdir -p "$LIBS_DIR" + + echo ...copying Box2D files + copy_files Box2D "$LIBS_DIR" + copy_files LICENSE.box2d "$LIBS_DIR" + + echo done! + + + # Move File Templates to correct position + # DST_DIR="$HOME/Library/Developer/Xcode/Templates/File Templates/cocos2d/" + # OLD_DIR="$HOME/Library/Developer/Xcode/Templates/cocos2d/" + + # print_template_banner "Installing Xcode 4 CCNode file templates..." + + # check_dst_dir + + # mv -f "$OLD_DIR""/CCNode class.xctemplate" "$DST_DIR" + + echo done! + +} + +# copy Xcode4 templates +copy_xcode4_project_templates + +# copy Xcode3 templates +copy_xcode3_project_templates +# copy_xcode3_file_templates diff --git a/install-templates-xcode3.sh b/install-templates-xcode3.sh deleted file mode 100755 index 6aaad27b19..0000000000 --- a/install-templates-xcode3.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/bash - -echo 'cocos2d-x template installer' - -COCOS2D_VER='cocos2d-0.99.5-x-0.8.4' -BASE_TEMPLATE_DIR="/Library/Application Support/Developer/Shared/Xcode" -BASE_TEMPLATE_USER_DIR="$HOME/Library/Application Support/Developer/Shared/Xcode" - -force= -user_dir= - -usage(){ -cat << EOF -usage: $0 [options] - -Install / update templates for ${COCOS2D_VER} - -OPTIONS: - -f force overwrite if directories exist - -h this help - -u install in user's Library directory instead of global directory -EOF -} - -while getopts "fhu" OPTION; do - case "$OPTION" in - f) - force=1 - ;; - h) - usage - exit 0 - ;; - u) - user_dir=1 - ;; - esac -done - -# Make sure only root can run our script -if [[ ! $user_dir && "$(id -u)" != "0" ]]; then - echo "" - echo "Error: This script must be run as root in order to copy templates to ${BASE_TEMPLATE_DIR}" 1>&2 - echo "" - echo "Try running it with 'sudo', or with '-u' to install it only you:" 1>&2 - echo " sudo $0" 1>&2 - echo "or:" 1>&2 - echo " $0 -u" 1>&2 -exit 1 -fi - - -copy_files(){ - rsync -r --exclude=.svn "$1" "$2" -} - -check_dst_dir(){ - if [[ -d $DST_DIR ]]; then - if [[ $force ]]; then - echo "removing old libraries: ${DST_DIR}" - rm -rf "${DST_DIR}" - else - echo "templates already installed. To force a re-install use the '-f' parameter" - exit 1 - fi - fi - - echo ...creating destination directory: $DST_DIR - mkdir -p "$DST_DIR" -} - -copy_base_mac_files(){ - echo ...copying cocos2dx files - copy_files cocos2dx "$LIBS_DIR" - - echo ...copying CocosDenshion files - copy_files CocosDenshion "$LIBS_DIR" -} - -copy_base_files(){ - echo ...copying cocos2dx files - copy_files cocos2dx "$LIBS_DIR" - - echo ...copying CocosDenshion files - copy_files CocosDenshion "$LIBS_DIR" -} - -print_template_banner(){ - echo '' - echo '' - echo '' - echo "$1" - echo '----------------------------------------------------' - echo '' -} - -# copies project-based templates -copy_project_templates(){ - if [[ $user_dir ]]; then - TEMPLATE_DIR="${BASE_TEMPLATE_USER_DIR}/Project Templates/${COCOS2D_VER}/" - else - TEMPLATE_DIR="${BASE_TEMPLATE_DIR}/Project Templates/${COCOS2D_VER}/" - fi - - if [[ ! -d "$TEMPLATE_DIR" ]]; then - echo '...creating cocos2d template directory' - echo '' - mkdir -p "$TEMPLATE_DIR" - fi - - print_template_banner "Installing cocos2d-x iOS template" - - DST_DIR="$TEMPLATE_DIR""cocos2d-x Application/" - LIBS_DIR="$DST_DIR"libs - - check_dst_dir - - echo ...copying template files - copy_files template/xcode3/cocos2d-x_app/ "$DST_DIR" - - copy_base_files - - echo done! - - print_template_banner "Installing cocos2d-x iOS + box2d template" - - DST_DIR="$TEMPLATE_DIR""cocos2d-x Box2d Application/" - LIBS_DIR="$DST_DIR"libs - - check_dst_dir - - echo ...copying template files - copy_files template/xcode3/cocos2d-x_box2d_app/ "$DST_DIR" - - copy_base_files - - echo ...coping Box2D files - copy_files Box2D "$LIBS_DIR" - - echo done! - - print_template_banner "Installing cocos2d-x iOS + chipmunk template" - - DST_DIR="$TEMPLATE_DIR""cocos2d-x chipmunk Application/" - LIBS_DIR="$DST_DIR"libs - - check_dst_dir - - echo ...copying template files - copy_files template/xcode3/cocos2d-x_chipmunk_app/ "$DST_DIR" - - copy_base_files - - echo ...coping chipmunk files - copy_files chipmunk "$LIBS_DIR" - - echo done! -} - -copy_file_templates(){ - if [[ $user_dir ]]; then - TEMPLATE_DIR="${BASE_TEMPLATE_USER_DIR}/File Templates/${COCOS2D_VER}/" - else - TEMPLATE_DIR="${BASE_TEMPLATE_DIR}/File Templates/${COCOS2D_VER}/" - fi - - echo ...copying file templates - - DST_DIR="$TEMPLATE_DIR" - check_dst_dir - - if [[ ! -d "$TEMPLATE_DIR" ]]; then - echo '...creating cocos2d template directory' - echo '' - mkdir -p "$TEMPLATE_DIR" - fi - - print_template_banner "Installing CCNode file templates..." - - copy_files "templates/file-templates/CCNode class" "$DST_DIR" - - echo done! -} - -copy_project_templates -