您现在的位置是:亿华云 > 数据库
如何在你的Python游戏中添加一个玩家
亿华云2025-10-09 03:31:13【数据库】2人已围观
简介这是用 Python 从头开始构建游戏的系列文章的第三部分。在 这个系列的***篇文章 中,我解释了如何使用 Python 创建一个简单的基于文本的骰子游戏。在第二部分中,我向你们展示了如何从头开始构
这是游戏用 Python 从头开始构建游戏的系列文章的第三部分。
在 这个系列的中添***篇文章 中,我解释了如何使用 Python 创建一个简单的游戏基于文本的骰子游戏。在第二部分中,中添我向你们展示了如何从头开始构建游戏,游戏即从 创建游戏的中添环境 开始。但是游戏每个游戏都需要一名玩家,并且每个玩家都需要一个可操控的中添角色,这也就是游戏我们接下来要在这个系列的第三部分中需要做的。
在 Pygame 中,中添玩家操控的游戏图标或者化身被称作妖精sprite。如果你现在还没有任何可用于玩家妖精的中添图像,你可以使用 Krita 或 Inkscape 来自己创建一些图像。游戏如果你对自己的中添艺术细胞缺乏自信,你也可以在 OpenClipArt.org 或 OpenGameArt.org 搜索一些现成的游戏图像。如果你还未按照上一篇文章所说的单***建一个 images 文件夹,那么你需要在你的云服务器 Python 项目目录中创建它。将你想要在游戏中使用的图片都放 images 文件夹中。
为了使你的游戏真正的刺激,你应该为你的英雄使用一张动态的妖精图片。这意味着你需要绘制更多的素材,并且它们要大不相同。最常见的动画就是走路循环,通过一系列的图像让你的妖精看起来像是在走路。走路循环最快捷粗糙的版本需要四张图像。
注意:这篇文章中的代码示例同时兼容静止的和动态的玩家妖精。
将你的玩家妖精命名为 hero.png。如果你正在创建一个动态的妖精,则需要在名字后面加上一个数字,从 hero1.png 开始。
创建一个 Python 类
在 Python 中,当你在创建一个你想要显示在屏幕上的源码下载对象时,你需要创建一个类。
在你的 Python 脚本靠近顶端的位置,加入如下代码来创建一个玩家。在以下的代码示例中,前三行已经在你正在处理的 Python 脚本中:
import pygameimport sysimport os # 以下是新代码class Player(pygame.sprite.Sprite): 生成一个玩家 def __init__(self): pygame.sprite.Sprite.__init__(self) self.images = [] img = pygame.image.load(os.path.join(images,hero.png)).convert() self.images.append(img) self.image = self.images[0] self.rect = self.image.get_rect()如果你的可操控角色拥有一个走路循环,在 images 文件夹中将对应图片保存为 hero1.png 到 hero4.png 的独立文件。
使用一个循环来告诉 Python 遍历每个文件。
对象class Player(pygame.sprite.Sprite): 生成一个玩家 def __init__(self): pygame.sprite.Sprite.__init__(self) self.images = [] for i in range(1,5): img = pygame.image.load(os.path.join(images,hero + str(i) + .png)).convert() self.images.append(img) self.image = self.images[0] self.rect = self.image.get_rect()将玩家带入游戏世界
现在已经创建好了一个 Player 类,你需要使用它在你的游戏世界中生成一个玩家妖精。如果你不调用 Player 类,那它永远不会起作用,(游戏世界中)也就不会有玩家。你可以通过立马运行你的游戏来验证一下。游戏会像上一篇文章末尾看到的那样运行,并得到明确的结果:一个空荡荡的游戏世界。
为了将一个玩家妖精带到你的游戏世界,你必须通过调用 Player 类来生成一个妖精,并将它加入到 Pygame 的妖精组中。高防服务器在如下的代码示例中,前三行是已经存在的代码,你需要在其后添加代码:
world = pygame.display.set_mode([worldx,worldy])backdrop = pygame.image.load(os.path.join(images,stage.png)).convert()backdropbox = screen.get_rect()# 以下是新代码player = Player() # 生成玩家player.rect.x = 0 # 移动 x 坐标player.rect.y = 0 # 移动 y 坐标player_list = pygame.sprite.Group()player_list.add(player)尝试启动你的游戏来看看发生了什么。高能预警:它不会像你预期的那样工作,当你启动你的项目,玩家妖精没有出现。事实上它生成了,只不过只出现了一毫秒。你要如何修复一个只出现了一毫秒的东西呢?你可能回想起上一篇文章中,你需要在主循环中添加一些东西。为了使玩家的存在时间超过一毫秒,你需要告诉 Python 在每次循环中都绘制一次。
将你的循环底部的语句更改如下:
world.blit(backdrop, backdropbox) player_list.draw(screen) # 绘制玩家 pygame.display.flip() clock.tick(fps)现在启动你的游戏,你的玩家出现了!
设置 alpha 通道
根据你如何创建你的玩家妖精,在它周围可能会有一个色块。你所看到的是 alpha 通道应该占据的空间。它本来是不可见的“颜色”,但 Python 现在还不知道要使它不可见。那么你所看到的,是围绕在妖精周围的边界区(或现代游戏术语中的“***区hit box”)内的空间。
你可以通过设置一个 alpha 通道和 RGB 值来告诉 Python 使哪种颜色不可见。如果你不知道你使用 alpha 通道的图像的 RGB 值,你可以使用 Krita 或 Inkscape 打开它,并使用一种独特的颜色,比如 #00ff00(差不多是“绿屏绿”)来填充图像周围的空白区域。记下颜色对应的十六进制值(此处为 #00ff00,绿屏绿)并将其作为 alpha 通道用于你的 Python 脚本。
使用 alpha 通道需要在你的妖精生成相关代码中添加如下两行。类似***行的代码已经存在于你的脚本中,你只需要添加另外两行:
img = pygame.image.load(os.path.join(images,hero + str(i) + .png)).convert() img.convert_alpha() # 优化 alpha img.set_colorkey(ALPHA) # 设置 alpha除非你告诉它,否则 Python 不知道将哪种颜色作为 alpha 通道。在你代码的设置相关区域,添加一些颜色定义。将如下的变量定义添加于你的设置相关区域的任意位置:
ALPHA = (0, 255, 0)在以上示例代码中,0,255,0 被我们使用,它在 RGB 中所代表的值与 #00ff00 在十六进制中所代表的值相同。你可以通过一个优秀的图像应用程序,如 GIMP、Krita 或 Inkscape,来获取所有这些颜色值。或者,你可以使用一个优秀的系统级颜色选择器,如 KColorChooser,来检测颜色。
如果你的图像应用程序将你的妖精背景渲染成了其他的值,你可以按需调整 ALPHA 变量的值。不论你将 alpha 设为多少,***它都将“不可见”。RGB 颜色值是非常严格的,因此如果你需要将 alpha 设为 000,但你又想将 000 用于你图像中的黑线,你只需要将图像中线的颜色设为 111。这样一来,(图像中的黑线)就足够接近黑色,但除了电脑以外没有人能看出区别。
运行你的游戏查看结果。
在 这个系列的第四篇文章 中,我会向你们展示如何使你的妖精动起来。多么的激动人心啊!
很赞哦!(6)
相关文章
- 域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
- 使用 Istio 保护您的微服务
- Access转成SQL数据库的方法
- 我不认为PG的Double Buffering是更优秀的解决方案
- 6、提示添加成功,点击确认进行最后的确定操作。一般10分钟就解析生效,可以用域名进行访问了。
- 面试官:请手写一个简易的单链表
- DB2 9的九大新特性
- 如何创建自己的域名?
- 网站页面结构改版,仅是页面样式发生变化,不会对排名、收录有影响;只有涉及到页面URL改变,才会对网站排名、收录有影响。
- 一文快速搞懂Redis的几种数据类型方式
热门文章
站长推荐
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
Podman与Docker有什么不同?
浅析五个流行的 JavaScript IDE
域名续费多少钱一年?
为啥修改dns服务器?dns服务器与域名有何联系?
数据结构与算法之背包问题之滚动数组!
多数据库Citus集群的维护
JVM 垃圾回收算法和 CMS 垃圾回收器