由于课程作业要求用cocos2d-x完成,把我折腾的够呛.
以下是我的心路历程:

选用cc4.0版本,由于要求用python2编译,尽管我删除了python3的环境变量,但cmd在编译的时候还是用了python3,windows系统不得不品的一环,
->
狠下心卸载了python3,重置了python2,终于能够正常运行cmd里的cocos命令了,一打开vs看的我满头雾水.
->
于是去官网找教程,

谁想官网的教程基本啥都没教,甚至不会教我在一个新建cpp文件里要包含哪些东西,而是填鸭式的讲一些分块组件,于是放弃看教程
->
找到了cocos安装时自带的test项目,一运行,发现连官方的test的项目都跑不了,官网教程甚至没教我怎么运行这个test项目,于是换成3.17.2,还试了试github上其他的项目,可能是我打开的方法不对,总有或多或少的小问题
->
仔细研究,看了看test项目里的cmakelists
贴一小段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
     Classes/controller.h
Classes/TransitionsTest/TransitionsTest.h
Classes/TextureCacheTest/TextureCacheTest.h
Classes/MotionStreakTest/MotionStreakTest.h
Classes/ExtensionsTest/AssetsManagerExTest/AssetsManagerExTest.h
Classes/ExtensionsTest/ExtensionsTest.h
Classes/ExtensionsTest/TableViewTest/CustomTableViewCell.h
Classes/ExtensionsTest/TableViewTest/TableViewTestScene.h
Classes/ExtensionsTest/NetworkTest/WebSocketTest.h
Classes/ExtensionsTest/NetworkTest/WebSocketDelayTest.h
Classes/ExtensionsTest/NetworkTest/SocketIOTest.h
Classes/ExtensionsTest/NetworkTest/HttpClientTest.h
Classes/Sprite3DTest/Sprite3DTest.h
Classes/Sprite3DTest/DrawNode3D.h
Classes/BaseTest.h
Classes/SceneTest/SceneTest.h
Classes/ReleasePoolTest/ReleasePoolTest.h
Classes/InputTest/MouseTest.h
# Classes/SpineTest/SpineTest.h
# Classes/Scene3DTest/Scene3DTest.h
Classes/ParticleTest/ParticleTest.h
Classes/EffectsTest/EffectsTest.h
Classes/UITest/UITest.h
Classes/UITest/CocoStudioGUITest/UIScrollViewTest/UIScrollViewTest.h
Classes/UITest/CocoStudioGUITest/CocosGUIScene.h
Classes/UITest/CocoStudioGUITest/UITabControlTest/UITabControlTest.h
Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.h
Classes/UITest/CocoStudioGUITest/UITextBMFontTest/UITextBMFontTest.h
Classes/UITest/CocoStudioGUITest/UIImageViewTest/UIImageViewTest.h
Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.h
Classes/UITest/CocoStudioGUITest/UILoadingBarTest/UILoadingBarTest.h
Classes/UITest/CocoStudioGUITest/UIEditBoxTest.h
Classes/UITest/CocoStudioGUITest/UIRichTextTest/UIRichTextTest.h
Classes/UITest/CocoStudioGUITest/UIScene.h
Classes/UITest/CocoStudioGUITest/UIPageViewTest/UIPageViewTest.h
Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.h
Classes/UITest/CocoStudioGUITest/UIScale9SpriteTest.h
Classes/UITest/CocoStudioGUITest/UIWidgetAddNodeTest/UIWidgetAddNodeTest.h
Classes/UITest/CocoStudioGUITest/UIListViewTest/UIListViewTest.h
Classes/UITest/CocoStudioGUITest/UISceneManager.h
Classes/UITest/CocoStudioGUITest/UIRadioButtonTest/UIRadioButtonTest.h
Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.h
Classes/UITest/CocoStudioGUITest/UITextAtlasTest/UITextAtlasTest.h
Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.h
Classes/UITest/CocoStudioGUITest/UIFocusTest/UIFocusTest.h
Classes/UITest/CocoStudioGUITest/UITextTest/UITextTest.h
Classes/DrawPrimitivesTest/DrawPrimitivesTest.h
Classes/BillBoardTest/BillBoardTest.h
Classes/SpriteFrameCacheTest/SpriteFrameCacheTest.h
Classes/EffectsAdvancedTest/EffectsAdvancedTest.h
Classes/SchedulerTest/SchedulerTest.h
Classes/MultiTouchTest/MultiTouchTest.h
Classes/testResource.h
Classes/ShaderTest/ShaderTest.vsh.h
Classes/ShaderTest/shaderTest.psh.h
Classes/ShaderTest/ShaderTest.h
Classes/ShaderTest/ShaderTest2.h
Classes/NewRendererTest/NewRendererTest.h
Classes/SpritePolygonTest/SpritePolygonTest.h
Classes/TexturePackerEncryptionTest/TextureAtlasEncryptionTest.h

