视频

观看视频

入门

pygame

这是我们教程系列“使用 Pygame 进行游戏开发”的第 1 部分。它适用于对游戏开发和提高Python编码技能感兴趣的初学者/中级程序员。

什么是Pygame

Pygame是一个“游戏库” - 一套帮助程序员制作游戏的工具。其中一些内容是:

  • 图形和动画
  • 声音(包括音乐)
  • 控制(键盘、鼠标、游戏手柄等)

游戏循环

每个游戏的核心都是一个循环,我们称之为“游戏循环”。这个循环不断运行,一遍又一遍,做所有使游戏工作需要做的事情。每次游戏经历此循环时,称为帧。

每个帧,可能会发生许多不同的事情,但它们可以组织成三个不同的类别:

1. 处理输入(或事件)

游戏需要响应的任何内容。这些可能是键盘按键,鼠标移动等。

2. 更新游戏

更改框架上需要更改的任何内容。如果一个角色在空中,重力需要把它拉下来。如果两个物体相互碰撞,它们需要爆炸。

3. 渲染(或绘制)

在此步骤中,我们将在屏幕上绘制所有内容。背景、角色、菜单或玩家需要查看的任何其他内容都必须在屏幕上的正确位置绘制。

时钟

循环的另一个重要方面是控制整个循环的运行速度。您可能听说过术语FPS,它代表每秒帧数。这意味着此循环每秒应发生多少次。这很重要,因为您不希望游戏运行得太快或太慢。你也不希望它在不同的计算机上以不同的速度运行 。

构建 Pygame 模板

现在我们知道了使游戏正常工作需要哪些部分,我们可以开始编写一些代码了。首先,我们将制作一个简单的pygame程序,除了打开一个窗口并运行游戏循环之外,什么都不做。对于您想要制作的任何pygame项目来说,这都将是一个很好的起点。

在程序的顶部,我们将导入所需的库,并为游戏选项设置一些变量:

# Pygame 模板 - 游戏框架
import pygame
import random
WIDTH = 360  # 游戏窗口宽度
HEIGHT = 480 # 游戏窗口高度
FPS = 30 # 每秒帧数

接下来我们需要打开游戏窗口:

# 初始化pygame,创建窗口
pygame.init()
pygame.mixer.init()  # for sound
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()

pygame.init()是启动pygame并“初始化”。 将以screen建立游戏屏幕。最后,我们创建了一个能够确保游戏以我们想要的FPS运行的 clock

接下来是游戏循环了:

# 游戏循环
running = True
while running:
    # Process input (events)
    # Update
    # Render (draw)

这是我们的游戏循环,它是一个由变量控制的循环。如果我们想让游戏结束,只需要设置running = False就会结束循环。现在我们可以用一些基本代码填充每个部分。

渲染/绘制部分

我们将从*“绘制*”部分开始。我们还没有任何代码,但我们可以用纯色填充屏幕。为此,我们需要讨论计算机如何处理颜色。

计算机屏幕由像素组成,这些像素有 3 个部分:红色、绿色和蓝色。每个部分被点亮的程度决定了该像素是什么颜色,如下所示:

三种原色中的每一种都可以具有介于 0(关闭)和 255(100% 打开)之间的值,因此三种原色中的每一种都有 256 种不同的可能性。以下是您可以制作的一些颜色的一些示例:

您可以通过乘法找到计算机可以显示的颜色总数:

>>> 256 * 256 * 256 = 16,777,216

现在我们已经了解了颜色,让我们在程序的顶部定义一些:

# Colors (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

然后我们可以用黑色填充屏幕。

    # 绘制、渲染
    screen.fill(BLACK)

对于计算机显示的工作方式,这还不够。更改屏幕上的像素意味着让显卡告诉监视器更改实际像素。在计算机方面,这是一个非常非常缓慢的过程。因此,如果您在屏幕上要绘制很多东西,则可能需要很长时间才能全部绘制出来。我们可以通过使用称为双缓冲的东西以一种聪明的方式解决这个问题。这听起来很花哨,但它实际上只是意味着:

想象一下,我们有一个双面白板,可以翻转以显示一面或另一面。正面将是显示器(玩家看到的屏幕),而背面是隐藏的,只有计算机才能“看到”它。每一帧,我们所有的绘画都在背面。然后,当我们完成后,我们将板翻转过来并显示新框架。这意味着我们只做一个缓慢的过程,每帧与显示器交谈一次,而不是屏幕上的每一件事都这样做。

所有这些都在pygame中自动发生。你只需要告诉它当你完成绘图时翻转白板。实际上,该命令甚至被命名为:flip()

    # 绘制、渲染
    screen.fill(BLACK)
    # 绘制所有的事情后翻转显示
    pygame.display.flip()

如果你在flip()翻转后尝试画一些东西,它们不会显示在屏幕上!

输入/事件部分

我们还没有游戏,所以我们不能准确说出想要监听的键盘或鼠标按钮或其他控制事件。

如果您现在尝试运行该程序,您会发现自己遇到了问题:无法关闭窗口!单击角落中的“X”不起作用。那是因为这是一个事件,我们需要告诉我们的程序监听该事件并让它退出游戏。

事件可能随时发生。如果玩家在更新或绘制循环部分时单击“跳转”按钮,该怎么办?不要忽略这个输入, 玩家会感到沮丧。因此,Pygame所做的就是保存自上一帧以来发生的所有事件。这样,即使玩家快速捣碎许多按键,也能记录下来所有这些按钮。所有事件存放在一个列表,因此我们运行一个for循环来查看所有事件:

    for event in pygame.event.get():
        # 检查屏幕关闭事件
        if event.type == pygame.QUIT:
            running = False

