如何用Python进行游戏开发 6个热门引擎

文摘   2024-11-08 20:45   上海  

游戏开发是一个充满乐趣和挑战的领域,而Python作为一种易学且功能强大的语言,在游戏开发中也有着广泛的应用。今天,我们就来聊聊如何用Python进行游戏开发,并介绍6个热门的游戏开发引擎。

1. Pygame

简介: Pygame 是一个开源的 Python 模块,专门用于编写视频游戏。它基于 SDL(Simple DirectMedia Layer)库,提供了丰富的功能,如图像处理、声音播放、事件处理等。

安装

pip install pygame

示例代码

import pygame
import sys

# 初始化 Pygame
pygame.init()

# 设置窗口大小
screen = pygame.display.set_mode((800600))

# 设置窗口标题
pygame.display.set_caption("Pygame 示例")

# 游戏主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 填充背景颜色
    screen.fill((000))

    # 绘制一个红色矩形
    pygame.draw.rect(screen, (25500), (100100200150))

    # 更新屏幕
    pygame.display.flip()

# 退出 Pygame
pygame.quit()
sys.exit()

解释

  • pygame.init():初始化 Pygame。
  • pygame.display.set_mode((800, 600)):设置窗口大小为 800x600。
  • pygame.display.set_caption("Pygame 示例"):设置窗口标题。
  • pygame.event.get():获取事件队列中的所有事件。
  • pygame.QUIT:检测是否点击了关闭按钮。
  • screen.fill((0, 0, 0)):填充背景颜色为黑色。
  • pygame.draw.rect(screen, (255, 0, 0), (100, 100, 200, 150)):绘制一个红色矩形。
  • pygame.display.flip():更新屏幕显示。
  • pygame.quit()sys.exit():退出 Pygame 并关闭程序。

2. Panda3D

简介: Panda3D 是一个免费的、开源的 3D 游戏引擎,支持 Python 和 C++ 编程。它提供了强大的 3D 图形渲染、物理模拟和音频处理功能。

安装

pip install panda3d

示例代码

from direct.showbase.ShowBase import ShowBase
from panda3d.core import Point3

class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        # 加载模型
        self.model = self.loader.loadModel("models/environment")
        self.model.reparentTo(self.render)
        self.model.setScale(0.250.250.25)
        self.model.setPos(-8420)

        # 创建一个旋转任务
        self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")

    def spinCameraTask(self, task):
        angleDegrees = task.time * 6.0
        angleRadians = angleDegrees * (3.14159 / 180.0)
        self.camera.setPos(20 * np.sin(angleRadians), -20 * np.cos(angleRadians), 3)
        self.camera.lookAt(Point3(000))
        return task.cont

app = MyApp()
app.run()

解释

  • ShowBase:Panda3D 的基础类,用于创建和管理游戏窗口。
  • self.loader.loadModel("models/environment"):加载 3D 模型。
  • self.model.reparentTo(self.render):将模型添加到场景中。
  • self.model.setScale(0.25, 0.25, 0.25):设置模型的缩放比例。
  • self.model.setPos(-8, 42, 0):设置模型的位置。
  • self.taskMgr.add(self.spinCameraTask, "SpinCameraTask"):添加一个任务,使相机旋转。
  • self.camera.setPos(20 * np.sin(angleRadians), -20 * np.cos(angleRadians), 3):设置相机的位置。
  • self.camera.lookAt(Point3(0, 0, 0)):使相机看向指定点。

3. Pyglet

简介: Pyglet 是一个跨平台的窗口和多媒体库,支持 Python。它可以用来创建窗口、处理用户输入、播放音频和视频等。

安装

pip install pyglet

示例代码

import pyglet

# 创建窗口
window = pyglet.window.Window(width=800, height=600, caption="Pyglet 示例")

# 加载图片
image = pyglet.resource.image('example.png')

@window.event
def on_draw():
    window.clear()
    image.blit(00)

# 运行应用程序
pyglet.app.run()

解释

  • pyglet.window.Window(width=800, height=600, caption="Pyglet 示例"):创建一个 800x600 的窗口。
  • pyglet.resource.image('example.png'):加载图片资源。
  • @window.event:装饰器,用于绑定事件处理函数。
  • on_draw():绘制事件处理函数,清除窗口并绘制图片。
  • pyglet.app.run():启动应用程序。

