本教程将从零开始,带你一步步了解 Cocos2d-iPhone 的核心概念,并创建你的第一个 "Hello, World" 游戏。

目录
- Cocos2d-iPhone 简介
- 什么是 Cocos2d?
- 为什么选择 Cocos2d-iPhone?(优缺点分析)
- 适用场景
- 环境搭建
- 必备工具:Xcode
- 安装 Cocos2d-iPhone (通过官方模板)
- 创建你的第一个 Cocos2d 项目
- 核心概念解析
CCDirector: 导演,一切的总指挥CCScene: 场景,游戏的不同“舞台”CCLayer: 层,用于放置游戏内容的“透明胶片”CCNode: 节点,所有对象的基类CCSprite: 精灵,游戏中的图像元素CCLabelTTF: 文字标签CCMenuItem: 菜单项(按钮)
- 实战:创建你的第一个 Cocos2d 游戏
- Step 1: 启动项目
- Step 2: 添加一个精灵
- Step 3: 让精灵动起来
- Step 4: 添加触摸事件
- Step 5: 添加一个“游戏结束”按钮
- 进阶主题
- 动作系统
- 粒子系统
- 音效和背景音乐
- 物理引擎集成
- 学习资源与社区
- 官方文档
- 书籍
- 社区和博客
Cocos2d-iPhone 简介
什么是 Cocos2d?
Cocos2d 是一个基于 MIT 许可证的开源 2D 游戏框架,它使用 Objective-C 语言编写,专门为 iOS 和 macOS 平台优化,它的设计灵感来源于 Python 的 Cocos2d 框架,核心思想是使用“场景-层-精灵”的层级结构来组织游戏内容。
为什么选择 Cocos2d-iPhone?
-
优点:
- 免费且开源: 无需任何授权费用。
- 成熟稳定: 拥有超过十年的历史,被无数成功游戏验证过。
- 强大的动作系统: 内置了丰富的动画和动作(移动、旋转、缩放、淡入淡出等),让动画制作变得非常简单。
- 事件处理系统: 对触摸、键盘、鼠标等事件有良好的支持。
- 粒子系统: 可以轻松创建火焰、烟雾、雨雪等特效。
- 社区庞大: 拥有大量的教程、示例代码和第三方库。
- 与 Xcode 深度集成: 安装后可以直接在 Xcode 中创建项目,开发体验流畅。
-
缺点:
- 已停止核心开发: Cocos2d-iPhone 的核心团队已经停止了主要版本的开发,转而支持其继任者 Cocos2d-x (C++) 和 Cocos Creator (JavaScript/TypeScript),这意味着它不会再有大的功能更新。
- 仅支持 Objective-C: 对于现代开发者来说,可能更倾向于 Swift。
- 2D 专用: 无法用于 3D 游戏开发。
适用场景
尽管不再是前沿技术,但 Cocos2d-iPhone 仍然非常适合:

