Python游戏开发:这款曾经几亿人上瘾的小游戏,经典飞机大战(1)

飞机发射子弹

def shut(self, image_path=os.path.join(source_dir,‘bullet.png’)):

‘’’

:param image_path: 子弹图片

‘’’

bullet = Bullet(image_path, plan=self)

self.bullets.append(bullet)

绘制飞机的所有子弹

def draw_bullets(self, time_passed, screen):

‘’’

:param time_passed: 距离上次绘制图像到现在的时间

:param screen: 绘制到哪一个窗口中

‘’’

清理消失的子弹

for bullet in self.bullets:

if bullet.position[1] == -100:

self.bullets.remove(bullet)

更新每个子弹的位置

for bullet in self.bullets:

bullet.update(time_passed)

绘制每个子弹

for bullet in self.bullets:

screen.blit(bullet.image, bullet.position)

param background_image_path: 背景图片的路径地址

param size: 游戏窗口的大小

param title: 游戏窗口的标题

param font_name: 指定字体

param font_size: 指定字体大小

param speed: 背景图滚动整个窗口一次所用时间,单位为ms

class Game():

def init(self, background_image_path, size=(480, 700), title=‘飞机大战’, font_name=‘方正舒体’, font_size=30, speed=2000):

self.size = size

self.screen = pygame.display.set_mode(size)

self.title = title

self.background_image_path = background_image_path

self.background = pygame.image.load(self.background_image_path).convert()

设置字体对象,得到系统中的字体

self.font = pygame.font.SysFont(font_name, font_size)

得到Clock对象,我们可以使用它来获取距离上次绘制图像的时间

self.clock = pygame.time.Clock()

背景图初始位置

self.height = 0

使用窗口的高度处于滚动的时间,就能得到每ms滚动的距离

self.every_ms_move_distance = self.size[1] / speed # 2秒

分数

self.score = 0

存放所有的敌机

self.enemies = []

显示分数, 在窗口的的最上方距离上边距10px, 左右居中。

def show_score(self):

是否开启锯齿模式 字体颜色 背景颜色

