Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。

在本系列的第四部分,学习如何编写移动游戏角色的控制代码。

在这个系列的第一篇文章中,我解释了如何使用 Python 创建一个简单的基于文本的骰子游戏。在第二部分中,我向你们展示了如何从头开始构建游戏,即从 创建游戏的环境 开始。然后在第三部分,我们创建了一个玩家妖精,并且使它在你的(而不是空的)游戏世界内生成。你可能已经注意到,如果你不能移动你的角色,那么游戏不是那么有趣。在本篇文章中,我们将使用 Pygame 来添加键盘控制,如此一来你就可以控制你的角色的移动。

在 Pygame 中有许多函数可以用来添加(除键盘外的)其他控制,但如果你正在敲击 Python 代码,那么你一定是有一个键盘的,这将成为我们接下来会使用的控制方式。一旦你理解了键盘控制,你可以自己去探索其他选项。

在本系列的第二篇文章中,你已经为退出游戏创建了一个按键,移动角色的(按键)原则也是相同的。但是,使你的角色移动起来要稍微复杂一点。

让我们从简单的部分入手:设置控制器按键。

为控制你的玩家妖精设置按键

在 IDLE、Ninja-IDE 或文本编辑器中打开你的 Python 游戏脚本。

因为游戏需要时刻“监听”键盘事件,所以你写的代码需要连续运行。你知道应该把需要在游戏周期中持续运行的代码放在哪里吗?

如果你回答“放在主循环中”,那么你是正确的!记住除非代码在循环中,否则(大多数情况下)它只会运行仅一次。如果它被写在一个从未被使用的类或函数中,它可能根本不会运行。

要使 Python 监听传入的按键,将如下代码添加到主循环。目前的代码还不能产生任何的效果,所以使用 print 语句来表示成功的信号。这是一种常见的调试技术。

whilemain==True:

foreventinpygame.event.get():

ifevent.type==pygame.QUIT:

pygame.quit();sys.exit()

main=False

ifevent.type==pygame.KEYDOWN:

ifevent.key==pygame.K_LEFTorevent.key==ord('a'):

print('left')

ifevent.key==pygame.K_RIGHTorevent.key==ord('d'):

print('right')

ifevent.key==pygame.K_UPorevent.key==ord('w'):

print('jump')

ifevent.type==pygame.KEYUP:

ifevent.key==pygame.K_LEFTorevent.key==ord('a'):

print('left stop')

ifevent.key==pygame.K_RIGHTorevent.key==ord('d'):

print('right stop')

ifevent.key==ord('q'):

pygame.quit()

sys.exit()

main=False

一些人偏好使用键盘字母 W、A、S 和 D 来控制玩家角色,而另一些偏好使用方向键。因此确保你包含了两种选项。

注意:当你在编程时,同时考虑所有用户是非常重要的。如果你写代码只是为了自己运行,那么很可能你会成为你写的程序的唯一用户。更重要的是,如果你想找一个通过写代码赚钱的工作,你写的代码就应该让所有人都能运行。给你的用户选择权,比如提供使用方向键或 WASD 的选项,是一个优秀程序员的标志。

使用 Python 启动你的游戏,并在你按下“上下左右”方向键或 A、D 和 W 键的时候查看控制台窗口的输出。

$ python./your-name_game.py

left

left stop

right

right stop

jump

这验证了 Pygame 可以正确地检测按键。现在是时候来完成使妖精移动的艰巨任务了。

编写玩家移动函数

为了使你的妖精移动起来,你必须为你的妖精创建一个属性代表移动。当你的妖精没有在移动时,这个变量被设为 0。

如果你正在为你的妖精设置动画,或者你决定在将来为它设置动画,你还必须跟踪帧来使走路循环保持在轨迹上。

在 Player 类中创建如下变量。开头两行作为上下文对照(如果你一直跟着做,你的代码中就已经有这两行),因此只需要添加最后三行:

def__init__(self):

pygame.sprite.Sprite.__init__(self)

self.movex=0#沿X方向移动

self.movey=0#沿Y方向移动

self.frame=0#帧计数

设置好了这些变量,是时候去为妖精移动编写代码了。

