如何构建您的第一个 Python 游戏:使用 PyGame 创建简单射击游戏的分步指南
来源:dev.to
时间:2024-09-23 15:45:56 223浏览 收藏
你在学习文章相关的知识吗?本文《如何构建您的第一个 Python 游戏:使用 PyGame 创建简单射击游戏的分步指南》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
亲爱的读者们大家好,
你有没有想过创建自己的视频游戏?也许您已经考虑过构建一款简单的射击游戏,您可以在其中四处移动、躲避来袭的敌人并攻击目标。好吧,今天是你的幸运日!我们将深入了解 pygame 的奇妙世界,这是一个出色的 python 库,即使您只涉足 python 和基本的控制台应用程序,它也可以使游戏开发变得简单且有趣。
如果您已经了解 python 的基础知识(例如变量、循环、条件和函数),那么您就处于开始构建自己的游戏的最佳位置。如果您以前从未使用过 pygame,请不要担心;在这篇文章结束时,您将拥有一个基本但实用的游戏可以展示。那么让我们开始吧!
为什么选择 pygame?
在我们开始编写代码之前,让我们花点时间讨论一下为什么 pygame 是构建游戏的绝佳工具,特别是如果您是初学者。 pygame 是一个 2d 桌面游戏库,它是:
- 易于学习:pygame 简单明了且适合初学者。它抽象了游戏开发的许多复杂部分,让您专注于构建游戏。
- 跨平台:使用 pygame 制作的游戏可以在 windows、mac 和 linux 上运行,无需更改代码。
- 活跃:有一个庞大且乐于助人的使用 pygame 的开发者社区。您可以找到大量教程、示例和论坛,您可以在其中提出问题并分享您的项目。
设置您的环境
在我们开始编码之前,您需要在计算机上安装 python。如果您还没有,请访问 python.org 并下载最新版本。正确设置 python 非常重要,因为它是 pygame 运行的基础。
接下来,您需要安装 pygame。这个库提供了创建游戏所需的工具,例如管理窗口、绘制形状和处理用户输入。安装 pygame 很简单 - 只需打开终端(如果使用 windows,则打开命令提示符)并输入:
pip install pygame
完成后,您就可以开始创建游戏了!
第 1 步:设置游戏窗口
我们需要做的第一件事是创建一个运行游戏的窗口。此窗口是所有操作发生的地方,因此请将其视为游戏的舞台。让我们编写代码来进行设置。
import pygame import sys # initialize pygame pygame.init() # set up the game window screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("simple shooter game") # set the frame rate clock = pygame.time.clock() # main game loop while true: for event in pygame.event.get(): if event.type == pygame.quit: pygame.quit() sys.exit() # fill the screen with a color (black in this case) screen.fill((0, 0, 0)) # update the display pygame.display.flip() # cap the frame rate at 60 frames per second clock.tick(60)
让我们分解一下:
导入库:我们首先导入 pygame 和 sys.libraries。 pygame 库是我们用来创建游戏的库,而 sys 则帮助我们在需要时干净地退出程序。
初始化 pygame:pygame.init() 行至关重要——它设置了 pygame 需要运行的所有模块。您应该始终在 pygame 项目开始时调用它。
创建游戏窗口:我们使用 pygame.display.set_mode() 创建一个宽度为 800 像素、高度为 600 像素的窗口。这是我们游戏中所有内容都将显示的地方。 pygame.display.set_caption() 函数让我们将窗口的标题设置为有意义的内容,例如“简单射击游戏”。
设置帧速率:clock = pygame.time.clock() 行创建一个时钟对象,帮助我们控制游戏运行的速度。通过将帧率设置为每秒60帧,我们保证游戏运行流畅。
主游戏循环: while true 循环是我们游戏的核心。它持续运行,使我们能够更新游戏并检查关闭窗口等事件。在这个循环中:
* 事件处理:我们使用 pygame.event.get() 来检查玩家是否想要退出游戏。如果他们这样做,我们调用 pygame.quit() 进行清理,并调用 sys.exit() 退出程序。
* 绘制背景: screen.fill((0, 0, 0)) 行用黑色填充屏幕,本质上是为下一帧清除它。
* 更新显示:最后,pygame.display.flip() 更新窗口以显示我们绘制的内容。
当您运行此代码时,您应该看到一个纯黑色的窗口。恭喜!您刚刚建立了游戏的基础。
第 2 步:添加播放器
现在我们有了一个游戏窗口,让我们添加一些更有趣的东西——玩家角色。为简单起见,我们将玩家表示为一个可以左右移动的矩形。敌人也将被表示为矩形,保持简单并专注于游戏逻辑而不是复杂的图形
# player settings player_width = 50 player_height = 60 player_x = screen_width // 2 - player_width // 2 player_y = screen_height - player_height - 10 player_speed = 5 # main game loop while true: for event in pygame.event.get(): if event.type == pygame.quit: pygame.quit() sys.exit() # handle player movement keys = pygame.key.get_pressed() if keys[pygame.k_left] and player_x > 0: player_x -= player_speed if keys[pygame.k_right] and player_x < screen_width - player_width: player_x += player_speed # fill the screen with black screen.fill((0, 0, 0)) # draw the player pygame.draw.rect(screen, (0, 128, 255), (player_x, player_y, player_width, player_height)) # update the display pygame.display.flip() # cap the frame rate at 60 fps clock.tick(60)
事情是这样的:
玩家设置:我们定义玩家的大小(player_width和player_height)、起始位置(player_x和player_y)和速度(player_speed)。计算起始位置,以便玩家在窗口底部附近水平居中显示。
处理玩家移动:在主游戏循环中,我们使用 pygame.key.get_pressed() 检查按下了哪些键。此函数返回键盘上所有键的列表,其中当前按下的键为 true 值。如果按下左箭头键,并且玩家不在屏幕边缘,我们通过从player_x中减去player_speed来将玩家向左移动。同样,如果按下右箭头键,我们会将玩家移动到右侧。
绘制玩家: pygame.draw.rect() 函数在屏幕上绘制一个矩形(我们的玩家)。参数是要绘制的屏幕、矩形的颜色(在本例中为蓝色阴影)以及矩形的位置和大小。
当您运行此代码时,您将看到一个蓝色矩形,您可以使用箭头键左右移动。这个矩形是我们的玩家,它将成为我们游戏的英雄。
第三步:射击子弹
没有射击的射击游戏算什么?让我们添加发射子弹的能力。每次玩家按下空格键时,我们都会创建一颗子弹。
# bullet settings bullet_width = 5 bullet_height = 10 bullet_speed = 7 bullets = [] # main game loop while true: for event in pygame.event.get(): if event.type == pygame.quit: pygame.quit() sys.exit() if event.type == pygame.keydown: if event.key == pygame.k_space: # create a bullet at the current player position bullet_x = player_x + player_width // 2 - bullet_width // 2 bullet_y = player_y bullets.append(pygame.rect(bullet_x, bullet_y, bullet_width, bullet_height)) # handle player movement keys = pygame.key.get_pressed() if keys[pygame.k_left] and player_x > 0: player_x -= player_speed if keys[pygame.k_right] and player_x < screen_width - player_width: player_x += player_speed # update bullet positions for bullet in bullets: bullet.y -= bullet_speed # remove bullets that are off the screen bullets = [bullet for bullet in bullets if bullet.y > 0] # fill the screen with black screen.fill((0, 0, 0)) # draw the player pygame.draw.rect(screen, (0, 128, 255), (player_x, player_y, player_width, player_height)) # draw the bullets for bullet in bullets: pygame.draw.rect(screen, (255, 255, 255), bullet) # update the display pygame.display.flip() # cap the frame rate at 60 fps clock.tick(60)
让我们分解一下:
项目符号设置:我们定义项目符号的大小(bullet_width 和bullet_height)、速度(bullet_speed)和一个列表(项目符号)来跟踪所有活动的项目符号。
发射子弹:在主循环内,我们检查 keydown 事件,该事件在按下任意键时发生。如果按下空格键(pygame.k_space),我们会在玩家当前位置创建一个新子弹。子弹的 x 位置计算为与玩家水平居中,然后将子弹添加到子弹列表中。
更新项目符号位置:项目符号列表中的每个项目符号通过从其 y 位置减去bullet_speed 来向上移动。从屏幕顶部移出的项目符号将从列表中删除以节省内存。
绘制子弹:我们循环遍历子弹列表并使用 pygame.draw.rect() 在屏幕上绘制每个子弹。
现在,当你运行游戏时,按空格键将从玩家的位置发射白色子弹。子弹向上移动,就像您在射击游戏中所期望的那样。
第四步:添加敌人
让我们通过添加玩家需要射击的敌人来使游戏更具挑战性。我们将首先创建一些沿着屏幕向玩家移动的敌人。再次强调,为了简单起见,我们将敌人表示为红色矩形。
import random # enemy settings enemy_width = 50 enemy_height = 60 enemy_speed = 2 enemies = [] # spawn an enemy every 2 seconds enemy_timer = 0 enemy_spawn_time = 2000 # main game loop while true: for event in pygame.event.get(): if event.type == pygame.quit: pygame.quit() sys.exit() if event.type == pygame.keydown: if event.key == pygame.k_space: bullet_x = player_x + player_width // 2 - bullet_width // 2 bullet_y = player_y bullets.append(pygame.rect(bullet_x, bullet_y, bullet_width, bullet_height)) # handle player movement keys = pygame.key.get_pressed() if keys[pygame.k_left] and player_x > 0: player_x -= player_speed if keys[pygame.k_right] and player_x < screen_width - player_width: player_x += player_speed # update bullet positions for bullet in bullets: bullet.y -= bullet_speed bullets = [bullet for bullet in bullets if bullet.y > 0] # update enemy positions and spawn new ones current_time = pygame.time.get_ticks() if current_time - enemy_timer > enemy_spawn_time: enemy_x = random.randint(0, screen_width - enemy_width) enemy_y = -enemy_height enemies.append(pygame.rect(enemy_x, enemy_y, enemy_width, enemy_height)) enemy_timer = current_time for enemy in enemies: enemy.y += enemy_speed # remove enemies that are off the screen enemies = [enemy for enemy in enemies if enemy.y < screen_height] # fill the screen with black screen.fill((0, 0, 0)) # draw the player pygame.draw.rect(screen, (0, 128, 255), (player_x, player_y, player_width, player_height)) # draw the bullets for bullet in bullets: pygame.draw.rect(screen, (255, 255, 255), bullet) # draw the enemies for enemy in enemies: pygame.draw.rect(screen, (255, 0, 0), enemy) # update the display pygame.display.flip() # cap the frame rate at 60 fps clock.tick(60)
以下是我们添加敌人的方法:
敌人设置:我们定义大小(enemy_width和enemy_height)、速度(enemy_speed)和列表(敌人)来跟踪所有活动的敌人。
生成敌人:我们使用计时器每 2 秒生成一个新敌人。当前时间通过 pygame.time.get_ticks() 进行跟踪。如果自最后一个敌人生成以来已经过去了足够的时间,我们会在屏幕上方的随机水平位置创建一个新的敌人(因此它向下移动)。然后,该敌人将被添加到敌人列表中。
更新敌人位置:敌人列表中的每个敌人都会通过将敌人速度添加到其 y 位置来向下移动。如果敌人移出屏幕底部,它就会从列表中删除。
绘制敌人:我们循环遍历敌人列表并使用 pygame.draw.rect() 在屏幕上绘制每个敌人。
当您运行此代码时,您会看到红色矩形(我们的敌人)从屏幕顶部掉落。游戏已经初具规模!
第 5 步:检测碰撞
现在,让我们添加一些逻辑,以便当子弹击中敌人时,子弹和敌人都会消失。这涉及检测子弹和敌人之间的碰撞。
# collision detection function def check_collision(rect1, rect2): return rect1.colliderect(rect2) # main game loop while true: for event in pygame.event.get(): if event.type == pygame.quit: pygame.quit() sys.exit() if event.type == pygame.keydown: if event.key == pygame.k_space: bullet_x = player_x + player_width // 2 - bullet_width // 2 bullet_y = player_y bullets.append(pygame.rect(bullet_x, bullet_y, bullet_width, bullet_height)) # handle player movement keys = pygame.key.get_pressed() if keys[pygame.k_left] and player_x > 0: player_x -= player_speed if keys[pygame.k_right] and player_x < screen_width - player_width: player_x += player_speed # update bullet positions for bullet in bullets: bullet.y -= bullet_speed bullets = [bullet for bullet in bullets if bullet.y > 0] # update enemy positions and spawn new ones current_time = pygame.time.get_ticks() if current_time - enemy_timer > enemy_spawn_time: enemy_x = random.randint(0, screen_width - enemy_width) enemy_y = -enemy_height enemies.append(pygame.rect(enemy_x, enemy_y, enemy_width, enemy_height)) enemy_timer = current_time for enemy in enemies: enemy.y += enemy_speed # check for collisions for bullet in bullets[:]: for enemy in enemies[:]: if check_collision(bullet, enemy): bullets.remove(bullet) enemies.remove(enemy) break # remove enemies that are off the screen enemies = [enemy for enemy in enemies if enemy.y < screen_height] # fill the screen with black screen.fill((0, 0, 0)) # draw the player pygame.draw.rect(screen, (0, 128, 255), (player_x, player_y, player_width, player_height)) # draw the bullets for bullet in bullets: pygame.draw.rect(screen, (255, 255, 255), bullet) # draw the enemies for enemy in enemies: pygame.draw.rect(screen, (255, 0, 0), enemy) # update the display pygame.display.flip() # cap the frame rate at 60 fps clock.tick(60)
这就是我们所做的:
碰撞检测:我们定义了一个函数 check_collision,它获取两个矩形的位置和大小,并使用 colliderect() 检查它们是否重叠。这就是我们检测子弹是否击中敌人的方法。
移除碰撞对象:在主循环内,更新子弹和敌人的位置后,我们检查是否有子弹与任何敌人发生碰撞。如果有,子弹和敌人都会从各自的列表中删除。
现在,当你运行游戏时,击中敌人的子弹将使敌人消失。您已经创建了一款基本但功能齐全的射击游戏!
重要提示:在这个简单的游戏中,与敌人碰撞不会受到惩罚。玩家可以穿过敌人而不会受到伤害或输掉游戏。这使事情变得简单,但可能是您想要在更高级的版本中更改的内容。
把它们放在一起
如果您需要,这里是我们写的所有内容:
import pygame import sys import random # Initialize PyGame pygame.init() # Set up the game window screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("Simple Shooter Game") # Set the frame rate clock = pygame.time.Clock() # Player settings player_width = 50 player_height = 60 player_x = screen_width // 2 - player_width // 2 player_y = screen_height - player_height - 10 player_speed = 5 # Bullet settings bullet_width = 5 bullet_height = 10 bullet_speed = 7 bullets = [] # Enemy settings enemy_width = 50 enemy_height = 60 enemy_speed = 2 enemies = [] # Spawn an enemy every 2 seconds enemy_timer = 0 enemy_spawn_time = 2000 # Collision detection function def check_collision(rect1, rect2): return pygame.Rect(rect1).colliderect(pygame.Rect(rect2)) # Main game loop while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: # Create a bullet at the current player position bullet_x = player_x + player_width // 2 - bullet_width // 2 bullet_y = player_y bullets.append([bullet_x, bullet_y]) # Handle player movement keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and player_x > 0: player_x -= player_speed if keys[pygame.K_RIGHT] and player_x < screen_width - player_width: player_x += player_speed # Update bullet positions for bullet in bullets: bullet[1] -= bullet_speed bullets = [bullet for bullet in bullets if bullet[1] > 0] # Update enemy positions and spawn new ones current_time = pygame.time.get_ticks() if current_time - enemy_timer > enemy_spawn_time: enemy_x = random.randint(0, screen_width - enemy_width) enemy_y = -enemy_height enemies.append([enemy_x, enemy_y]) enemy_timer = current_time for enemy in enemies: enemy[1] += enemy_speed # Check for collisions for bullet in bullets[:]: for enemy in enemies[:]: if check_collision((bullet[0], bullet[1], bullet_width, bullet_height), (enemy[0], enemy[1], enemy_width, enemy_height)): bullets.remove(bullet) enemies.remove(enemy) break # Remove enemies that are off the screen enemies = [enemy for enemy in enemies if enemy[1] < screen_height] # Fill the screen with black screen.fill((0, 0, 0)) # Draw the player pygame.draw.rect(screen, (0, 128, 255), (player_x, player_y, player_width, player_height)) # Draw the bullets for bullet in bullets: pygame.draw.rect(screen, (255, 255, 255), (bullet[0], bullet[1], bullet_width, bullet_height)) # Draw the enemies for enemy in enemies: pygame.draw.rect(screen, (255, 0, 0), (enemy[0], enemy[1], enemy_width, enemy_height)) # Update the display pygame.display.flip() # Cap the frame rate at 60 FPS clock.tick(60)
接下来是什么?
恭喜,您刚刚使用 pygame 构建了第一个简单的射击游戏!但这只是开始——您还有很多事情可以做:
- 添加评分系统:跟踪玩家消灭了多少敌人并在屏幕上显示分数。
- 创造不同的敌人类型:让敌人以不同的方式移动、反击或多次击中来消灭。
- 增强图形:用玩家、子弹和敌人的图像替换矩形。
- 添加音效:通过添加射击、击中敌人和其他动作的声音,让游戏更加身临其境。
- 引入关卡:添加不同关卡或一波敌人,以随着玩家的进步而增加难度。
- 添加玩家生命值和伤害:允许玩家在与敌人碰撞时受到伤害,如果生命值为零,则输掉游戏。
pygame 非常灵活,因此请尽情发挥您的想象力并不断进行实验。您使用代码的次数越多,您学到的就越多,您的游戏就会变得越好。
这是一个包裹!
就是这样!只需几个步骤,您就可以从一个空窗口变成一个正常运行的射击游戏。无论您是计划扩展该项目还是转向新的事物,您都在游戏开发之旅中迈出了一大步。请随时分享您的进展或提出问题——我随时为您提供帮助!
您有任何问题或意见吗?请务必将它们留在这里或在大多数社交媒体平台上通过@lovelacecoding 与我联系。感谢您一起编码!
今天关于《如何构建您的第一个 Python 游戏:使用 PyGame 创建简单射击游戏的分步指南》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
282 收藏
-
212 收藏
-
276 收藏
-
150 收藏
-
456 收藏
-
288 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习