Cocos2d-Python 教程
Cocos2d 是一个非常流行的开源游戏引擎,以其简洁的 API、强大的功能和跨平台能力而闻名,它的 Python 版本(Cocos2d-Python)非常适合初学者和快速原型开发。
本教程将涵盖以下内容:
- 什么是 Cocos2d-Python?
- 环境搭建
- 核心概念:场景、层、导演
- 第一个游戏:移动的方块
- 处理用户输入(键盘和鼠标)
- 添加精灵和动画
- 添加音效和背景音乐
- 发布你的游戏
什么是 Cocos2d-Python?
Cocos2d-Python 是 Cocos2d 家族的一个分支,专门为 Python 语言设计,它使用 Pygame 作为其后端渲染器。
主要特点:
- 易于学习:API 设计直观,文档清晰,对新手非常友好。
- 快速开发:内置了许多游戏开发中常用的功能,如场景管理、动作系统、调度器等。
- 跨平台:可以轻松开发在 Windows、macOS 和 Linux 上运行的游戏。
- 2D 专用:专注于 2D 游戏开发,功能精炼而高效。
环境搭建
在开始之前,你需要正确安装 Python 和 Cocos2d-Python。
步骤 1:安装 Python
确保你的系统上安装了 Python,Cocos2d-Python 需要 Python 2.7 或 Python 3.x (推荐 3.6+)。 打开终端或命令提示符,输入:
python --version # 或者在 Python 3 环境下 python3 --version
如果没有安装,请从 Python 官网 下载并安装。
步骤 2:安装 Cocos2d-Python
最简单的方式是使用 pip(Python 的包管理器)。
打开终端或命令提示符,运行以下命令:
pip install cocos2d
如果你同时安装了 Python 2 和 Python 3,可能需要使用 pip3:
pip3 install cocos2d
步骤 3:验证安装
安装完成后,运行以下命令来测试:
python -m cocos2d.main
如果一切顺利,你应该能看到一个窗口弹出来,显示 Cocos2d 的 logo,恭喜你,环境已经搭建好了!
核心概念:场景、层、导演
理解 Cocos2d 的三个核心概念是开发游戏的第一步。
- 导演:
Director是整个游戏的大脑和总指挥,它负责管理游戏的全局状态,比如切换场景、控制游戏暂停/继续、获取窗口尺寸等,你可以把它想象成电影的导演。 - 场景:
Scene是游戏中的一个独立画面或关卡,一个游戏通常由多个场景组成,主菜单场景、游戏场景、游戏结束场景等,导演负责在不同场景之间进行切换。 - 层:
Layer是场景中的一个逻辑层或视觉层,一个场景可以包含多个层,一个游戏场景可以有:GameLayer:包含所有游戏元素(玩家、敌人、子弹)。HUDLayer:包含用户界面(分数、生命值、暂停按钮)。BackgroundLayer:包含背景图。
它们的关系:Scene 是一个容器,里面可以包含多个 Layer。Director 控制当前显示哪个 Scene。
第一个游戏:移动的方块
让我们创建一个最简单的游戏,一个可以用键盘方向键控制的方块。
步骤 1:创建项目文件
创建一个新的文件夹,my_first_game,在里面创建一个 Python 文件,命名为 main.py。
步骤 2:编写代码
打开 main.py,输入以下代码:
# 导入必要的模块
import cocos
from cocos.director import director
from cocos.layer import ColorLayer
from cocos.actions import MoveBy
# 1. 创建一个自定义的层,代表我们的游戏主角
class PlayerLayer(ColorLayer):
def __init__(self):
# 创建一个 50x50 的红色方块
super(PlayerLayer, self).__init__(255, 0, 0, 255, width=50, height=50)
# 将方块的位置设置在屏幕中央
self.position = (director.get_window_size()[0] // 2 - 25,
director.get_window_size()[1] // 2 - 25)
# 初始化移动速度
self.velocity = (0, 0)
# 使用 cocos 的调度器,每一帧都更新位置
self.schedule(self.update)
def update(self, dt):
# dt 是上一帧到当前帧的时间(秒)
# 根据速度更新位置
self.x += self.velocity[0]
self.y += self.velocity[1]
# 边界检测,防止方块移出屏幕
win_width, win_height = director.get_window_size()
sprite_width, sprite_height = self.width, self.height
if self.x < 0:
self.x = 0
elif self.x > win_width - sprite_width:
self.x = win_width - sprite_width
if self.y < 0:
self.y = 0
elif self.y > win_height - sprite_height:
self.y = win_height - sprite_height
# 2. 创建主场景
def main():
# 初始化导演
director.init(width=800, height=600, caption="My First Cocos2d Game")
# 创建一个场景
main_scene = cocos.scene.Scene()
# 创建并添加我们的玩家层到场景中
player_layer = PlayerLayer()
main_scene.add(player_layer)
# 运行场景
director.run(main_scene)
# 3. 设置键盘事件处理
class GameHandler(cocos.layer.Layer):
def __init__(self):
super(GameHandler, self).__init__()
# 启用事件处理
self.is_event_handler = True
# 找到场景中的 PlayerLayer 实例
# 注意:这是一种简单粗暴的获取方式,实际项目中应使用更优雅的方式
self.player = self.get_children()[0]
def on_key_press(self, key, modifiers):
# 当按下方向键时,设置速度
if key == cocos.keyboard.key.RIGHT:
self.player.velocity = (200, 0) # 每秒移动 200 像素
elif key == cocos.keyboard.key.LEFT:
self.player.velocity = (-200, 0)
elif key == cocos.keyboard.key.UP:
self.player.velocity = (0, 200)
elif key == cocos.keyboard.key.DOWN:
self.player.velocity = (0, -200)
def on_key_release(self, key, modifiers):
# 当释放方向键时,停止移动
if key in (cocos.keyboard.key.RIGHT, cocos.keyboard.key.LEFT,
cocos.keyboard.key.UP, cocos.keyboard.key.DOWN):
self.player.velocity = (0, 0)
# 修改 main 函数,将事件处理层也加入场景
def main_updated():
director.init(width=800, height=600, caption="My First Cocos2d Game")
main_scene = cocos.scene.Scene()
player_layer = PlayerLayer()
event_handler_layer = GameHandler()
main_scene.add(player_layer)
main_scene.add(event_handler_layer) # 事件处理层通常放在最上层
director.run(main_scene)
if __name__ == '__main__':
main_updated()
步骤 3:运行游戏
在终端中,进入 my_first_game 文件夹,然后运行:
python main.py
你应该会看到一个 800x600 的窗口,中间有一个红色方块,你可以使用键盘的方向键来控制它移动。
处理用户输入(键盘和鼠标)
上面的例子已经展示了如何处理键盘输入,Cocos2d 使用一个事件分发系统。
-
键盘事件:
on_key_press(self, key, modifiers): 当按键被按下时触发。on_key_release(self, key, modifiers): 当按键被释放时触发。key是一个cocos.keyboard.key对象,cocos.keyboard.key.SPACE。modifiers是修饰键(如SHIFT,CTRL)的状态。
-
鼠标事件:
on_mouse_press(self, x, y, buttons, modifiers): 当鼠标按键按下时触发。on_mouse_release(self, x, y, buttons, modifiers): 当鼠标按键释放时触发。on_mouse_motion(self, x, y, dx, dy, buttons, modifiers): 当鼠标移动时触发。x, y是鼠标在窗口中的坐标。dx, dy是鼠标移动的偏移量。
添加精灵和动画
静态的方块很无聊,让我们用一个角色精灵来替换它,并让它动起来。
步骤 1:准备素材
你需要一个角色精灵图,最好是“精灵表”(Sprite Sheet),即一张包含多个动画帧的图片,一个角色有“站立”、“行走”、“跳跃”等状态。
这里我们用一个简单的行走动画作为例子,假设你有一张名为 walk.png 的图片,它包含了 4 帧行走动画。
步骤 2:修改代码
我们将修改 PlayerLayer 来使用精灵和动画。
import cocos
from cocos.director import director
from cocos.sprite import Sprite
from cocos.actions import Repeat, MoveBy
from pyglet import image
# ... (GameHandler 层保持不变) ...
class PlayerLayer(cocos.layer.Layer):
def __init__(self):
super(PlayerLayer, self).__init__()
# 1. 创建精灵
# 假设你的 walk.png 图片是 128x32,每帧 32x32
# image.load('walk.png') 会加载整个图片
# 我们使用 pyglet 的 image Grid 来分割图片
walk_image = image.load('assets/walk.png') # 请确保 assets 文件夹和图片存在
grid = image.ImageGrid(walk_image, rows=1, columns=4, item_width=32, item_height=32)
# 2. 创建动画
# 使用 grid 的切片来创建动画序列
animation = cocos.animation.Animation(frames=[
cocos.sprite.SpriteFrame(grid[0], anchor=(0,0)),
cocos.sprite.SpriteFrame(grid[1], anchor=(0,0)),
cocos.sprite.SpriteFrame(grid[2], anchor=(0,0)),
cocos.sprite.SpriteFrame(grid[3], anchor=(0,0))
], delay=0.1) # 每帧间隔 0.1 秒
# 3. 创建精灵并播放动画
self.sprite = Sprite(animation)
self.sprite.scale = 2 # 放大两倍,方便查看
self.sprite.position = (director.get_window_size()[0] // 2,
director.get_window_size()[1] // 2)
self.add(self.sprite)
# 4. 添加一个简单的移动动作
move_action = Repeat(MoveBy((200, 0), duration=2))
self.sprite.do(move_action)
# ... (main_updated 函数保持不变) ...
注意:你需要创建一个 assets 文件夹,并把你的 walk.png 图片放进去,你可以从网上搜索 "sprite sheet walk cycle" 找到合适的素材。
添加音效和背景音乐
Cocos2d 使用 pyglet.media 来播放声音。
步骤 1:准备素材
准备一个 .mp3 或 .wav 格式的背景音乐文件(background_music.mp3)和一个音效文件(sound_effect.wav)。
步骤 2:修改代码
在 main_updated 函数中添加加载和播放声音的代码。
import cocos
from cocos.director import director
# ... (其他导入) ...
from pyglet.media import Player as MediaPlayer, load
# ... (PlayerLayer 和 GameHandler 层保持不变) ...
def main_updated():
director.init(width=800, height=600, caption="My First Cocos2d Game")
main_scene = cocos.scene.Scene()
# --- 添加声音 ---
try:
# 加载并播放背景音乐(循环)
bg_music = load('assets/background_music.mp3')
bg_player = MediaPlayer()
bg_player.queue(bg_music)
bg_player.eos_action = MediaPlayer.EOS_LOOP # 设置循环播放
bg_player.play()
# 加载音效
sound_effect = load('assets/sound_effect.wav')
except Exception as e:
print("无法加载声音文件:", e)
bg_player = None
sound_effect = None
player_layer = PlayerLayer()
event_handler_layer = GameHandler()
main_scene.add(player_layer)
main_scene.add(event_handler_layer)
# 修改 GameHandler,让它能在按键时播放音效
class GameHandlerWithSound(GameHandler):
def __init__(self, sound_effect):
super(GameHandlerWithSound, self).__init__()
self.sound_effect = sound_effect
def on_key_press(self, key, modifiers):
super(GameHandlerWithSound, self).on_key_press(key, modifiers)
# 每次按键都播放音效
if self.sound_effect:
# 每次播放前需要重新加载,或者使用 Player
player = MediaPlayer()
player.queue(self.sound_effect)
player.play()
# 用新的处理层替换旧的
main_scene.remove(event_handler_layer)
main_scene.add(GameHandlerWithSound(sound_effect))
director.run(main_scene)
if __name__ == '__main__':
main_updated()
发布你的游戏
当你完成游戏开发后,你可能希望将它打包成一个可执行文件,这样没有安装 Python 的朋友也能运行。py2exe (for Windows) 或 PyInstaller (跨平台) 是常用的工具。
这里以 PyInstaller 为例:
步骤 1:安装 PyInstaller
pip install pyinstaller
步骤 2:创建一个启动脚本
创建一个名为 run_game.py 的文件,内容如下:
# run_game.py
import main_updated # 导入我们之前写的 main_updated 函数
if __name__ == '__main__':
main_updated()
步骤 3:使用 PyInstaller 打包
在终端中,运行以下命令:
pyinstaller --onefile --windowed run_game.py
--onefile:将所有依赖打包成一个单独的.exe文件。--windowed:运行时不显示命令行窗口(适用于图形界面游戏)。
打包过程可能需要几分钟,完成后,你会在 dist 文件夹下找到一个名为 run_game.exe 的文件,双击它就可以直接运行你的游戏了!
总结与进阶
恭喜你,你已经掌握了 Cocos2d-Python 的基本用法!
进阶学习方向:
- UI 系统:学习使用
cocos.gui模块创建按钮、标签、进度条等界面元素。 - 碰撞检测:学习如何检测两个游戏对象(如玩家和子弹)是否发生碰撞,可以使用
AABB(轴对齐边界框) 等简单方法。 - 粒子系统:使用
cocos.particle_system创建火焰、烟雾、魔法特效等。 - TileMap (瓦片地图):学习如何使用
cocos.tiles模块加载和编辑瓦片地图,用于创建 2D 平台游戏或 RPG 的场景。 - 官方文档:查阅 Cocos2d-Python 官方文档,这是最权威的参考资料。
Cocos2d-Python 是一个功能强大且易于上手的引擎,希望这份教程能帮助你开启游戏开发之旅!祝你编码愉快!