4. Godot

简介: Godot 是一个免费的、开源的 2D 和 3D 游戏引擎,支持多种脚本语言,包括 Python(通过 GDScript)。虽然 Godot 默认使用 GDScript,但可以通过插件支持 Python。

安装: 下载 Godot 引擎并安装。

示例代码

extends Node2D

func _ready():
print("游戏初始化完成")

func _process(delta):
print("游戏运行中")

解释

  • extends Node2D:继承自 Node2D 类,表示这是一个 2D 节点。
  • _ready():当节点准备好时调用的函数。
  • _process(delta):每帧调用的函数,delta 表示上一帧到当前帧的时间间隔。

5. Arcade

简介: Arcade 是一个现代的 Python 游戏开发库,专注于 2D 游戏。它提供了丰富的功能,如精灵管理、碰撞检测、物理引擎等。

安装

pip install arcade

示例代码

import arcade

# 设置窗口参数
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_TITLE = "Arcade 示例"

class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)

        # 设置背景颜色
        arcade.set_background_color(arcade.color.WHITE)

    def setup(self):
        # 初始化游戏对象
        self.player_sprite = arcade.Sprite("player.png"0.5)
        self.player_sprite.center_x = 100
        self.player_sprite.center_y = 100

    def on_draw(self):
        # 开始绘制
        arcade.start_render()

        # 绘制玩家角色
        self.player_sprite.draw()

    def on_update(self, delta_time):
        # 更新游戏状态
        pass

def main():
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
    game.setup()
    arcade.run()

if __name__ == "__main__":
    main()

解释

  • arcade.Window:创建一个游戏窗口。
  • arcade.set_background_color(arcade.color.WHITE):设置背景颜色为白色。
  • self.player_sprite = arcade.Sprite("player.png", 0.5):加载玩家角色的精灵图,并设置缩放比例。
  • self.player_sprite.center_x = 100self.player_sprite.center_y = 100:设置玩家角色的初始位置。
  • arcade.start_render():开始绘制。
  • self.player_sprite.draw():绘制玩家角色。
  • arcade.run():启动游戏循环。

6. PyOpenGL

简介: PyOpenGL 是 Python 的 OpenGL 绑定库,用于创建高性能的图形应用程序。它允许开发者直接使用 OpenGL API 进行图形渲染。

安装

pip install PyOpenGL PyOpenGL_accelerate

示例代码

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

vertices = (
    (1-1-1),
    (11-1),
    (-11-1),
    (-1-1-1),
    (1-11),
    (111),
    (-1-11),
    (-111)
)

edges = (
    (01),
    (12),
    (23),
    (30),
    (45),
    (56),
    (67),
    (74),
    (04),
    (15),
    (26),
    (37)
)

def draw_cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

def main():
    pygame.init()
    display = (800600)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

    gluPerspective(45, (display[0] / display[1]), 0.150.0)
    glTranslatef(0.00.0-5)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        glRotatef(1311)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        draw_cube()
        pygame.display.flip()
        pygame.time.wait(10)

if __name__ == "__main__":
    main()

解释

  • pygame.init():初始化 Pygame。
  • pygame.display.set_mode(display, DOUBLEBUF | OPENGL):设置窗口模式为双缓冲和 OpenGL。
  • gluPerspective(45, (display[0] / display[1]), 0.1, 50.0):设置透视投影。
  • glTranslatef(0.0, 0.0, -5):将视图平移。
  • glRotatef(1, 3, 1, 1):旋转立方体。
  • glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT):清除颜色和深度缓冲区。
  • draw_cube():绘制立方体。
  • pygame.display.flip():更新屏幕显示。
  • pygame.time.wait(10):等待 10 毫秒。

实战案例:制作一个简单的 2D 射击游戏

需求

  • 玩家可以控制一个飞船,使用键盘移动和射击。
  • 敌人会从屏幕上方随机出现,向下移动。
  • 玩家射击敌人得分,被敌人碰到则游戏结束。

实现

import pygame
import random

# 初始化 Pygame
pygame.init()