玩家妖精不需要时刻响应控制,有时它并没有在移动。控制妖精的代码,仅仅只是玩家妖精所有能做的事情中的一小部分。在 Python 中,当你想要使一个对象做某件事并独立于剩余其他代码时,你可以将你的新代码放入一个函数。Python 的函数以关键词 def 开头,(该关键词)代表了定义函数。

在你的 Player 类中创建如下函数,来为你的妖精在屏幕上的位置增加几个像素。现在先不要担心你增加几个像素,这将在后续的代码中确定。

defcontrol(self,x,y):

'''

控制玩家移动

'''

self.movex+=x

self.movey+=y

为了在 Pygame 中移动妖精,你需要告诉 Python 在新的位置重绘妖精,以及这个新位置在哪里。

因为玩家妖精并不总是在移动,所以更新只需要是 Player 类中的一个函数。将此函数添加前面创建的 control 函数之后。

要使妖精看起来像是在行走(或者飞行,或是你的妖精应该做的任何事),你需要在按下适当的键时改变它在屏幕上的位置。要让它在屏幕上移动,你需要将它的位置(由 self.rect.x 和 self.rect.y 属性指定)重新定义为当前位置加上已应用的任意 movex 或 movey。(移动的像素数量将在后续进行设置。)

defupdate(self):

'''

更新妖精位置

'''

self.rect.x=self.rect.x+self.movex

对 Y 方向做同样的处理:

self.rect.y=self.rect.y+self.movey

对于动画,在妖精移动时推进动画帧,并使用相应的动画帧作为玩家的图像:

#向左移动

ifself.movex<0:

self.frame+=1

ifself.frame>3*ani:

self.frame=0

