新手完美运行CocoStudio示例程序

我使用的是 vs2010 + cocos2dx 2.2.0

看见很多人说示例程序跑不起来,所以发个贴来说说我是怎样运行起来的,仅仅代表我自己的方法哦

首先下载示例程序,这个包里面就自带了个cocos2d-x的目录,咱们可以把cocos2dx根目录都放到这里来,或者将示例程序包放到cocos2dx那个文件夹的上一级,不过的保证文件夹的名称和cocos2d-x保持一致

然后随便选择一个项目打开,如:D:\360Downloads\CocoStudioSamples-master\DemoGame\proj.win32里面的 DemoGame.vcxproj 文件,可以先打开vs2010,然后从通过vs2010打开解决方案,找到这个路径
(这里原本的.sln是 2012版本的,可以先打开vs2010,然后从通过vs2010打开.vcxproj 文件,然后保存一个.sln文件,替换原来的,以后就可以直接打开.sln文件了)

编译,发现很多lib没找到,或者link有问题,别着急我把这些库加进来

分别把下面几个目录下的项目都加到解决方案里面来

D:\360Downloads\CocoStudioSamples-master\cocos2d-x\cocos2dx\proj.win32 cocos2d.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\CocosDenshion\proj.win32 CocosDenshion.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\extensions\proj.win32 libExtensions.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\external\Box2D\proj.win32 Box2D.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\external\chipmunk\proj.win32 chipmunk.vcxproj

不管用不用的到,我都给加进去了,这个时候解决方案里面就多了这几个工程lib了

现在右击解决方案-》属性-》通用属性-》项目依赖项,项目选择DemoGame,下面列表会有刚刚加进去的几个lib工程,把他们都勾上再编译

(到这里其实大部分的示例都能跑起来了,就剩下两个使用到了Box2d的项目跑不起来 DemoGame和SampleCollision)

在DemoGame里面有一个ReadMe.doc文件,这里面其实已经说了怎么让这个项目正常跑起来

首先你要找到 这么一段,就在 CCArmatureDefine.h 文件里面

#ifndef ENABLE_PHYSICS_BOX2D_DETECT
#defube ENABLE_PHYSICS_BOX2D_DETECT 0
#endif

#ifndef ENABLE_PHYSICS_CHIPMUNK_DETECT
#defube ENABLE_PHYSICS_CHIPMUNK _DETECT 1
#endif

其实就是物理引擎的开关,是使用BOX2D还是CHIPMUNK了,把他改成

#ifndef ENABLE_PHYSICS_BOX2D_DETECT
#defube ENABLE_PHYSICS_BOX2D_DETECT 1
#endif

#ifndef ENABLE_PHYSICS_CHIPMUNK_DETECT
#defube ENABLE_PHYSICS_ CHIPMUNK _DETECT 0
#endif

就可以了,完了之后还得右击项目-》属性-》配置属性-》c/c++ -》预处理器-》预处理器定义,将里面的 CC_ENABLE_CHIPMUNK_INTEGRATION=1 改成 CC_ENABLE_BOX2D_INTEGRATION=1 就可以了
另外,上面编译还有问题,可以右击项目-》属性-》通用属性-》框架和引用-》添加新引用,把libBox2D,libChipmunk,libcocos2d,libCocosDenshion,libExtensions都加进来

好了,现在编译解决方案就可以同过了。。。

我把所有的示例项目都加到这个里面来了,SampleCollision这个项目编译还有问题,armature2->setB2Body(body);说setB2Body不是他的成员函数,把他改成setBody就好了

这个是我自己通过hanrea和另一个人的提示弄出来的,希望对大家有用。。。

一些操作截图。。
cocostudio示例运行.rar (225 KB)

顶顶顶顶顶顶顶顶顶顶

好多头文件都找不到,连cocos2d.h都找不到啊!!

出现 很多语法 错误 不知道 为什么

此贴应该加精啊! :2::2:

已加精~~:14:

:867::867::867:

我都该了 还是编译不了