- 学习 2D 游戏开发的基础概念。
- 开发对性能要求不高的 2D 游戏,如休闲益智、卡牌、塔防、平台跳跃等。
- 维护或二次开发已有的 Cocos2d-iPhone 项目。
环境搭建
必备工具
你需要一台 Mac 电脑,并安装最新版的 Xcode (可以从 Mac App Store 免费下载)。
安装 Cocos2d-iPhone (推荐官方模板)
这是最简单、最官方的安装方式。
-
下载模板:
- 访问 Cocos2d-iPhone 的 GitHub 发布页面:https://github.com/cocos2d/cocos2d-iphone/releases
- 下载最新的稳定版本(
cocos2d-iphone-3.5.1.tar.gz)。 - 下载后,你会得到一个
.tar.gz文件。
-
安装模板:
(图片来源网络,侵删)- 双击
.tar.gz文件进行解压,你会得到一个名为cocos2d-iphone-3.5.1的文件夹。 - 打开终端,使用
cd命令进入解压后的文件夹。 - 运行安装脚本:
./install-templates.sh -u -f
- 脚本会提示你输入密码(这是你的 Mac 登录密码),输入后按回车即可。
- 安装成功后,你会看到 "Templates installed successfully" 的提示。
- 双击
-
验证安装:
- 打开 Xcode,选择 "Create a new Xcode project"。
- 在模板选择窗口,你应该能在 "iOS" -> "Application" 下看到 "Cocos2d iOS App" 和 "Cocos2d iOS with Box2d" 等模板,这表示安装成功!
创建你的第一个 Cocos2d 项目
- 在 Xcode 中选择 "Create a new Xcode project"。
- 选择 "iOS" -> "Application" -> "Cocos2d iOS App",然后点击 "Next"。
- 填写项目信息:
- Product Name: 给你的项目起个名字,
MyFirstGame。 - Organization Identifier: 通常用你的反向域名,
com.yourname。 - 其他选项保持默认即可。
- Product Name: 给你的项目起个名字,
- 点击 "Next",选择项目保存位置,然后点击 "Create"。
Xcode 会自动为你生成一个包含示例代码的项目,点击运行按钮(一个播放图标),你可以在 iPhone 模拟器或真机上看到一个蓝色背景的窗口,上面有一个旋转的 "Hello World" 文字和一个可以拖动的精灵,恭喜,你的第一个 Cocos2d 项目已经跑起来了!
核心概念解析
理解以下几个核心概念是掌握 Cocos2d 的关键。
CCDirector (导演)
CCDirector 是单例模式,是整个游戏的“大脑”或“导演”,它负责:
- 管理游戏的主循环。
- 控制当前正在运行的
CCScene。 - 设置窗口大小、帧率等全局属性。
- 提供简单的场景切换方法。
你通常通过 [CCDirector sharedDirector] 来获取它的实例。
CCScene (场景)
CCScene 是一个容器,代表游戏中的一个“关卡”、“屏幕”或“状态”,你可以有:
MainScene: 主菜单GameScene: 游戏主界面GameOverScene: 游戏结束界面
一个游戏在任何时候只能有一个 CCScene 处于活动状态。
CCLayer (层)
CCLayer 也是 CCNode 的子类,但它通常作为 CCScene 的子节点,用于放置具体的内容。CCLayer 可以处理事件(如触摸),一个 CCScene 可以包含多个 CCLayer,比如一个背景层、一个游戏逻辑层和一个 UI 层。
CCNode (节点)
CCNode 是 Cocos2d 中所有可视化对象和非可视化对象的基类,它不渲染任何东西,但提供了所有节点共有的属性和方法:
- 位置:
position - 尺寸:
contentSize - 旋转:
rotation - 缩放:
scale - 透明度:
opacity - 子节点管理:
addChild:,removeChild: - 动作运行:
runAction:
CCScene, CCLayer, CCSprite 等都是 CCNode 的子类。
CCSprite (精灵)
CCSprite 是游戏中最重要的视觉元素,通常用于显示角色、道具、背景等图像,你可以通过以下方式创建精灵:
// 从图片文件创建 CCSprite *player = [CCSprite spriteWithFile:@"Player.png"]; // 从纹理图集 创建 (推荐,性能更好) CCSprite *enemy = [CCSprite spriteWithSpriteFrameName:@"Enemy.png"];
CCLabelTTF (文字标签)
CCLabelTTF 用于在屏幕上显示 TrueType 字体文字。
CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello, Cocos2d!" fontName:@"Arial" fontSize:24];
CCMenuItem (菜单项)
CCMenuItem 是一个特殊的 CCNode,用于创建按钮,它可以和 CCMenu 结合使用来创建菜单。
// 创建一个菜单项 CCMenuItem *restartItem = [CCMenuItemFont itemWithString:@"Restart" target:self selector:@selector(restartGame)]; // 创建一个菜单来包含菜单项 CCMenu *menu = [CCMenu menuWithItems:restartItem, nil]; [menu alignItemsVertically]; // 让菜单项垂直对齐
实战:创建一个简单的点击游戏
我们将创建一个游戏:屏幕上有一个精灵,点击它,它会随机移动到另一个位置。
Step 1: 启动项目
- 用 Xcode 打开我们之前创建的
MyFirstGame项目。 - 在左侧的文件导航器中,找到
Classes文件夹,打开HelloWorldScene.h和HelloWorldScene.m,这是默认的场景文件。
Step 2: 添加一个精灵
打开 HelloWorldScene.m 文件,找到 init 方法,这是场景初始化的地方。
-
关闭示例代码,在
init方法的开头,注释掉或删除self.isTouchEnabled = YES;这一行,因为我们稍后会自己添加。 -
添加精灵代码: 在
// init your stuff here这行下面,添加以下代码:// 创建一个精灵 CCSprite *player = [CCSprite spriteWithFile:@"Icon.png"]; // 使用 Xcode 自带的 App Icon 作为示例 player.position = ccp(self.contentSize.width / 2, self.contentSize.height / 2); // 设置位置到屏幕中心 [self addChild:player]; // 将精灵添加到当前层中
-
运行项目,现在你应该看到一个屏幕中心的 App Icon。
Step 3: 让精灵动起来
现在我们想让这个精灵在点击后随机移动。
-
创建一个移动方法: 在
HelloWorldScene.m文件中,init方法后面,添加一个新的方法:- (void)movePlayer { // 1. 获取当前场景的尺寸 CGSize winSize = [[CCDirector sharedDirector] winSize]; // 2. 生成一个随机位置 float x = CCRANDOM_0_1() * winSize.width; float y = CCRANDOM_0_1() * winSize.height; CGPoint randomPosition = ccp(x, y); // 3. 让精灵移动到随机位置 CCSprite *player = (CCSprite *)[self getChildByTag:1]; // 假设我们给精灵设置了 tag CCMoveTo *moveAction = [CCMoveTo actionWithDuration:1.0 position:randomPosition]; [player runAction:moveAction]; } -
给精灵设置 Tag 并调用这个方法: 修改
init方法中添加精灵的代码,给它设置一个 Tag 并调用新方法:// 在 init 方法中 // ... CCSprite *player = [CCSprite spriteWithFile:@"Icon.png"]; player.position = ccp(self.contentSize.width / 2, self.contentSize.height / 2); player.tag = 1; // 设置一个唯一的 tag,方便后续查找 [self addChild:player]; // 初始移动一次 [self movePlayer]; // ...
-
运行项目,精灵应该会移动一次,然后就停住了,我们需要在它停止后再次调用
movePlayer。 -
使用回调: 修改
movePlayer方法,让它在移动完成后再次调用自己:- (void)movePlayer { CGSize winSize = [[CCDirector sharedDirector] winSize]; float x = CCRANDOM_0_1() * winSize.width; float y = CCRANDOM_0_1() * winSize.height; CGPoint randomPosition = ccp(x, y); CCSprite *player = (CCSprite *)[self getChildByTag:1]; CCMoveTo *moveAction = [CCMoveTo actionWithDuration:1.0 position:randomPosition]; // 创建一个回调动作,在 moveAction 完成后执行 CCCallFunc *callFunc = [CCCallFunc actionWithTarget:self selector:@selector(movePlayer)]; // 将两个动作组合成一个序列 CCSequence *sequence = [CCSequence actions:moveAction, callFunc, nil]; [player runAction:sequence]; } -
再次运行,现在精灵会每隔一秒自动移动一次。
Step 4: 添加触摸事件
现在我们改为点击屏幕任意位置,精灵就移动到那里。
-
启用触摸: 回到
init方法,取消注释或添加这一行:self.isTouchEnabled = YES;
-
添加触摸回调方法: 在
HelloWorldScene.m中添加以下两个方法:// 当手指触摸屏幕时调用 - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 获取第一个触摸点 UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:[touch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; // 转换为 Cocos2d 的坐标系 // 获取精灵 CCSprite *player = (CCSprite *)[self getChildByTag:1]; // 让精灵移动到触摸点 CCMoveTo *moveAction = [CCMoveTo actionWithDuration:0.5 position:location]; [player runAction:moveAction]; } -
运行项目,点击屏幕的任何地方,精灵都会平滑地移动到该位置。
Step 5: 添加一个“游戏结束”按钮
我们在屏幕上添加一个按钮,点击后切换到另一个场景。
-
创建一个新场景: 在 Xcode 中,右键
Classes文件夹 ->New File...->Cocos2d->CCLayer Class,命名为GameOverScene。 -
实现 GameOverScene: 打开
GameOverScene.m,在init方法中添加一个按钮和文字:- (id)init { if( (self=[super init])) { // 1. 添加文字 CCLabelTTF *label = [CCLabelTTF labelWithString:@"Game Over" fontName:@"Arial" fontSize:48]; label.position = ccp(self.contentSize.width/2, self.contentSize.height/2); [self addChild:label]; // 2. 添加返回按钮 CCMenuItem *restartItem = [CCMenuItemFont itemWithString:@"Restart" target:self selector:@selector(restartGame)]; CCMenu *menu = [CCMenu menuWithItems:restartItem, nil]; menu.position = ccp(self.contentSize.width/2, self.contentSize.height/2 - 50); [self addChild:menu]; } return self; } - (void)restartGame { // 切换回 HelloWorld 场景 [[CCDirector sharedDirector] replaceScene:[HelloWorldScene scene]]; } -
在 HelloWorldScene 中切换场景: 修改
HelloWorldScene.m中的ccTouchesBegan方法,在精灵移动后,有一定概率切换到 GameOverScene:- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:[touch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; CCSprite *player = (CCSprite *)[self getChildByTag:1]; CCMoveTo *moveAction = [CCMoveTo actionWithDuration:0.5 position:location]; // 有 10% 的概率游戏结束 if (CCRANDOM_0_1() < 0.1) { // 使用 CCTransition 转场效果,让切换更平滑 [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.0 scene:[GameOverScene scene]]]; } else { [player runAction:moveAction]; } } -
运行项目,当你点击屏幕时,精灵会移动,有 10% 的几率,屏幕会淡出,然后显示 "Game Over" 和 "Restart" 按钮,点击 "Restart",又会回到游戏主界面。
进阶主题
- 动作系统: Cocos2d 的动作非常强大,除了
CCMoveTo,CCRotateBy,CCScaleBy,还有CCSequence(序列),CCSpawn(,CCRepeat(重复),CCRepeatForever(无限重复) 等,还可以使用CCCallFunc来执行自定义代码。 - 粒子系统: 使用
CCParticleSystem或其子类(如CCParticleSystemQuad)可以轻松创建炫酷的特效,你可以在 Cocos2d 官方网站下载现成的粒子效果文件(.plist),然后直接加载。 - 音效和背景音乐: 使用
SimpleAudioEngine这个单例类来播放音效和音乐,它非常简单易用。[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"backgroundMusic.mp3"]; [[SimpleAudioEngine sharedEngine] playEffect:@"explosion.wav"];
- 物理引擎集成: Cocos2d-iPhone 可以与 Box2d 或 Chipmunk 物理引擎无缝集成,官方模板就包含了 "Cocos2d iOS with Box2d",你可以直接学习其示例代码,了解如何创建刚体、设置碰撞等。
学习资源与社区
- 官方文档和示例:
- GitHub: https://github.com/cocos2d/cocos2d-iphone (源码和示例)
- 官方网站 (可能已不更新,但仍有价值): http://www.cocos2d-iphone.org/
- 书籍:
《Learn Cocos2d 2: Game Development for iOS》: 这本书是学习 Cocos2d 的经典之作,内容详尽。
- 社区和博客:
- Ray Wenderlich: https://www.raywenderlich.com/ (搜索 Cocos2d,有大量高质量的免费和付费教程)
- Cocos2d 论坛: https://www.cocos2d-iphone.org/forum (虽然不活跃,但历史帖子很有价值)
- Stack Overflow: 搜索标签
cocos2d-iphone。
希望这份教程能帮助你顺利入门 Cocos2d-iPhone 开发!祝你编码愉快!