self.image=self.images[self.frame//ani]

#向右移动

ifself.movex>0:

self.frame+=1

ifself.frame>3*ani:

self.frame=0

self.image=self.images[(self.frame//ani)+4]

通过设置一个变量来告诉代码为你的妖精位置增加多少像素,然后在触发你的玩家妖精的函数时使用这个变量。

首先,在你的设置部分创建这个变量。在如下代码中,开头两行是上下文对照,因此只需要在你的脚本中增加第三行代码:

player_list=pygame.sprite.Group()

player_list.add(player)

steps=10#移动多少个像素

现在你已经有了适当的函数和变量,使用你的按键来触发函数并将变量传递给你的妖精。

为此,将主循环中的 print 语句替换为玩家妖精的名字(player)、函数(.control)以及你希望玩家妖精在每个循环中沿 X 轴和 Y 轴移动的步数。

ifevent.type==pygame.KEYDOWN:

ifevent.key==pygame.K_LEFTorevent.key==ord('a'):

player.control(-steps,0)

ifevent.key==pygame.K_RIGHTorevent.key==ord('d'):

player.control(steps,0)

ifevent.key==pygame.K_UPorevent.key==ord('w'):

print('jump')

ifevent.type==pygame.KEYUP:

ifevent.key==pygame.K_LEFTorevent.key==ord('a'):

player.control(steps,0)

ifevent.key==pygame.K_RIGHTorevent.key==ord('d'):

player.control(-steps,0)

ifevent.key==ord('q'):

pygame.quit()

sys.exit()

main=False

记住,steps 变量代表了当一个按键被按下时,你的妖精会移动多少个像素。如果当你按下 D或右方向键时,你的妖精的位置增加了 10 个像素。那么当你停止按下这个键时,你必须(将 step)减 10(-steps)来使你的妖精的动量回到 0。

现在尝试你的游戏。注意:它不会像你预想的那样运行。

为什么你的妖精仍无法移动?因为主循环还没有调用 update 函数。

将如下代码加入到你的主循环中来告诉 Python 更新你的玩家妖精的位置。增加带注释的那行:

player.update()#更新玩家位置

player_list.draw(world)

pygame.display.flip()

clock.tick(fps)

再次启动你的游戏来见证你的玩家妖精在你的命令下在屏幕上来回移动。现在还没有垂直方向的移动,因为这部分函数会被重力控制,不过这是另一篇文章中的课程了。

与此同时,如果你拥有一个摇杆,你可以尝试阅读 Pygame 中 joystick 模块相关的文档,看看你是否能通过这种方式让你的妖精移动起来。或者,看看你是否能通过鼠标与你的妖精互动。

最重要的是,玩的开心!

本教程中用到的所有代码

为了方便查阅,以下是目前本系列文章用到的所有代码。

#!/usr/bin/envpython3

#绘制世界

#添加玩家和玩家控制

#添加玩家移动控制

#GNUAll-PermissiveLicense

#Copyinganddistribution ofthisfile,withorwithout modification,

#are permittedinany medium without royalty provided the copyright

#noticeandthisnotice are preserved.Thisfileisofferedas-is,

#without any warranty.

importpygame

importsys

importos

'''

Objects

'''

classPlayer(pygame.sprite.Sprite):

'''

生成玩家

'''

def__init__(self):

pygame.sprite.Sprite.__init__(self)

self.movex=0

self.movey=0

self.frame=0

self.images=[]

foriinrange(1,5):

img=pygame.image.load(os.path.join('images','hero'+str(i)+'.png')).convert()

img.convert_alpha()

img.set_colorkey(ALPHA)

self.images.append(img)

self.image=self.images[0]

self.rect=self.image.get_rect()

defcontrol(self,x,y):

'''

控制玩家移动

'''

self.movex+=x

self.movey+=y

defupdate(self):

'''

更新妖精位置

'''

self.rect.x=self.rect.x+self.movex

self.rect.y=self.rect.y+self.movey

#向左移动

ifself.movex<0:

self.frame+=1

ifself.frame>3*ani:

self.frame=0

self.image=self.images[self.frame//ani]

#向右移动

ifself.movex>0:

self.frame+=1

ifself.frame>3*ani:

self.frame=0

self.image=self.images[(self.frame//ani)+4]

'''

设置

'''

worldx=960

worldy=720

fps=40#帧刷新率

ani=4#动画循环

clock=pygame.time.Clock()

pygame.init()

main=True

BLUE=(25,25,200)

BLACK=(23,23,23)

WHITE=(254,254,254)

ALPHA=(0,255,0)

world=pygame.display.set_mode([worldx,worldy])

backdrop=pygame.image.load(os.path.join('images','stage.png')).convert()

backdropbox=world.get_rect()

player=Player()#生成玩家

player.rect.x=0

player.rect.y=0

player_list=pygame.sprite.Group()

player_list.add(player)

steps=10#移动速度

'''

主循环

'''

whilemain==True:

foreventinpygame.event.get():

ifevent.type==pygame.QUIT:

pygame.quit();sys.exit()

main=False

ifevent.type==pygame.KEYDOWN:

ifevent.key==pygame.K_LEFTorevent.key==ord('a'):

player.control(-steps,0)

ifevent.key==pygame.K_RIGHTorevent.key==ord('d'):

player.control(steps,0)

ifevent.key==pygame.K_UPorevent.key==ord('w'):

print('jump')

ifevent.type==pygame.KEYUP:

ifevent.key==pygame.K_LEFTorevent.key==ord('a'):

player.control(steps,0)

ifevent.key==pygame.K_RIGHTorevent.key==ord('d'):

player.control(-steps,0)

ifevent.key==ord('q'):

pygame.quit()

sys.exit()

main=False

#world.fill(BLACK)

world.blit(backdrop,backdropbox)

player.update()

player_list.draw(world)#更新玩家位置

pygame.display.flip()

clock.tick(fps)

你已经学了很多,但还仍有许多可以做。在接下来的几篇文章中,你将实现添加敌方妖精、模拟重力等等。与此同时,练习 Python 吧!

虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。

python能制作游戏吗_什么用Python让制作的游戏角色移动起来?相关推荐

  1. python能制作游戏吗_如何用python写一个小游戏

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 引言最近python语言大火,除了在科学计算领域python有用武之地之外,在游 ...

  2. python 贴吧盖楼_ es6 + canvas 开源 盖楼小游戏 完整代码注释 从零教你做游戏(一)...

    盖楼游戏 一个基于 Canvas 的盖楼游戏 Demo 预览 手机设备可以扫描下方二维码 github Game Rule 游戏规则 以下为默认游戏规则,也可参照下节自定义游戏参数 每局游戏生命值为3 ...

  3. python猫狗大战游戏下载_猫狗大战RPG最新下载-猫狗大战RPG游戏安卓版-Minecraft中文分享站...

    <猫狗大战RPG>游戏是一款回合制角色扮演手游,玩家们可以在这款游戏中自由的选择角色去进行游戏.卡通的游戏风格,高清的而游戏画质,丰富多样的游戏玩法,大大的提高了游戏的可玩性,会给玩家们带 ...

  4. python适合开发游戏吗_【学习python小游戏代码,你就可以做python滑雪游戏了】- 环球网校...

    [摘要]很多人开始学习编程都会选择python,并且也会将python用在实际生活中,不过有很多伙伴也打算用python做游戏,所以小编建议大家可以学习python小游戏代码,今天环球网校的小编就来和 ...

  5. python简单可视化聊天界面_如何用Python制作可视化输入界面

    继续研究Python的应用,我们在有些程序中需要输入一些参数,可由几种方式实现 1.直接写在程序里,适合编程使用 2.使用input()函数,运行程序时输入 3.做成可视化界面,然后让程序获得 今天主 ...

  6. python将字符串逆序_为什么说Python是一门伟大的入门语言?(附免费教程)

    Python 是一门伟大的入门语言.作为一门伟大的编程语言,一定要具备一些特征,其中有五项特征是非常重要的: 非常棒的首次体验:就像书的开始,首先一定要能够"沉迷",学习新知识一定 ...

  7. python语言中运算符号_详细介绍Python语言中的按位运算符

    <从问题到程序:用Python学编程和计算>--2.11 补充材料 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者:裘宗燕 ...

  8. python wx窗口无法关闭_菜鸟学Python,双手奉上老司机给上路新手总结的Python实战问题…...

    针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家. 第一类问题: ...

  9. 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...

    学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...

  10. python都有什么包_常用的Python包有哪些,如何快速掌握Python编程

    Python入门简单.功能强大,是很多想要入行IT开发行业人士的主要选择.Python包可以帮助Web开发人员快速和容易地创建应用程序和功能,因此很多企业在招聘时都会考察求职者对于Python包的掌握 ...

最新文章

  1. 关于植物和共生微生物,这116张PPT讲明白了(值得收藏!)
  2. Javaweb 第15天 web练习和分页技术
  3. 线程A向队列Q中不停写入数据,线程B从列队Q中不停读取数据(只要Q中有数据)。
  4. Appcan开发笔记:导出Excel文件
  5. php 日历哪个好,简单的PHP日历
  6. python flask 分页_Python利用flask sqlalchemy实现分页效果
  7. 在思科路由器上配置SSH登录
  8. Pandas:时间序列数据基本操作和分组
  9. 深入浅出通信原理丨边缘计算阅读周
  10. 股市最好用的大数据软件_十大股票软件排名谁知道?
  11. 最新易商支付源码/代付系统PHP源码+功能超级强大
  12. Android Studio的适配器Adapter以及Adapterview的使用
  13. Window 10 python 3.7安装 PyV8
  14. 联想笔记本重装系统声卡驱动未安装报错代码28,声音图标显示红叉没有声音
  15. 怎么卸载VS2013?亲测有效
  16. 相机成像时间与曝光时间的关系
  17. servlet会话技术 cookie和session
  18. 解决无法安装Axure RP 9(Windows 7 SP1 更新补丁)
  19. 机器学习面试题总结!!!!
  20. 一个研发管理使命、愿景、价值观的案例

热门文章

  1. 2022.11.17Python语法基础列表、字典、字符串
  2. TFSEQ Part II: 序列模型的实现细节
  3. 你见过有哪些超级搞笑的代码?
  4. 荣获“2022年度华强电子网优秀国产品牌企业”称号
  5. 软件安全技术复习内容
  6. 手机短信不见了,如何找回丢失的手机短信
  7. 普通护照 首次申请 所需材料
  8. iOS 直播技术文档
  9. 计算机网络调整优化方案,有关计算机网络服务质量优化方法的探讨
  10. 腾讯的机器人梦:上亿美元下注七家创企