Python游戏编程:用pygame和panda3d制作2D和3D游戏 Python作为一种高级编程语言,拥有着广泛的应用领域。而游戏开发作为其中之一,也有越来越多的人开始尝试使用Python来制作游戏。本文将介绍两种Python游戏开发的工具——pygame和panda3d,并分别介绍如何使用它们来制作2D和3D游戏。 一、pygame pygame是一个Python模块,用于开发多媒体应用程序,其中包括2D游戏。它基于SDL库,支持跨平台开发,并且易于学习和使用。下面将介绍如何在pygame中使用Python来制作一个简单的2D游戏。 1. 安装pygame 在开始之前,需要先安装pygame模块。可以使用pip来进行安装,命令如下: ``` pip install pygame ``` 2. 创建窗口 在pygame中,使用`pygame.display`来创建和管理游戏窗口。代码如下: ```python import pygame pygame.init() # 创建窗口 screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("My Game") # 游戏循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 填充背景颜色 screen.fill((255, 255, 255)) # 更新屏幕 pygame.display.flip() # 退出游戏 pygame.quit() ``` 上面的代码中,我们创建了一个800x600的游戏窗口,并设置了窗口标题为"My Game"。接着进入到游戏循环,当接收到`pygame.QUIT`事件时,跳出循环,结束游戏。在游戏循环中,我们使用`screen.fill()`来填充背景颜色,并使用`pygame.display.flip()`来更新屏幕。 3. 加载图像 在游戏中,我们需要使用很多的图像资源。在pygame中,使用`pygame.image.load()`来加载图像。代码如下: ```python import pygame pygame.init() # 创建窗口 screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("My Game") # 加载图像 player_image = pygame.image.load("player.png") # 游戏循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill((255, 255, 255)) # 绘制图像 screen.blit(player_image, (0, 0)) pygame.display.flip() pygame.quit() ``` 上面的代码中,我们加载了一张名为"player.png"的图像,并使用`screen.blit()`将它绘制到屏幕上。 4. 碰撞检测 在游戏中,碰撞检测是一个非常重要的部分。在pygame中,使用`pygame.sprite.collide_rect()`来进行矩形碰撞检测。代码如下: ```python import pygame pygame.init() # 创建窗口 screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("My Game") # 加载图像 player_image = pygame.image.load("player.png") enemy_image = pygame.image.load("enemy.png") # 创建角色 player_rect = player_image.get_rect() enemy_rect = enemy_image.get_rect() # 设置角色初始位置 player_rect.centerx = 400 player_rect.centery = 300 enemy_rect.centerx = 200 enemy_rect.centery = 200 # 游戏循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill((255, 255, 255)) # 绘制图像 screen.blit(player_image, player_rect) screen.blit(enemy_image, enemy_rect) # 碰撞检测 if pygame.sprite.collide_rect(player_rect, enemy_rect): print("Collision!") pygame.display.flip() pygame.quit() ``` 上面的代码中,我们创建了两个角色,一个是玩家,一个是敌人,并设置它们的初始位置。在游戏循环中,我们使用`pygame.sprite.collide_rect()`进行碰撞检测,如果检测到碰撞,就输出一条信息。 二、panda3d panda3d是一个3D游戏引擎,使用C++编写,但是支持Python作为脚本语言。它有着强大的渲染引擎和物理引擎,并且支持跨平台开发。下面将介绍如何在panda3d中使用Python来制作一个简单的3D游戏。 1. 安装panda3d 在开始之前,需要先安装panda3d引擎。可以在官网上下载并安装,也可以使用pip来进行安装,命令如下: ``` pip install panda3d ``` 2. 创建窗口 在panda3d中,使用`ShowBase`类来创建游戏窗口和渲染环境。代码如下: ```python from direct.showbase.ShowBase import ShowBase class MyGame(ShowBase): def __init__(self): ShowBase.__init__(self) # 窗口标题 self.title = "My Game" # 创建窗口 self.win = self.createWindow() # 设置窗口标题 self.win.setTitle(self.title) # 游戏循环 self.taskMgr.add(self.update, "update") def update(self, task): return task.cont game = MyGame() game.run() ``` 上面的代码中,我们创建了一个名为`MyGame`的类,在类的构造函数中创建了游戏窗口,并设置了窗口标题。在游戏循环中,我们使用`taskMgr.add()`来添加一个任务,名为"update",并且每一帧都会执行`update()`函数。在`update()`函数中,我们只是简单地返回`task.cont`,表示任务继续执行。 3. 加载模型 在panda3d中,使用`loader.loadModel()`来加载模型并将其渲染到场景中。代码如下: ```python from direct.showbase.ShowBase import ShowBase class MyGame(ShowBase): def __init__(self): ShowBase.__init__(self) # 窗口标题 self.title = "My Game" # 创建窗口 self.win = self.createWindow() # 设置窗口标题 self.win.setTitle(self.title) # 加载模型 self.player = self.loader.loadModel("player.egg") # 在场景中显示模型 self.player.reparentTo(self.render) # 设置模型位置和旋转 self.player.setPos(0, 0, 0) self.player.setHpr(0, 0, 0) # 游戏循环 self.taskMgr.add(self.update, "update") def update(self, task): return task.cont game = MyGame() game.run() ``` 上面的代码中,我们加载了一个名为"player.egg"的模型,并使用`reparentTo()`将其显示在场景中。接着设置了模型的位置和旋转。在`update()`函数中,我们还是只是返回了`task.cont`。 4. 添加物理效果 在panda3d中,使用`Bullet`物理引擎来实现物理效果。代码如下: ```python from direct.showbase.ShowBase import ShowBase from panda3d.bullet import BulletWorld, BulletSphereShape, BulletRigidBodyNode class MyGame(ShowBase): def __init__(self): ShowBase.__init__(self) # 窗口标题 self.title = "My Game" # 创建窗口 self.win = self.createWindow() # 设置窗口标题 self.win.setTitle(self.title) # 加载模型 self.player = self.loader.loadModel("player.egg") # 在场景中显示模型 self.player.reparentTo(self.render) # 物理引擎 self.world = BulletWorld() self.world.setGravity((0, 0, -9.81)) # 创建刚体 shape = BulletSphereShape(0.5) body = BulletRigidBodyNode("Player") body.addShape(shape) self.world.attachRigidBody(body) # 设置刚体属性 self.player.setPythonTag("BulletBody", body) body.setPythonTag("PandaNode", self.player) # 设置模型位置和旋转 self.player.setPos(0, 0, 10) self.player.setHpr(0, 0, 0) # 游戏循环 self.taskMgr.add(self.update, "update") def update(self, task): dt = globalClock.getDt() self.world.doPhysics(dt, 10, 1.0/60.0) return task.cont game = MyGame() game.run() ``` 上面的代码中,我们首先引入了`BulletWorld`、`BulletSphereShape`和`BulletRigidBodyNode`类,并创建了一个名为`world`的物理引擎。接着创建了一个刚体,设置了它的物理属性,并使用`setPythonTag()`函数将刚体和模型绑定。在游戏循环中,我们使用`self.world.doPhysics()`来计算物理效果。 总结 本文介绍了两种Python游戏开发的工具——pygame和panda3d,并分别介绍了如何使用它们来制作2D和3D游戏。在pygame中,我们介绍了创建窗口、加载图像和碰撞检测等知识点。在panda3d中,我们介绍了创建窗口、加载模型和添加物理效果等知识点。希望本文能对初学者们有所帮助,让大家更好地掌握Python游戏编程的技能。