改了,还是编译不了
6> 复制了 2 个文件
6>PhysicalWorld.obj : error LNK2019: 无法解析的外部符号 “public: void __thiscall cocos2d::extension::CCPhysicsSprite::setPTMRatio(float)” (?setPTMRatio@CCPhysicsSprite@extension@cocos2d@@QAEXM@Z),该符号在函数 “private: void __thiscall PhysicalWorld::createBullet(class cocos2d::CCPoint,class cocos2d::CCActionInterval *)” (?createBullet@PhysicalWorld@@AAEXVCCPoint@cocos2d@@PAVCCActionInterval@3@@Z) 中被引用
6>PhysicalWorld.obj : error LNK2019: 无法解析的外部符号 “public: void __thiscall cocos2d::extension::CCPhysicsSprite::setB2Body(class b2Body *)” (?setB2Body@CCPhysicsSprite@extension@cocos2d@@QAEXPAVb2Body@@@Z),该符号在函数 “private: void __thiscall PhysicalWorld::createBullet(class cocos2d::CCPoint,class cocos2d::CCActionInterval *)” (?createBullet@PhysicalWorld@@AAEXVCCPoint@cocos2d@@PAVCCActionInterval@3@@Z) 中被引用
6>E:\study\cocos2d-x\versions\CocoStudioSamples-master\DemoGame\proj.win32\Debug.win32\DemoGame.exe : fatal error LNK1120: 2 个无法解析的外部命令

问题解决了,要把libExtensions 项目里面的
-》属性-》配置属性-》c/c++ -》预处理器-》预处理器定义,将里面的 CC_ENABLE_CHIPMUNK_INTEGRATION=1 改成 CC_ENABLE_BOX2D_INTEGRATION=1 就可以了

加32个赞:14::14::14:

加赞有啥用?

我也改好了 其实就是把 缺少的
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\cocos2dx\proj.win32 cocos2d.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\CocosDenshion\proj.win32 CocosDenshion.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\extensions\proj.win32 libExtensions.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\external\Box2D\proj.win32 Box2D.vcxproj
D:\360Downloads\CocoStudioSamples-master\cocos2d-x\external\chipmunk\proj.win32 chipmunk.vcxproj
这些目录 在自己的下载的 cocos2dx-2.2-* 的 目录下对应的文件夹复制到 下载后cocos2d-x的空包里面就可以了

“我把所有的示例项目都加到这个里面来了,SampleCollision这个项目编译还有问题,armature2->setB2Body(body);说setB2Body不是他的成员函数,把他改成setBody就好了 "
不要按楼主这句话做,9楼正解.

CCArmatureDefine.h 文件互换引擎开关之后编译通过,很关键的一步,当然,libExtensions库和自项目设置CC_ENABLE_BOX2D_INTEGRATION=1也是必须的.真心非常感谢楼主…折腾很久了…:3:

我按照CocoStudioSamples中DemoGame里面readme.doc里面说的在android工程里面的说明修改了extensions下的Android.mk和DemoGame下jni的Application.mk 编译的时候还是会报“jni/…/…/Classes/PhysicalWorld.cpp: In member function ‘void PhysicalWorld::createBullet(cocos2d::CCPoint, cocos2d::CCActionInterval*)’:
jni/…/…/Classes/PhysicalWorld.cpp:181:10: error: ‘class cocos2d::extension::CCPhysicsSprite’ has no member named ‘setB2Body’
jni/…/…/Classes/PhysicalWorld.cpp:182:10: error: ‘class cocos2d::extension::CCPhysicsSprite’ has no member named ‘setPTMRatio’
make.exe: *** Error 1”

这样的错误,按照readme.doc 文件修改C++ 工程到是可以运行,请问这是为何?
另外我附上/DemoGame/jni/Application.mk 和DemoGame/extensions/Android.mk

你好 你的问题解决了吗 我好像也遇到了你同样的问题 还是解决不了

编译通过,点击StartGame和NextStage宕了
libExtensions.dll!b2BlockAllocator::Allocate(int size=28) Line 118 C++
libExtensions.dll!b2Fixture::Create(b2BlockAllocator * allocator=0x05d28e20, b2Body * body=0x05e19d18, const b2FixtureDef * def=0x002ddbec) Line 58 C++
libExtensions.dll!b2Body::CreateFixture(const b2FixtureDef * def=0x002ddbec) Line 165 C++
libExtensions.dll!cocos2d::extension::CCColliderDetector::setBody(b2Body * pBody=0x05e19d18) Line 459 C++
libExtensions.dll!cocos2d::extension::CCArmature::setBody(b2Body * body=0x05e19d18) Line 771 C++