score = self.font.render(f’得分 : {self.score} ', True, (0,0,0), (255,255,255))

score_position_x = (self.size[0]-score.get_size()[0]) / 2

score_position_y = 10

self.screen.blit(score, (score_position_x, score_position_y))

控制画的帧

def set_time_passed(self):

控制画 的帧, 越大越快

self.clock.tick(1000)

得到上一次绘制图像到到现在的时间, ms

self.time_passed = self.clock.tick()

绘制背景图片,一直向下滚动,营造飞机一直往上面飞的感觉

def draw_background(self):

每次移动的距离 = 每ms移动的距离 * 上次到现在的时间(ms)

move_distance = self.every_ms_move_distance * self.time_passed

self.height += move_distance

如果超出窗口的高度,将height重置为零

if self.height >= self.size[1]:

self.height = 0

两张背景图一起显示,营造背景图不间断的一直滚动的效果

self.screen.blit(self.background, (0, -self.size[1] + self.height))

self.screen.blit(self.background, (0, self.height))

创建敌机

def create_enemy(self, image_path=os.path.join(source_dir,‘enemy1.png’), enemy_number=5):

‘’’

:param image_path: 敌机的图片地址

:param enemy_number: 最多有几个敌机在屏幕上

‘’’

if len(self.enemies) >= enemy_number:

return

enemy = Enemy(image_path=image_path)

self.enemies.append(enemy)

绘制敌机到屏幕上,清理跑出窗口的敌机。

def draw_enemies(self, time_passed, screen):

‘’’

:param time_passed: 上次绘制导向现在经过的时间

:param screen: 绘制的窗口对象

‘’’

清理跑出范围的敌机

for enemy in self.enemies:

当敌机跑出范围时,就将enemy.position[1]设置为-100了,所以我们这里判断enemy.position[1]==-100的,就是跑出范围的敌机

enemy.destroyed 为True, 表示敌机被子弹击中,也需要清理这个enemy

if enemy.position[1] == -100 or enemy.destroyed:

self.enemies.remove(enemy)

更新敌机位置

for enemy in self.enemies:

调用每一个敌机的update方法,改变敌机的位置

enemy.update(time_passed)

绘制敌机

for enemy in self.enemies:

根据敌机的位置,绘制敌机

screen.blit(enemy.image, enemy.position)

检测子弹是否击中敌机

def bullet_and_enemy_crash_detection(self, bullets):

‘’’

:param bullets: 飞机的所有子弹

‘’’

for bullet in bullets:

遍历每一个子弹

for enemy in self.enemies:

遍历每一个敌机,判断是否被击中

if bullet.position[0] >= enemy.position[0] and bullet.position[0] <= enemy.position[0]+enemy.image.get_size()[0]:

if bullet.position[1] >= enemy.position[1] and bullet.position[1] <= enemy.position[1] + enemy.image.get_size()[1]:

如果被击中,敌机开始自毁

enemy.start_destroy = True

子弹自毁,消失

bullet.destroyed = True

分数加一

self.score += 1

检测敌机与飞机是否相撞

def plan_and_enemy_crash_detection(self, plan, allow_crash_size=None):

‘’’

:param plan: 飞机对象

:param allow_crash_size: 允许飞机碰撞的大小,只有左右有效

‘’’

如果没有传入这个参数,赋值为飞机宽度的 10%

if allow_crash_size is None:

allow_crash_size = 0.1 * plan.image_size[0]

for enemy in self.enemies:

遍历每一个敌机, 检测是否碰撞

if enemy.position[0]+enemy.image.get_size()[0] - allow_crash_size >= plan.position[0] and enemy.position[0] <= plan.position[0]+plan.image.get_size()[0] - allow_crash_size:

if enemy.position[1] + enemy.image.get_size()[1] >= plan.position[1] and enemy.position[1] <= plan.position[1] + plan.image.get_size()[1]:

检测到碰撞,飞机开始自毁

plan.start_destroy = True

绘制飞机

def draw_plan(self, plan, time_passed):

‘’’

:param plan: 飞机对象

:param time_passed: 距离上次绘制的时间

:return:

‘’’

如果飞机开始自毁,调用自毁函数,显示自毁动画

if plan.start_destroy:

plan.show_destroy_animation(time_passed, destroy_time=1000)

self.screen.blit(plan.image, plan.position)

游戏结束

def game_over(self):

while True:

绘制背景图

self.set_time_passed()

self.draw_background()

text = self.font.render(f’游戏结束,得分 : {self.score} ', True, (0, 0, 0), (255, 255, 255))

text_position_x = (self.size[0] - text.get_size()[0]) / 2

text_position_y = (self.size[1] - text.get_size()[1]) / 2

self.screen.blit(text, (text_position_x, text_position_y))

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

sys.exit()

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_ESCAPE:

pygame.quit()

sys.exit()

pygame.display.update()

游戏入口函数,开始函数

def run(self):

‘’’

:return:

‘’’

设置游戏窗口的大小

pygame.display.set_caption(self.title)

初始化一个飞机对象

plan = Plan()

while True:

如果飞机自毁完成, 游戏结束, 调用game_over函数

if plan.destroyed:

self.game_over()

break

检测监听事件

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

sys.exit()

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_ESCAPE:

pygame.quit()

sys.exit()

如果用户的空格键弹起,说明用户按下过空格键,发射一颗子弹

elif event.type == pygame.KEYUP:

if event.key == pygame.K_SPACE:

调用plan.shut函数

plan.shut()

检测上下左右的移动案件.

w,a,s,d 和 上,下,左,右键都可以

然后执行plan.update函数,改变飞机的位置

key_pressed = pygame.key.get_pressed()

if key_pressed[pygame.K_w] or key_pressed[pygame.K_UP]:

plan.update(direction=Direction.UP)

elif key_pressed[pygame.K_s] or key_pressed[pygame.K_DOWN]:

plan.update(direction=Direction.DOWN)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

ng)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-DYrHDlI2-1711706837809)]

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>