Pygame有很多事件。 pygame.QUIT是单击“X”时发生的事件,因此我们设置running=False,游戏循环将结束。

控制屏幕刷新频率

我们还没有在“更新”部分中放入任何内容,但我们仍然需要使用FPS的设置来控制速度。我们可以这样做:

while running:
    # 保证以正常的速率循环
    clock.tick(FPS)

'tick()'命令告诉 pygame 每次循环需要多长时间,然后暂停多长时间,以使整个循环(即整个帧)持续正确的时间。如果我们设置FPS为 30,则意味着我们希望帧持续 1 30 \frac{1}{30} 301​ 或 0.03 秒。例如,如果我们的循环代码(更新,绘制等)只需要0.01秒,那么pygame将等待0.02秒。

结束语

最后,让我们确保当游戏循环结束时,我们实际上会破坏游戏窗口。通过将pygame.quit()放在代码的最后来做到这一点。所以我们的最终pygame模板看起来像这样:

# Pygame template - skeleton for a new pygame project
import pygame
import random
WIDTH = 360
HEIGHT = 480
FPS = 30
# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
# initialize pygame and create window
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
# Game loop
running = True
while running:
    # keep loop running at the right speed
    clock.tick(FPS)
    # Process input (events)
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False
    # Update
    # Draw / render
    screen.fill(BLACK)
    # *after* drawing everything, flip the display
    pygame.display.flip()
pygame.quit()

祝贺!你有一个有效的Pygame模板。用一个pygame template.py名字保存这个文件,这样你就可以在每次开始一个新的Pygame项目时重复使用它。

本部分代码

import pygame
import random
# WIDTH, HEIGHT = 360, 480
# WIDTH, HEIGHT = (360, 480)
# WIDTH = 360
# HEIGHT = 480
# SCREEN_SIZE = (WIDTH, HEIGHT)
SCREEN_SIZE = WIDTH, HEIGHT = 360, 480
FPS = 30
# Colors (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("my game")
clock = pygame.time.Clock()
running = True
while running:
    clock.tick(FPS)
    # 1. 事件
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            running = False
    # 2. 更新组件状态
    # 3. 绘制图像
    screen.fill(BLACK)
    pygame.display.flip()

在下一教程中,我们将使用此模板作为学习如何在屏幕上绘制对象并使其移动。

到此这篇关于Pygame游戏开发之太空射击实战入门篇的文章就介绍到这了,更多相关Pygame太空射击内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Pygame游戏开发之太空射击实战入门篇的更多相关文章

  1. ios – Marmalade SDK是否与游戏开发更相关或更常用?

    我是移动应用程序开发的新手,并且正在寻找一个适合的平台.我遇到了一个项目,人们希望将交换机和家庭自动化公司的自助广告实施到移动应用程序中.他们最初想要一个iPhone应用程序,但也希望随后在Android和其他平台上部署.一个类似的应用程序是这one.在投入大量时间研究各种SDK和开发人员计划之后,Marmalade通过它的多平台部署功能引起了我的注意.然而,在经历了一些教程之后,我发现these

  2. Swift游戏开发案例实战——互动出版网

    通过完整的过程,帮助读者更好的掌握开发过程内容简介本书是国内第一本Swift游戏开发图书。本书由浅入深、全面、系统地讲解了Swift游戏开发的基础知识和各项关键技术,其中重点介绍了5个游戏项目案例的开发,供读者实战演练。本书涉及面广,从基本的操作到游戏开发的关键技术,再到游戏项目案例实战,几乎涉及SwiftiOS游戏开发的各方面的重要知识。出版了《Swift入门很简单》和《Swift游戏开发案例实战》等图书。

  3. unity3d – Android游戏开发使用统一3D教程

    我是团结3D的新手.我打算用Unity3D开发一个安卓游戏,我已经在网上搜索了Unity3D中的android相关教程,但是找不到一个好的开发人员教我一个应用程序启动,所以大家请建议我一个网站我可以启动.我需要android教程,而不是独立的平台教程.提前致谢.解决方法你可以使用Google或Unity3Dofficialdocumentation.

  4. Python Pygame实战之趣味篮球游戏的实现

    这篇文章主要为大家分享了一个基于Python和Pygame实现的一个趣味篮球游戏,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下

  5. Python pygame 项目实战事件监听

    这篇文章主要介绍了Python pygame 项目实战事件监听,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  6. Python+Pygame实战之疯狂吃水果游戏的实现

    吃豆人和切水果这两个游戏相信大家都不陌生吧,本文将利用Python中的Pygame模块编写出一款结合吃豆人+切水果的新游戏:疯狂吃水果,感兴趣的可以了解一下

  7. Pygame游戏开发之太空射击实战子弹与碰撞处理篇

    相信大多数8090后都玩过太空射击游戏,在过去游戏不多的年代太空射击自然属于经典好玩的一款了,今天我们来自己动手实现它,在编写学习中回顾过往展望未来,下面开始讲解子弹与碰撞处理,在本课中,我们将添加玩家与敌人之间的碰撞,以及添加供玩家射击的子弹

  8. pygame学习笔记之设置字体及显示中文

    游戏界面中文字也是非常常见的元素之一,pygame专门提供了Font模块来支持文字的显示,下面这篇文章主要给大家介绍了关于pygame学习笔记之设置字体及显示中文的相关资料,需要的朋友可以参考下

  9. Python+Pygame实现代码雨动画效果

    这篇文章主要为大家详细介绍了python中的一个小项目:利用pygame实现代码雨动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下

  10. Python pygame绘制游戏图像

    这篇文章主要介绍了Python pygame绘制游戏图像,文章围绕主题展开pygame模块完成飞机大战游戏的实战开发的案例详情,需要的朋友可以参考一下

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部