DemoGame.exe!PhysicalWorld::initPlayer(Player * pPlayer=0x00000000) Line 79 C++
DemoGame.exe!PhysicalWorld::init(EnemyListBuilder * pBuilder=0x03e43138, Player * pPlayer=0x00000000) Line 35 C++
DemoGame.exe!PhysicalWorld::create(EnemyListBuilder * pBuilder=0x03e43138, Player * pPlayer=0x00000000) Line 14 C++
DemoGame.exe!StageBasic::initWorld() Line 74 C++
DemoGame.exe!StageOne::init() Line 141 C++
DemoGame.exe!StageOne::create() Line 116 C++
DemoGame.exe!GameScene::init(int stage=1) Line 34 C++
DemoGame.exe!GameScene::create(int stage=1) Line 10 C++
DemoGame.exe!HelloWorld::menuStartGameCallback(cocos2d::CCObject * pSender=0x032f4648) Line 75 C++
libcocos2d.dll!cocos2d::CCMenuItem::activate() Line 114 C++
libcocos2d.dll!cocos2d::CCMenuItemLabel::activate() Line 233 C++
libcocos2d.dll!cocos2d::CCMenu::ccTouchEnded(cocos2d::CCTouch * touch=0x0072de58, cocos2d::CCEvent * event=0x00000000) Line 260 C++
libcocos2d.dll!cocos2d::CCTouchDispatcher::touches(cocos2d::CCSet * pTouches=0x002def30, cocos2d::CCEvent * pEvent=0x00000000, unsigned int uIndex=2) Line 377 C++
libcocos2d.dll!cocos2d::CCTouchDispatcher::touchesEnded(cocos2d::CCSet * touches=0x002def30, cocos2d::CCEvent * pEvent=0x00000000) Line 509 C++
libcocos2d.dll!cocos2d::CCEGLViewProtocol::handleTouchesEnd(int num=1, int * ids=0x002df168, float * xs=0x002df174, float * ys=0x002df178) Line 334 C++
libcocos2d.dll!cocos2d::CCEGLView::WindowProc(unsigned int message=514, unsigned int wParam=0, long lParam=7864538) Line 391 C++
libcocos2d.dll!cocos2d::WindowProc(HWND_ * hWnd=0x001b0ca0, unsigned int uMsg=514, unsigned int wParam=0, long lParam=7864538) Line 171 C++

Allocate函数宕在(加粗下划线那行)这里:
void* b2BlockAllocator::Allocate(int32 size)
{
if (size == 0)
return NULL;

b2Assert(0 < size);

if (size > b2_maxBlockSize)
{
    return b2Alloc(size);
}

int32 index = s_blockSizeLookup;
b2Assert(0 <= index && index < b2_blockSizes);

if (m_freeLists)
{
    b2Block* block = m_freeLists;

m_freeLists = block->next;
return block;
}

— Begin quote from ____

引用第18楼whu_pk于2014-11-03 12:09发表的 :
Allocate函数宕在(加粗下划线那行)这里:
void* b2BlockAllocator::Allocate(int32 size)
{
if (size == 0)
return NULL;
http://www.cocoachina.com/bbs/job.php?action=topost&tid=163573&pid=1089039

— End quote

我在学习尝试使用BOX2D引擎,也遇到了类似的问题,创建两个CCPhysicsSprite,创建第一个的时候正常,创建第二个就宕机,在你加粗的地方,这个时候访问了非法地址0x0000 0002.
我追踪了一下栈的调用
1,,在创建第一个CCPhysicsSprite的时候就有问题了,m_freeLists->next 指向了0x0000 0002.,只要m_freeLists向后移动就会宕机。
2,向前回溯,按照规则这个时候算出来的index应该是5,但是我看到的是0,再检查数组s_blockSizeLookup,这里面是全0,而实际上从s_blockSizeLookup开始就应该是非0的值了。
3,继续回溯,发现在调用CCPhysicsSprite::setPosition(const CCPoint &pos)之前,((CCPhysicsSprite *) obj)->m_pB2Body->m_world->m_blockAllocator->s_blockSizeLookup还是正常的,但是一旦进入CCPhysicsSprite::setPosition(const CCPoint &pos)就不对了。之前((CCPhysicsSprite *) obj)->m_pB2Body->m_world->m_blockAllocator->s_blockSizeLookup的地址是0x00486c30,数组中数据正常。但是进入setPosition函数之后,((CCPhysicsSprite *) obj)->m_pB2Body->m_world->m_blockAllocator->s_blockSizeLookup的地址变成了0x103cf7e8,数组中内容为全0 。

s_blockSizeLookup是一个 static unit8的数组,它的内存应该是分配在.data段中,地址应该是不会被修改的。很疑惑这里为什么地址会变了?
求有经验的大侠指导