知识屋:更实用的电脑技术知识网站
所在位置:首页 > 综合

Python开发游戏超简单 │ 经典游戏《Jetpac重返地球》_Actor

发表时间:2022-03-25来源:网络

原标题:Python开发游戏超简单 │ 经典游戏《Jetpac重返地球》

游戏梗概:主人公流落外星球,遇到一群不讲道理的外星人。想跑路,载具又摔得七零八落。

任务:顶着外星人的进攻,把宇宙飞船的零件都找回来并组装好,然后为其添加燃料。最后安全逃离,重返地球。

这是由Chris和Tim Stamper兄弟于1983年创建的8位机游戏Jetpac里的剧情,也是其工作室Ultimate Play the Game出品的首批热门游戏之一。

01

经典游戏《Jetpac重返地球》

当一位宇航员和Ultimate Play the Game的徽标在屏幕上出现时,你知道之前的等待是值得的(20世纪80年代能有这么个游戏玩已经很令人兴奋了)。

游戏的角色是不幸的宇航员杰特曼,他必须收集四处散落的零件,制造火箭并为其添加燃料,同时还要与成群的致命外星人战斗。

本文提供的代码片段包含收集火箭零件和燃料,以便杰特曼搭载火箭起飞的技巧。

在此之前,先向大家介绍一个游戏框架: pgzero

该框架全名Pygame Zero,是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。

安装:

pip install pgzero

我们可以对所有屏幕元素和Actor碰撞例程使用内置的Pygame Zero Actor对象,以便处理重力并拾取物品。

首先,我们需要初始化Actor。

我们需要游戏中的主人公杰特曼、地面、火箭三个零件,还有火箭发动机所需的一些燃料。

每个Actor的行为方式将由一组列表决定。我们有一个重力对象列表,每帧绘制的对象、平台列表、碰撞对象列表以及可以拾取的对象列表。

杰特曼跳进火箭,回家了。欢呼!

我们的draw函数很简单,因为它首先循环遍历绘制列表中的项目列表,然后绘制几个条件元素。

该update功能是所有动作发生的地方:我们检查键盘输入来移动杰特曼,将重力应用于重力列表上的所有项目,检查与平台列表的碰撞,如果杰特曼触摸它,则拾取这个项目(对象),应用对杰特曼的任何推力,并移动杰特曼持有的任何物品随他一起移动。

完成所有操作后,我们可以检查添加的燃料量是否已达到火箭可升空的程度。

如果查看辅助函数checkCollisions和checkTouching,你会发现它们使用了不同的碰撞检测方法,第一种方法是检查与指定点的碰撞,以便我们可以检测到与actor顶部或底部的碰撞以及触摸冲突是矩形或边界框的冲突,因此,如果两个Actor的边界框相交,则会记录一个冲突。

另一个辅助函数applyGravity使重力列表中的所有元素向下移动,直到Actor的底部撞到碰撞列表上的某物为止。

目前的程序主要就是组装一枚火箭,加满燃料,然后升空。你后续要添加的是一群讨厌的外星人,以及一种用激光枪摧毁它们的方法。

完整代码如下所示:

importrandom

importtime

t0 = time.clock

jetman = Actor( 'jetmanl',( 400, 500))

ground = Actor( 'ground',( 400, 550))

platform1 = Actor( 'platform1',( 400, 350))

platform2 = Actor( 'platform2',( 200, 200))

platform3 = Actor( 'platform3',( 650, 200))

rocket1 = Actor( 'rocket1',( 520, 500))

rocket2 = Actor( 'rocket2',( 400, 300))

rocket3 = Actor( 'rocket3',( 200, 150))

rocketFire = Actor( 'rocketfire',( 521, 0))

fuel = Actor( 'fuel',( 50, -50))

gravityList = [jetman,rocket1,rocket2,rocket3,fuel]

drawList = [rocket1,rocket2,rocket3,ground,platform1,platform2,platform3,fuel]

platformList = [ground,platform1,platform2,platform3]

collideList = [rocket1,rocket2,rocket3]

pickupList = [rocket2,rocket3,fuel, 0,fuel, 0,fuel, 0, 0]

gravity = 1.5

jetman.thrust = jetman.holding = jetman.item = gameState = fuelLevel = timeElapsed = 0

jetman.dir = "l"

defdraw:

globaltimeElapsed

screen.clear

fori inrange( 0, len(drawList)):

drawList[i].draw

ifgameState == 0:

jetman.draw

timeElapsed = int(time.clock - t0)

else:

rocketFire.draw

screen.draw.text( "MISSION ACCOMPLISHED", center = ( 400, 300), owidth= 0.5, ocolor=( 255, 255, 255), color=( 0, 0, 255) , fontsize= 80)

