大家好,欢迎来到Crossin的编程课堂!今天给大家讲讲:如何制作一款游戏https://www.bilibili.com/video...游戏的主题是弹球游戏《PONG》,这是史上第一款街机游戏。这就是为什么我选择它作为我的游戏开发系列第一部分的主题。游戏引擎使用Python中的游戏库:pgzero。是对pygame的封装,让你不用写多余的套路代码,只需要配置游戏的内容逻辑即可。我们用它来写这个游戏,总共只有100行代码。首先需要安装python环境。没有完成这一步的同学可以参考我们的python入门教程:http://python666.cn,里面有详细的图文介绍。然后需要安装pgzero库,可以在命令行通过pip命令安装:pipinstallpgzero安装完成后,运行一句pgzrun.go(),打开我们游戏世界的大门。现在,还是混沌之初,一片漆黑。设置一个矩形的坐标和左上角的长宽,在游戏的绘图函数draw中用指定的颜色填充,得到一个矩形。pad_1=Rect((20,20),(10,100))defdraw():screen.clear()screen.draw.filled_rect(pad_1,'white')适当调整,会得到一块用于游戏挡球。为游戏的更新功能添加判断。当按下键盘上的“上”和“下”键时,修改挡板的y坐标,以控制挡板在游戏中的移动。PAD_SPEED=10defupdate(dt):ifkeyboard.up:pad_1.y-=PAD_SPEEDelifkeyboard.down:pad_1.y+=PAD_SPEED这样玩家控制PONG游戏中的角色:一个可以向上移动的挡板和下来。现在我们使用的代码只有10行。可能有小伙伴注意到这里有两个函数,一个叫draw,负责绘制游戏中的画面,另一个叫update,负责游戏中的逻辑更新。我们经常听说游戏的运行速度是每秒30帧、每秒60帧,或者叫FPS(FramesPerSecond)。绘制和更新是您在游戏“框架”中所做的事情。您的计算机或游戏机的性能越高,计算每一帧所花费的时间就越少,游戏的帧率就越高,游戏体验就越流畅。创建一个名为Ball的类型,其属性值包括位置和速度。然后,在绘图函数中以球的位置为圆心画一个圆,根据更新函数中匀速直线运动的位移公式,即位移=速度,计算出下一帧球的位置x次。这样,一个可以移动的小球就实现了。类Ball():def__init__(self):自我。pos=[300,200]自我。speed=[1,1]defupdate(self,dt):foriinrange(2):self.pos[i]+=self.speed[i]*dtball=Ball()defdraw():screen.clear()screen.draw.filled_rect(pad_1,'white')screen.draw.filled_circle(ball.pos,BALL_RADIUS,'white')然后设置边界条件,使得当小球到达屏幕边缘时,可以改变相应的速度方向。当它撞击上边缘和下边缘时,y速度分量乘以-1。如果超出左右边缘,则位置重置为屏幕中心。classBall():...defupdate(self,dt):foriinrange(2):self.pos[i]+=self.speed[i]如果self.pos[1]<0或self.pos[1]>HEIGHT:self.speed[1]*=-1ifself.pos[0]<0orself.pos[0]>WIDTH:self.reset()Withboard,withball,catch下一个步骤是在它们之间建立联系。在update函数中做一次碰撞检测:如果棋盘的矩形与小球的中心相交,就让小球反弹回来。defupdate(dt):...ball.update(dt)ifpad_1.collidepoint(ball.pos)andball.speed[0]<0:ball.speed[0]*=-1这一步,游戏的核心物理规则已经定义。以同样的方式,在屏幕右侧创建第二个板,由其他按钮控制。然后,当球超出左右边界时,为对方得分。classBall():...defdead(self,side):scores[side]+=1self.reset()这样,一个最简单的两人弹球游戏就完成了。当然,如果找不到其他人陪你玩,你也可以让左手玩右手。或者,向侧板添加一些自动跟踪代码:使板的位置跟随球的位置。这也是一个游戏AI。defauto_move_pad(dt):如果ball.pos[0]>WIDTH/2和ball.speed[0]>0:如果pad_2.y+pad_2.height*0.25>ball.pos[1]:pad_2.y-=PAD_SPEED*dt如果pad_2.top<0:pad_2.top=0elifpad_2.y+pad_2.height*0.75