# 设置窗口大小
screen = pygame.display.set_mode((800600))
pygame.display.set_caption("2D 射击游戏")

# 颜色定义
WHITE = (255255255)
BLACK = (000)
RED = (25500)
GREEN = (02550)

# 玩家飞船
player_size = 50
player_pos = [350500]
player_speed = 10

# 子弹
bullet_size = 10
bullet_speed = 15
bullets = []

# 敌人
enemy_size = 50
enemy_speed = 5
enemies = []
enemy_count = 5

# 分数
score = 0
font = pygame.font.SysFont("monospace"35)

# 游戏主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                bullet_pos = [player_pos[0] + player_size // 2, player_pos[1]]
                bullets.append(bullet_pos)

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_pos[0] -= player_speed
    if keys[pygame.K_RIGHT]:
        player_pos[0] += player_speed

    # 更新子弹位置
    for bullet in bullets:
        bullet[1] -= bullet_speed
        if bullet[1] < 0:
            bullets.remove(bullet)

    # 生成敌人
    if len(enemies) < enemy_count:
        enemy_pos = [random.randint(0750), 0]
        enemies.append(enemy_pos)

    # 更新敌人位置
    for enemy in enemies:
        enemy[1] += enemy_speed
        if enemy[1] > 600:
            enemies.remove(enemy)

    # 检测碰撞
    for enemy in enemies:
        if (player_pos[0] < enemy[0] < player_pos[0] + player_size and
                player_pos[1] < enemy[1] < player_pos[1] + player_size):
            running = False

        for bullet in bullets:
            if (enemy[0] < bullet[0] < enemy[0] + enemy_size and
                    enemy[1] < bullet[1] < enemy[1] + enemy_size):
                enemies.remove(enemy)
                bullets.remove(bullet)
                score += 1

    # 绘制背景
    screen.fill(BLACK)

    # 绘制玩家
    pygame.draw.rect(screen, GREEN, (player_pos[0], player_pos[1], player_size, player_size))

    # 绘制子弹
    for bullet in bullets:
        pygame.draw.rect(screen, RED, (bullet[0], bullet[1], bullet_size, bullet_size))

    # 绘制敌人
    for enemy in enemies:
        pygame.draw.rect(screen, WHITE, (enemy[0], enemy[1], enemy_size, enemy_size))

    # 显示分数
    score_text = font.render(f"Score: {score}"True, WHITE)
    screen.blit(score_text, (1010))

    # 更新屏幕
    pygame.display.flip()

    # 控制帧率
    pygame.time.Clock().tick(30)

# 退出 Pygame
pygame.quit()

解释

  • player_posplayer_speed:玩家飞船的位置和速度。
  • bullets:存储子弹的位置。
  • enemies:存储敌人的位置。
  • score:玩家得分。
  • keys = pygame.key.get_pressed():获取按键状态。
  • for bullet in bullets::更新子弹位置并检测子弹是否超出屏幕。
  • if len(enemies) < enemy_count::生成新的敌人。
  • for enemy in enemies::更新敌人位置并检测敌人是否超出屏幕。
  • if (player_pos[0] < enemy[0] < player_pos[0] + player_size and player_pos[1] < enemy[1] < player_pos[1] + player_size)::检测玩家与敌人的碰撞。
  • if (enemy[0] < bullet[0] < enemy[0] + enemy_size and enemy[1] < bullet[1] < enemy[1] + enemy_size)::检测子弹与敌人的碰撞。
  • pygame.draw.rect(screen, color, (x, y, width, height)):绘制矩形。
  • pygame.display.flip():更新屏幕显示。
  • pygame.time.Clock().tick(30):控制帧率为 30 FPS。

本文介绍了如何用 Python 进行游戏开发,并详细讲解了 Pygame、Panda3D、Pyglet、Godot、Arcade 和 PyOpenGL 六个热门的游戏开发引擎。

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!

付费合集推荐

Python编程基础

Python办公自动化-Excel

微信公众号批量上传发布系统

文末福利

公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。

精品系统

微信公众号批量上传发布系统

关注我👇,精彩不再错过


手把手PythonAI编程
分享与人工智能和python编程语言相关的笔记和项目经历。
 最新文章