设为首页 收藏本站
查看: 2194|回复: 1

[经验分享] 青少年如何使用 Python 开始游戏开发

[复制链接]

尚未签到

发表于 2015-4-19 05:52:49 | 显示全部楼层 |阅读模式
  这是一篇由教程团队成员Julian Meyer发表的文章,一个12岁的python开发人员。你可以在Google+和Twitter上找到他。
  你可曾想过如何创建视频游戏吗?它不像你想象的那么复杂!
  在本教程中,您将创建一个简单的游戏叫做兔子和獾,在这里作为英雄的兔子要保卫城堡反击进攻的獾群。:O
  写这个游戏,你将使用Python。不,我指的并不是一条大蛇!:]
  Python是一种计算机编程语言。我们就本教程选择Python,Python是一种易于上手、有趣而且很容易学的语言。
  如果你刚接触Python,开始之前先检出这本书 - 深入Python:怎样像计算机科学家一样思考,这将使你提升速度。
  然后回到这里,准备开始—— 有一场小兔子和獾之间的战争即将发生。继续阅读将加入战争吧!
  开始: 安装Python
  如果你想在Windows电脑上尝试本教程,你需要安装Python,记住要安装2.7.3版本而不是3.3.0!运行完安装程序后,在开始菜单程序文件夹中会有IDLE,运行IDL。
  如果你使用Mac,Python已经安装了!只需打开一个终端(/Applications/Utilities/Terminal.app),输入python然后按回车。
  注意:如果你从python.org安装Python(如果你想获得PyGame需要这样做),那么你也需要在Mac上进入IDLE。它应该在“Applications/Python 2.7”文件夹内。
  如果操作正确的话,你将会看到类似输出:



?

1
2
3
4


Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 2012, 20:52:43)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
  注意:如果你想退出Python提示窗(三个尖括号提示:>>>),你可以通过在提示窗里输入exit()或按Ctrl+D。
  一旦你在Python提示窗了,测试Python是否正常工作的话输入print 1+1,然后按回车或换行,它将输出2。你已经写了你的第一个Python程序。
DSC0000.png
  现在你知道Python工作正常,为使用Python写游戏你需要安装PyGame。
  PyGame是一个使写游戏变简单的Python库,它提供如图像处理、声音回放等你可以很容易添加都游戏中的功能。
  到这来下载你系统适合的PyGame,确认你下载的是一个Python2.7版本。
  注意:从上面链接下载的PyGame安装文件不能与Apple的Mac上默认安装的Python一起工作,为使用PyGame你需要从python.org上下载安装Python,或者你可以通过MacPorts安装Python和PyGame。
  要检验PyGame安装是否正确的话,打开IDLE或通过终端运行Python,在Python提示符处输入import pygames,如果回车后没有输出的话你安装成功了。
  如果,另一方面,输出了下附类似错误,PyGame没有正确安装。



?

1
2
3
4
5
6
7
8


Python 2.7.2 (default, Jun 20 2012, 16:23:33)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
Traceback (most recent call last):
  File "", line 1, in
ImportError: No module named pygame
>>>
  如果你遇到类似的错误,在论坛上发出来我将帮助你让它正常。
  从文件运行Python代码
  虽然你可以在Python提示符下运行短的Python代码,但如果你工作在一个大的程序(比如游戏)里,你可能想要将你的代码保存到一个文件,这样你就不必一遍又一遍地键入它了。
  有几种方法可以运行Python程序文件。一种方法是使用一个纯文本编辑器,不如记事本(Windows)或TextEdit(Mac)。打开一个新的文本文件,输入你的Python代码(像print 1 + 1)。然后保存它为asXXX.py(XXX可以是任何描述性的文件名称)。
  使用Windows的话,通过双击这个文件来运行它。在Mac上,打开终端,输入python,然后拖动你保存的文件到终端窗口并按Enter。
  另一种方法是键入代码类到IDLE,也就是你在这个教程中需要做的方式。运行IDLE - 只需在终端输入IDLE。 然后选择文,然后选择File\New Window,会出现一个你可以输入代码的文本编辑器窗口。你可以通过File\Save保存你更改的代码,通过运行Run\Run Module(F5)运行代码。
  请注意运行菜单只在你已有一个文件在编辑器窗口打开时有效。
  添加游戏资源
  你几乎已经可以开始创建你的游戏了。但没有一些震撼的图像和声音效果的游戏又算什么呢?我已经收集了游戏所需要的所的图形和声音效果并把它们压缩成了一个ZIP存档,你可以在这里下载。
  下载文件后,在你的硬盘上创建一个游戏使用的文件夹,将resources文件夹解压到这个文件夹中,这样你的游戏文件夹有了名为resources的子文件夹,各种资源在resources文件夹里面分组显示如下:
DSC0001.jpg
  兔子和獾的游戏你已经准备就绪。:]
 第一步:(编写简单的)Hello Bunny(嘿,兔子)
  运行IDLE开发环境,向上一节提到的那样,打开一个新的文本编辑窗。在编辑窗键入以下代码:



?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


# 1 - Import library
import pygame
from pygame.locals import *
  
# 2 - Initialize the game
pygame.init()
width, height = 640, 480
screen=pygame.display.set_mode((width, height))
  
# 3 - Load images
player = pygame.image.load("resources/images/dude.png")
  
# 4 - keep looping through
while 1:
    # 5 - clear the screen before drawing it again
    screen.fill(0)
    # 6 - draw the screen elements
    screen.blit(player, (100,100))
    # 7 - update the screen
    pygame.display.flip()
    # 8 - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button
        if event.type==pygame.QUIT:
            # if it is quit the game
            pygame.quit()
            exit(0)
  把它保存到你的游戏目录下(即资源子目录)并命名为itgame.py。
  让我们逐段分析以上代码:
  1. 导入PyGame库。这一步让你在你的程序中使用来自库中的函数。
  2. 初始化PyGame并设置显示窗口。
  3. 加载你想要给bunny使用的图片。
  4. 循环执行以下缩进的代码。
  5. 在绘图前,将屏幕填充成黑色。
  6. 将之前加载进来的bunny图片以100*100的大小显示在屏幕上。
  7. 更新屏幕。
  8. 检查任何新事件如果有的话,否则转到退出命令,退出程序。
  注意:根据PyGame的文档,你不需要调用pygame.quit()因为解析器关闭时会自动调用它。然而,至少在Mac OS上,这个游戏会在退出时挂起除非pygame.quite被调用。
  如果现在运行这段代码(在Idle菜单栏点击 “Run\Run Module"),你应该可以看到一个如下所示的屏幕:
DSC0002.png
  耶,兔子就显示在屏幕上了,并准备做动作!
  但是只有一只兔子显示在一个黑漆漆的屏幕上,这个游戏看起来很吓人且很孤单。接下来要做的就是稍微美化一下咯。
 第二步:添加布景
  我们首先给游戏场景添加背景图片,可以通过调用一组screen.blit()来完成背景添加。
  在代码的#3 小节,载入角色图像之后添加下面的代码:



?

1
2


grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")
  这些代码载入图片然后赋给指定的变量,然后把它们画到屏幕上。但如果你检查草地的图片,你会发现它没有覆盖整个640 x 480的屏幕,所以你必须平铺使草地的图片完全覆盖屏幕。
  在#6小节的开始(把兔子画在屏幕上之前),添加以下代码到game.py:



?

1
2
3
4
5
6
7


for x in range(width/grass.get_width()+1):
    for y in range(height/grass.get_height()+1):
        screen.blit(grass,(x*100,y*100))
screen.blit(castle,(0,30))
screen.blit(castle,(0,135))
screen.blit(castle,(0,240))
screen.blit(castle,(0,345 ))
  正如你所见,首先把x坐标通过for循环递增,在这个循环中再把y坐标循环递增,并且将草地画在使用循环生成的x、y坐标上。紧接着的一组代码只是将城堡画在屏幕上。
  你现在运行这个程序,你会看到像如下的结果:
DSC0003.png
  从现在开始,变得好看点了! :]
 第三步:让兔子动起来
  下面你需要添加一些真正的游戏元素,比如让兔子响应键盘的按键。
  要做到这一点,你需要实现好一个方法记录哪一个键在某一时刻被按下。你可以简单的使用一个数组保存在游戏需要使用的键的按下状态。
  添加如下代码到game.py的#2小节结束(在你设了屏幕高和宽度之后):