这怎么还一个个自己填呢
->
默默地换回cc4.0,继续受苦
->
找到了古早博客
但版本不是4.0的,不过对照着还能看
->
好的,终于找到了
cocos run --proj-dir … -p win32
发现这个确实就在readme.md里,好吧,是我没认真看文档…
![](/images/2025-11-29 神奇的cocos2d-x/image.png)
好的,我不该抱着什么希望的.
->
好滴,又找到高人了
官方把这些问题整合一下会死吗,哈哈,不过cocos死的也差不多了.
->
好的,还是跑不了,显然test里的项目用的是vs 2010,根本兼容不了,
于是又换成了3.17.2里的测试项目,原来一开始自带了build好的文件,他也知道新手自己跑不了,
现在终于能跑测试项目了,接下来可以好好研究变量的使用了(玄学)
->

cocos命令

cocos new <项目名> -l cpp 当前目录下生成
cmake -S . -B build -G “Visual Studio 17 2022” -A win32 -T v143 在新项目里强制改cmake方式.
新增加文件时,在cmake里面加入对应的文件路径
再运行cmake ..就行了

研究场景创建

1.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "cocos2d.h"
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__ //防止反复包含同一头文件
USING_NS_CC; //using namespace cocos2d,意义不明的缩写
class HelloWorld : public cocos2d::Scene //继承cocos2d命名空间下的scene类
{
public:
virtual bool init() override;
//override作为关键字,要求重写scene内的这个init()函数与现在这个函数必须同名,否则报错.

static cocos2d::Scene* scene();
//把这个函数开放给appdelegate.cpp使用
// a selector callback
void menuCloseCallback(Ref* sender);
/
// implement the "static create()" method manually
CREATE_FUNC(HelloWorld);
};

1.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
USING_NS_CC;

Scene* HelloWorld::scene()
{
return HelloWorld::create();
}
bool HelloWorld::init(){
//内部实现所有自己要搞的功能,重载原Scene对象的init()函数
auto visibleSize = Director::getInstance()->getVisibleSize();
//窗口对角线向量
auto origin = Director::getInstance()->getVisibleOrigin();
//左下角(0,0)
// 2. add a menu item with "X" image, which is clicked to quit the program
// you may modify it.
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
//第一个是未选中时的图片,第二个是选中时的图片
//第三个是回调函数
closeItem->setPosition(origin + Vec2(visibleSize) - Vec2(closeItem->getContentSize() / 2));

auto menu = Menu::create(closeItem, nullptr);
//此时menu已经和closeitem绑定,位置也相互绑定
menu->setPosition(Vec2::ZERO);
//但还是要先初始化一下位置,sb cocos
//而且莫名其妙这里就变成相对位置了
this->addChild(menu, 1);
//调用addchild方法置于图层1,不然会被初始图层0覆盖
/////////////////////////////
// 3. add your codes below...

// add a label shows "Hello World"
// create and initialize a label

auto label = Label::createWithTTF("Hello World", "fonts/arial.ttf", TITLE_FONT_SIZE);
//注意到这里的font size需要手动指明,没有默认字体大小给你
// position the label on the center of the screen
label->setPosition(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label->getContentSize().height);
//注意到这不是函数重载,只传入二维向量时要写明vec2方法以接收两个参数
// add the label as a child to this layer
this->addChild(label, 1);

// add "HelloWorld" splash screen"
auto sprite = Sprite::create("HelloWorld.png");

// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize / 2) + origin);
//如果默认从(0,0)开始又为什么要把origin加上去呢

// add the sprite as a child to this layer
this->addChild(sprite);
//神奇的是精灵放在-1不会被覆盖,可能默认精灵不会重叠吧
auto drawNode = DrawNode::create();
drawNode->setPosition(Vec2(0, 0));
addChild(drawNode);

Rect safeArea = Director::getInstance()->getSafeAreaRect();
drawNode->drawRect(safeArea.origin, safeArea.origin + safeArea.size, Color4F::BLUE);

return true;
}
void HelloWorld::menuCloseCallback(Ref* sender)
{
Director::getInstance()->end();
}
//销毁实例吗

短短几行,够我研究了.
虚函数了解

研究appdelegate

appdelegate.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
AppDelegate::AppDelegate() {
}
AppDelegate::~AppDelegate()
{
}
//小心翼翼的构造与析构
void AppDelegate::initGLContextAttrs()
{
GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8, 0};
GLView::setGLContextAttrs(glContextAttrs);
}
//没必要管的底层画布函数
bool AppDelegate::applicationDidFinishLaunching()
{
// Initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("Cpp Empty Test");
//窗口标题设定
director->setOpenGLView(glview);
}
glview->setIcon(icons);

director->setOpenGLView(glview);

// Set the design resolution
glview->setDesignResolutionSize(designResolutionSize.width,
designResolutionSize.height, ResolutionPolicy::NO_BORDER);

Size frameSize = glview->getFrameSize();

vector<string> searchPath;
// Create a scene. it's an autorelease object
auto scene = HelloWorld::scene();

// Run
director->runWithScene(scene);

return true;
}

官方cpp_empty_test 项目

AppMacros.h

1
2
static Resource mediumResource =  { cocos2d::Size(1024, 768),  "ipad"   };
//设置窗口尺寸

cpp_test 项目

由于沟槽的项目文件不是按照教程步骤归类,找起来头疼.
![](/images/2025-11-29 神奇的cocos2d-x/tmpC6C9.png)

发现这样写成纯吐槽了,重开一个帖子来写汇总心得.