默认图片左上角为原点 (0,0)。
进群:125240963 即可获取数十套PDF!要源码也可以进群哦!
显示窗口
如果我们这样设定,当我们运行的时候,窗口会一闪而过,并不会出现我们想象的画面。因为窗口只是运行一下就会关闭,所以我们要写一个循环,使窗口一直保持出现。当然如果我们简单的写一个 while True那么我们的程序就出现了死循环,卡死。
同时我们的资源文件里还有一个叫做 shoot.pack 的文件,里面记录了每个图片所在的位置。
我们通过下面的代码加载资源图片,并且获得我们需要的主角飞机。
下一步就是完善这四个方法。
简单的说就是按下方向键的时候(w,a,s,d)飞机向四周移动,但是不能移动离开屏幕。
此时我们就应该把我们的飞机形成一个类,类里面有控制飞机的方法。
这里写类比较麻烦一点
player的控制
当飞机出现了,我们就应该实现我们在循环里写的方法。我们首先要判断它还在不在屏幕内,不能让飞机飞出屏幕。可以通过 rect.top,rect.bottom,rect.left,rect.right四个方法获取飞机图片的上下左右四个边界值。
这样我们就能对飞机进行判断
让子弹飞
子弹要沿着发射方向射出去。可以在屏幕上一直移动,直到移出屏幕。
我们只要有定义一个子弹对象,让这个对象显示在屏幕上就可以。
先定义飞机子弹类,基本和定义 player 一样,获得图片,裁剪图片,设置图片初始位置,在屏幕上显示图片
下一步就是让飞机的子弹跟随飞机。
我们需要在 Player 类里面添加方法。
首先我们规定,按下空格发射子弹。
下一步就是让子弹在屏幕上移动。
创建移动的方法。
player 的飞机就算基本绘制好了
绘制敌机
下一步就是绘制敌机。敌机是从屏幕上方移动到屏幕下方。我们任就需要一个类来设置敌机。设置类任就和我们前面的差不多,加载资源,设置 rect,设置位置。
现在我们就应该想想敌机的特点了,其实他和子弹的特点基本一直,只不过方向不一样而已。还有一点是敌机是随机生成的。
移动实现
碰撞检测
飞机和敌机还有子弹都有了,我们现在需要进行完成碰撞检测。有下面几种场景。
敌机和玩家碰撞在一起
子弹和敌机碰撞在一起
无论是那种情况的碰撞,其实就是两张图片有了交集。
如图
在 Player 类里面添加是否击中属性。
self.is_hit = False
修改循环
做到这里基本算是实现了飞机大战.但是还有很多细节处理。
细节处理
精细的碰撞检测
从图上看,当敌机看似还没有和我们接触时,但是已经 GameOver 了。
实际情况是这样的,所有的图片都是矩形,当两张图片的矩形边框线碰撞的时候,就算两个对象碰撞,所以我们要更加精细的使用碰撞检测。
动画
做了怎么就,感觉它没有一点动效,感觉死气沉沉的。无论是飞机飞行,还是飞机被击中,都没有一个明确的反馈。
对于2d游戏,动画其实就是一张一张的图片不停的变化。就和电影的原理类似。要想让我们的飞机动起来,我们需要定义一个列表来存放这些图片,然后写个循环,让他一直不停的更换图片就好。
首先我们更改我们的主角 Player
任就是老套路,加载图片。把加载的图片放到list 里。
飞机正常飞行的图片只有两张。所以我们要循环变化这两张图片。所以每发射一个子弹,图片变化两张。
加载图片enemies_shoot_img = [plane_img.subsurface(pygame.Rect(267, 347, 57, 43)),
plane_img.subsurface(pygame.Rect(873, 697, 57, 43)),
plane_img.subsurface(pygame.Rect(267, 296, 57, 43)),
plane_img.subsurface(pygame.Rect(930, 697, 57, 43))]
这样的话基本完成了动画效果。
音乐
有了动画还的有音乐。
音乐的处理只要在特定的地方播放音乐就好,比如子弹发射的时候,背景音乐,被击中的时候,游戏结束的时候,等等。他们的处理逻辑都一样。先加载资源,然后在播放。
背景音乐的播放。
pygame 在处理背景音乐的时候都在 pygame.mixer 方法中。其中播放音乐的play中的参数,第一个为播放几次,-1 为循环播放,后面的浮点表示 从第几秒开始播放。
分数&等级
分数
首先绘制得分情况,在屏幕上显示多少分。
绘制字体基本和绘制精灵是差不多的。首先要生成字体
两个参数分别是字体和字号
我们还需要在文本的地方强制转换为 str 。
score_text = score_font.render(str(score), True, (128, 128, 128))
等级
有了分数,那么再加点等级会使游戏更加有趣味性。
同样的先绘制等级。
需要源码记得私信小编哦!
网友评论