?

1
2


keys = [False, False, False, False]
playerpos=[100,100]
  这段代码是非常明了。数组keys按WASD的顺序记录它们的状态。数组的每个元素对应一个键,第一个是W,第二个是A等等。
  playerpos变量定义程序开始绘制游戏角色的起始位置。因为这个游戏将移动游戏角色到不同的位置,设置一个储存角色位置的变量,然后便可以简单地将角色绘制到这个位置。
  现在你需要修改现有的代码来绘制角色,使用新的playerpos变量,将# 6的程序:



?

1


screen.blit(player, (100,100))
  改为:



?

1


screen.blit(player, playerpos)
  接下来,基于哪些按键被按下更新键数组,PyGame通过添加event.key事件使检测按键很容易实现。
  在# 8检测event.type==pygame.QUIT之后,添加这些代码(如果有块缩进的话使用与pygame.QUIT相同的缩进级):



?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


if event.type == pygame.KEYDOWN:
    if event.key==K_w:
        keys[0]=True
    elif event.key==K_a:
        keys[1]=True
    elif event.key==K_s:
        keys[2]=True
    elif event.key==K_d:
        keys[3]=True
if event.type == pygame.KEYUP:
    if event.key==pygame.K_w:
        keys[0]=False
    elif event.key==pygame.K_a:
        keys[1]=False
    elif event.key==pygame.K_s:
        keys[2]=False
    elif event.key==pygame.K_d:
        keys[3]=False
  哇!这里有很多行代码,如果你把它按If语句拆分也不是很复杂的。
  首先你要检测一是否有键被按下或释放,然后你需要检测哪个键被按下或者释放,如果被按下或者释放的键是你要使用的键,根据键值更新相应的键变量。
  最后,你需要更新playerpos变量作为键按下的响应,这太简单了。
  将下附代码添加到game.py的末尾(使用相同的缩进级,使用和for循环相同的缩进级)



?

1
2
3
4
5
6
7
8
9


# 9 - Move player
if keys[0]:
    playerpos[1]-=5
elif keys[2]:
    playerpos[1]+=5
if keys[1]:
    playerpos[0]-=5
elif keys[3]:
    playerpos[0]+=5
  这段代码只是检查哪个键被按下,然后添加或减去游戏角色的x或y位置(取决于按下的键)来移动游戏角色。
  运行这个游戏,你会得到根以前一样的角色。试一下按WASD键,哈哈,起效了!
DSC0004.png
 第四步: 旋转兔子
  是的,你的兔子现在可以随着你的按键移动,但用鼠标来旋转兔子朝向到你选择的方向岂不更酷,所以它不是所有时间都朝向一个方向。使用三角函数来实现,这很简单。
  看一下下面的图解:
DSC0005.png
  上图中,如果(5,3)是兔子的位置,(2,4)是当前鼠标的位置,你可以通过对两点间距离的不同应用atan2三角函数获得旋转角度(z)。当然,一旦你知道旋转角,你可以轻松相应地旋转兔子。:]
  如果你对这部分有点困惑,不要担心,你依然可以继续。但这就是你应该在数学课上用功的原因!:]在游戏编程时你会一直使用这个东西。
  现在你需要将这个原理应用到你的游戏上,为做到这一点,你可以使用PyGameSurface.rotate(度数)函数, 顺便说一下,记住,Z值是弧度。:[
  atan2函数在Python的math库总,所有先在#1结尾处增加:



?

1


import math
  然后,将#6最后一行(player.blit这行)替换成下面的代码:



?

1
2
3
4
5
6


# 6.1 - Set player position and rotation
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
playerrot = pygame.transform.rotate(player, 360-angle*57.29)
playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
screen.blit(playerrot, playerpos1)
  让我们梳理一下上面代码的基本流程。首先获取鼠标和游戏角色的位置,然后你对两个位置应用atan2函数,之后,你将atan2返回的弧度转化成度数(将弧度乘以近似57.29或360/2π)。
  因为兔子会旋转,它的位置也将会改变。所以现在计算兔子的新位置并把它显示在屏幕。
  再次运行这个游戏。如果你只按了“WASD”键,那么这个游戏应该和之前完全一样,但如果你移动你的鼠标兔子也会随之旋转,酷!
DSC0006.png
 第五步:射击吧,兔子!
  现在你的兔子已经可以自由活动了,是时候给它添加更多的动作了。让兔子可以用剑射击敌人怎么样?它可不是只温顺的兔斯基!
  这一步稍微有点复杂,因为你必须记录所有射出的剑,更新它们的位置、旋转并且在它们飞出屏幕后删除它们。
  首先,在初始化小节(#2小节)的结束添加必要的变量:



?

1
2


acc=[0,0]
arrows=[]
  第一个变量记录玩家的射击精度,第二个变量记录所有的剑。精度变量acc实际上是一个包含射击数量和命中獾 次数的列表。最后我们可以使用这些信息来计算精度的百分比。
  接下来,在section #3的末尾加载弓箭图像:



?

1


arrow = pygame.image.load("resources/images/bullet.png")
  现在当玩家点击鼠标,弓箭就要射出。在section #8的末尾加入以下代码作为新的事件句柄(event handler):



?

1
2
3
4


if event.type==pygame.MOUSEBUTTONDOWN:
    position=pygame.mouse.get_pos()
    acc[1]+=1
    arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
  这些代码检查是否有鼠标点击,如果有它会读取鼠标位置,并根据玩家的旋转和指针的位置计算出弓箭的旋转。这个旋转储存在arrows数组里。
  接下来你需要真正在屏幕上画出弓箭了。在section #6.1之后插入以下代码:



?

1
2
3
4
5
6
7
8
9
10
11
12
13


# 6.2 - Draw arrows
for bullet in arrows:
    index=0
    velx=math.cos(bullet[0])*10
    vely=math.sin(bullet[0])*10
    bullet[1]+=velx
    bullet[2]+=vely
    if bullet[1]640 or bullet[2]480:
        arrows.pop(index)
    index+=1
    for projectile in arrows:
        arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
        screen.blit(arrow1, (projectile[1], projectile[2]))
  运用基本的三角函数可以计算出vely和velx。10是弓箭的速度。if语句检查弓箭是否飞出边界,如果是则删除该弓箭。第二个for语句循环过arrows数组并画出相应旋转的弓箭。
  试试运行程序。你应该有一只兔兔在你点击鼠标时发射弓箭了。(?☉? ⊙?)
 第六步:拿起武器!獾!
  好的,你有了一个城堡和可以移动和射击的英雄。但少了什么东西呢?攻击城堡的敌人!
DSC0007.jpg (炸掉你的城堡!)
  在这个步骤中,你将创建几只随机生成并跑向城堡的獾。随着游戏的进展会有越来越多的獾。所以,让我们做一个列表看看需要做那些工作。
  1、把坏家伙们添加到一个数组列表;
    2、每帧每帧的更新这个数组并检查他们是否都出现在屏幕上;
    3、显示这些坏家伙。
  很容易,是吧?:]
    首先,把下面这段代码添加到section #2后面:



?

1
2
3
4


badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194
  上面这段代码设置了一个计时器(以及其他一些值)以便每过一段时间在游戏中增加一只新的獾。你每帧每帧的减少 badtimer直到0, 然后就生成一个新的獾。
  现在把下面这段代码添加到section #3后面:



?

1
2


badguyimg1 = pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1
    上面代码的第一行类似于前面所有的图片加载代码。第二行代码设置了一个图片副本以便于这个坏家伙能更容易动起来。
    下一步,你必须更新并且显示这个坏家伙。把下面代码添加到section #6.2之后:



?[table][tr][td]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[/td][td]

# 6.3 - Draw badgers
if badtimer==0:
    badguys.append([640, random.randint(50,430)])
    badtimer=100-(badtimer1*2)
    if badtimer1>=35:
        badtimer1=35
    else:
        badtimer1+=5
index=0
for badguy in badguys:
    if badguy[0]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58460-1-1.html 上篇帖子: 【译】Python Lex Yacc手册 下篇帖子: Python网络编程中的select 和 poll I/O复用的简单使用
累计签到:1 天
连续签到:1 天
发表于 2020-1-29 23:24:33 | 显示全部楼层
看了LZ的帖子,我只想说一句很好很强大!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表