screen.draw.text( "TIME:"+str(timeElapsed), center= ( 400, 20), owidth= 0.5, ocolor=( 255, 255, 255), color=( 255, 0, 0) , fontsize= 40)

defupdate:

globalgameState, fuelLevel

burn = ""

ifgameState == 0:

ifkeyboard.up:

jetman.thrust = limit(jetman.thrust+ 0.3, 0, 5)

burn = "f"

ifkeyboard.left:

jetman.dir = "l"

jetman.x -= 1

ifkeyboard.right:

jetman.dir = "r"

jetman.x += 1

applyGravity

coll = checkCollisions(platformList,(jetman.x,jetman.y -32))

ifcoll == False:

jetman.y -= jetman.thrust

ifpickupList[jetman.item] != 0:

ifcheckTouching(pickupList[jetman.item], jetman):

jetman.holding = pickupList[jetman.item]

jetman.thrust = limit(jetman.thrust -0.1, 0, 5)

jetman.image = "jetman"+ jetman.dir + burn

ifjetman.holding != 0:

jetman.holding.pos = jetman.pos

ifjetman.holding.x == rocket1.x andjetman.holding.y < 440:

jetman.holding = 0

jetman.item += 1

iffuel.x == rocket1.x andfuel.y+ 16> rocket3.y -32andjetman.holding == 0:

fuelLevel += 1

iffuelLevel < 4:

jetman.item += 1

iffuelLevel < 3:

fuel.pos = (random.randint( 50, 750), -50)

else:

fuel.pos = ( 0, 650)

gravityList[fuelLevel].image = "rocket"+str(fuelLevel)+ "f"

iffuelLevel == 3andjetman.x == rocket1.x andjetman.y > rocket3.y:

gameState = 1

ifgameState == 1:

rocket1.y -= 1

rocket2.y -= 1

rocket3.y -= 1

rocketFire.y = rocket1.y + 50

deflimit(n, minn, maxn):

returnmax(min(maxn, n), minn)

defcheckCollisions(cList, point):

fori inrange( 0, len(cList)):

ifcList[i].collidepoint(point):

returnTrue

returnFalse

defcheckTouching(a1,a2):

ifa1.colliderect(a2):

returnTrue

returnFalse

defapplyGravity:

fori inrange( 0, len(gravityList)):

ifcheckCollisions(platformList,(gravityList[i].x,gravityList[i].y+(gravityList[i].height/ 2))) == FalseandcheckCollisions(collideList,(gravityList[i].x,gravityList[i].y+(gravityList[i].height/ 2))) == False:

gravityList[i].y += gravity

以上就是Mark的Jetpac代码,你还可以在这里下载:

https://github.com/IoToutpost/Python_game/

02

参考书籍

趣学Python游戏编程》

ISBN:978-7-302-54977-2

何青 编著

定价:49元

编辑推荐

本书是高校教师多年开发经验的结晶之作,深入浅出地讲解使用Python语言进行游戏开发,帮助读者快速掌握游戏设计的基本原理和方法,同时提高应用Python语言的编程能力。

全书精选十个游戏案例,涵盖不同的游戏类型,每一章围绕一个经典游戏案例展开,并突出一个游戏编程的主题。本书涉及的主要知识点有游戏循环的原理、鼠标及键盘事件处理、碰撞检测及处理、随机数的运用、定时器的使用、游戏场景的滚动、角色动画的播放、音效及音乐的播放、缓动效果、游戏关卡设计、游戏人工智能的原理及运用等。本书将 Python语法知识及常用的编程技巧糅合在各个游戏案例中介绍,为读者展示Python语言的实际运用场景。

本书内容安排合理,架构清晰,注重理论与实践相结合,适合作为零基础学习 Python开发初学者的教程,也可作为本科院校及大专院校的教材,还可供职业技术学校和各类游戏培训机构使用。

03

Python 游戏设计 | 十行代码编写一个小游戏

利用Python+Cocos2d制作《猫吃老鼠》小游戏 | 附源码

Python实战|用KNN算法分析电影相关度

Python深度学习 │迁移学习与自然语言处理竞赛实践

前端入门详细攻略|CSS3基础(附源码+视频)

前端入门详细攻略|编写一个简单的 HTML5(附源码+视频)

HTML5 实现扑克翻牌游戏

HTML5 实现黑白棋游戏|附代码

HTML5 | 使用Canvas API画图实现绘制坦克图案

HTML5 Canvas 动画实例:游戏人物的跑步动画 返回搜狐,查看更多

责任编辑:

收藏

热门推荐

  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