《塔防式游戏详细设计之一.docx》由会员分享,可在线阅读,更多相关《塔防式游戏详细设计之一.docx(6页珍藏版)》请在优知文库上搜索。
1、实验塔防式游戏详细设计之一一、实验目的二、实验要求三、实验设备计算机、PylhOn2.7、Pygame1.9.2四、实验内容一、创立游戏场景和卡通人物# 1-Importlibraryimportpygamefrompygame.Iocalsimport*#2-初始化游戏场景,即根本画布pygame.init()width,height=640,480screen=pygame.display.set_mode(width,height)#3-通过装载图像的方式而出一个卡通人物player=pygame.image,load(resources/images/dude.png)# 4-游戏的主
2、循环whilel:# 5-clearthescreenbeforedrawingitagainscreen,fill(0)# 6-drawthescreenelementsscreen,blit(player,(100,100)#7-updatethescreenpygame.display,flip()#8-主循环中的事件循环foreventinpygame.event,get():#checkiftheeventistheXbuttonifevent.type=pygame.QUIT:# ifitisquitthegamepygame.quit()exit(O)代码解释:1. 导入pyga
3、me库,这一步能让你使用库里提供的功能2. 初始化Pygarne,设置展示窗口3. 加载作为兔子的图片4. 不停地循环执行接下来的局部5. 在给屏幕画任何东西之前用黑色进行填充6. 在屏幕的(100,100)坐标出添加你加载的兔子图片7. 更新屏幕8. 检查一些新的事件,如果有退出命令,那么终止程序的执行。二、丰富场景在#3的结尾处,在添加玩家图片的后面,加上以下的代码:1 grass=PyganIe.image,load(resources/images/grass.png)2 castle=Pygame.image,load(resourcesimagesCaStle.png)这段代码加载
4、图片并将它们放在变量里。现在它们需要被画在屏幕上。但是当你检查了草的图片后,发现它不会覆盖整个屏幕,它的分辨率是640X480。添加到game.py里#6的代码:1 forXinrange(width/grass.get_width()+l):2 foryinrange(height/grass.get_height()+1):3 screen,blit(grass,(x*100,y*100)4screen,blit(castle,(0,30)5screen,blit(castle,(0,135)6screen,blit(castle,(0,240)7screen,blit(castle,(0
5、,345)三、互动元素设计接下来你需要加上一些真正的游戏的元素了,比方让兔子能够随着按键移动。为了做到这一点,首先,你需要实现一个方法,用来记录在某一时刻那个键被按下。可以通过新建一个按键状态的队列来存放每个你想在游戏里用到的按犍。把以下代码参加到game.py里#2后面:1keys=False,False,False,False2playerpos=100,100这段代码是不言自明的,key这个队列用来记录几个按键的情况:W、A、S、D。队列中的每一项对应一个按键第一个对应W,第二个对应A等等。Playerpos这个变量表示程序画出玩家的位置。因为这个游戏会让玩家向不同的方向移动,用一个变量
6、来表示玩家的位置并且能够依据这个变量将玩家画出来的方案是非常适合的。现在你需要修改现在画出玩家的代码,需要用上PlayerPoS变量。把#6局部的代码进行修改:从1screen,blit(player,(100,100)改成:1 screen,blit(player,playerpos)在#8的结尾,就在event.py=pygame.QUIT后面,添加一下的代码(与Pygame.QUIT保持同级别缩进)2 ifevent,type=pygame.KEYDOWN:3 ifevent.key=K_w:4 keys0=True4elifevent.key=K_a:5keysl=True6elife
7、vent.key=K_s:7keys2=True8elifevent.key=K_d:9keys3=True10ifevent.typ(2-=pygame.KEYUP:Ilifevent,key=pygame.K_w:12keysO=False13elifevent.key=pygame.K_a:14keysl=False15elifevent.key=pygame.K_s:16keys2=False17elifevent.key=pygame.K_d:18keys3=False首先,你检查是否有一个键被按下或放开。然后,检查是哪一个键被按下或放开了,如果被按下或放开的键是你使用的,你就更新记
8、录按键的变量。最终,你需要更新PlayerPOS变量(兔子的当前位置)作为按键后的反响。这实际上是非常简单的。在8#代码区后面添加兔子移动的步长:#9-MoveplayerifkeysO:playerposl-=5elifkeys2:playerposl+=5ifkeysl:playerpos0-=5elifkeys3:playerpos0+=5四、控制鼠标操作精灵好的,现在你的兔子在你按键的时候可以移动了,但是如果你能用鼠标让兔子朝向你选择的方向不是更酷吗?这样它就不会总是朝向一个方向了。用三角定理实现它会非常简单。看一下下面的插图:在上图中,如果5,3)是兔子的位置,(2,4)是现在鼠标的
9、位置,你可以通过三角定理来得出需要旋转的角度。然后,你知道了旋转的角度后,以就可以来旋转你的兔子了如果你对这局部感到有点疑感,不要担忧这没有关系。但这是你为什么需要在数学课上集中精力的原因。在游戏编程中会用得到它的。现在,你需要接受你的游戏里的概念。为了实现它,你可以使用PyGameSUrfaCeJOtate(Clegrees)函数。atatn2函数是来自Python的math库。所以把以下代码加到#1局部:1importmath然后,把#6局部的最后一行用一下代码替换:I#6.1-Setplayerpositionandrotationoposition=pygame.mouse,getpo
10、s()angle=math,atan2(position1-(playerposEl+32),positionL-(pIayerposL+26)playerrot=pygame.transform,rotate(player,360-angle*57.29)5 pIayerposl=(playerpos0-playerrot.getrect().wid6 playerposl-playerrot.getrect().height/2)screen,blit(playerrot,playerpos1)我们来浏览一下以上代码的根本结构。首先获取鼠标和玩家的位置。然后将它们使用atan2函数。然后,
11、获取通过ata2函数得出的角度和弧度。当兔子被旋转的时候,它的位置将会改变。所以你需要计算兔子新的位置,然后将其在屏幕上显示出来。再次运行游戏,如果你只是按WASD这几个键,那么这个游戏跟以前还是一样的。但是如果你移动鼠标,兔子也开始旋转了,相当酷!五增加攻击能力现在你的兔子可以四处移动了,是时候来添加更多的功能了。让兔子用箭头射向它们的敌人怎么样?这一步会有一点复杂,因为你需要跟踪所有的箭头,更新它们,旋转它们,在它们跑出屏幕的时候删除它们.首先,在#2声明的局部加上必要的变量的声明。1acc=0,02arrows=第一个变量会跟踪玩家的精度,第二个变量会跟踪箭头。这个精度的变量本质上是一个
12、数字组成的列表,记录了射出的箭头数和被击中的狼的数量。之后我们会用到这些信息用来计算射击精确度。接下来,在#3局部结尾加载箭头的图片。1arrow=pygame.image,load(resourcesimagesbullet.png,)现在,当玩家点击鼠标,就需要射出一支箭头。在#8局部加上以下代码:ent.type=pygame.MOUSEBUTTONDOWN:position=pygame.mouse.get_posOaccl+=larrows,append(math,atan2(position1-(playcrposl1+32),position0-(playerpos10+26),
13、playerposl0+32,playcrposll+32)这段代码会检查是否鼠标被点击了,如果点击了,它就会得到鼠标的位置并且根据玩家和光标的位置计算出箭头旋转角度。旋转角度的值存放在arrows这个数组里。接下来,你需要真的在屏幕上画出箭头来.在#6局部加上以下代码:#6.2-Drawarrowsforbulletinarrows:2 一。ndex=0velx=math.cos(bullet0)*104 一vely=math.sin(bullet0)*106 bulletl+=velxbullet2+=vely8 ifbulletl640orbullet2480:arrows,pop(in
14、dex)index+=l10Q.forprojectileinarrows:arrow1=pygame.transform,rotate(arrow,360-projectile0*57.29)screen,blit(arrowl,(projectilel,projectile2)Vely和VelX的值是根据三角定理算出来的。10是箭头的速度。if表达式是检查箭头是否超出了屏幕范围,如果超出,就删除这个箭头。第二个for表达式是循环来把箭头根据相应的旋转画出来。试着运行游戏。当你点击鼠标时,你的兔子就可以射出剪头了:D六、增加游戏的反派精灵好吧,现在有了城堡,并且你有一个英雄可以移动和射出箭头。还差什么呢?攻击城堡的敌人可以被英雄用箭头射了!在这一步,你将会随机创立出一些施冲向城堡。在游戏的进程中会有越来越多的灌冒出来。所以,我们来列个接下来要做的事情的清单。1. 添加一个坏蛋的列表2. 更新坏蛋的信息,并且检查它们是否超出屏幕范围3. 展示这些坏蛋第一步,在#2局部加上一下代码:1 badtimer=1002 badtimerl=03 badguys=640,1004 healthvalue=194以上的代码里定义了一个定时器,使得游戏里可以经过一段时间后就新建一只瘫。在#3局部结尾处添加以下代码:1 badguyimgl=py