python及pygame雷霆战机游戏项目实战09 玩家飞机添加血条

简介: python及pygame雷霆战机游戏项目实战09 玩家飞机添加血条

项目详细介绍


项目详细介绍

在这个系列中,将制作一个雷霆战机游戏。

image.png


添加血条


现在,玩家被一次敌机击中后摧毁。这不是很有趣,所以要为玩家添加一个属性shield,数值类型,范围0 - 100。

class Player(pygame.sprite.Sprite):
    def __init__(self):
        self.speedx = 0
        self.shield = 100

现在,每次玩家被流星击中时,都可以从血条中减去一点。当血条达到0时,玩家将被摧毁。为了让事情更有趣,可以通过使用敌机的radius属性使大型敌机比小型敌机造成更大的伤害。


破坏玩家


目前,mob-versus-player碰撞代码非常简单:

# check to see if a mob hit the player
    hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)
    if hits:
        running = False

改成:

# check to see if a mob hit the player
    hits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)
    for hit in hits:
        player.shield -= hit.radius * 2
        if player.shield <= 0:
            running = False

改变了spritecollide函数的第三个参数(False改为了True),希望流星碰到后自动删除,因为如果不这样做,那么敌机将继续存在,当它移动时,下一帧会和玩家发生另一次碰撞,依此类推。

此外,玩家可能同时碰到多个敌机,因此hits可以有多个项目。循环hits,根据每个敌机半径扣除玩家每次被碰到后失去的血条。最后,如果玩家的血条达到0,游戏将结束。

由于正在删除任何击中玩家的怪物,正在减少游戏中的怪物总数。希望保持不变,所以每当移除一个时,需要产生一个新的暴徒。初始化时这样产生了怪物集合:

for i in range(8):
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)

每当移除一个怪物时,需要做同样的事情,这是重复的代码,定义一个函数:

def newmob():
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)

现在可以在游戏开始时调用该功能,当子弹击中暴徒时调用该功能,以及当需要更换击中玩家的暴徒时调用该功能:

for i in range(8):
    newmob()
# check to see if a bullet hit a mob
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
    score += 50 - hit.radius
    random.choice(expl_sounds).play()
    newmob()
# check to see if a mob hit the player
hits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)
for hit in hits:
    player.shield -= hit.radius * 2
    newmob()
    if player.shield <= 0:
        running = False

有血条变量的值,而且它有效,但除非玩家能看到这个值,否则它不是很有用。需要创建一个显示,但不是只显示数字,将制作一个条形图,显示血条的满/空:

def draw_shield_bar(surf, x, y, pct):
    if pct < 0:
        pct = 0
    BAR_LENGTH = 100
    BAR_HEIGHT = 10
    fill = (pct / 100) * BAR_LENGTH
    outline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT)
    fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)
    pygame.draw.rect(surf, GREEN, fill_rect)
    pygame.draw.rect(surf, WHITE, outline_rect, 2)

此函数与draw_text之前定义的函数类似。它接受位置参数(x, y)和填充量参数pct。将绘制两个矩形:第一个是白色轮廓,第二个是绿色填充部分。在游戏循环的绘图部分添加了对此函数的调用:

draw_text(screen, str(score), 18, WIDTH / 2, 10)
draw_shield_bar(screen, 5, 5, player.shield)


image.png

项目源码及资源


获取地址

目录
相关文章
|
1月前
|
IDE 开发工具 Python
Python扑克游戏编程---摸大点
Python扑克游戏编程---摸大点
|
2月前
|
Python
python编写下象棋游戏|4-14
python编写下象棋游戏|4-14
|
2月前
|
人工智能 算法 图形学
总有一个是你想要的分享40个Python游戏源代码
这是一系列基于Python开发的游戏项目集合,包括中国象棋、麻将、足球、坦克大战、扑克等多种类型游戏,运用了Pygame等库实现图形界面与AI算法。此外还包含迷宫、数独、推箱子等益智游戏及经典游戏如《仙剑奇侠传二战棋版》和《星露谷物语》的Python版本,适合编程学习与娱乐。
106 11
|
1月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
70 0
|
2月前
|
消息中间件 数据采集 数据库
庆祝吧!Python IPC让进程间的合作,比团队游戏还默契
【9月更文挑战第7天】在这个数字化时代,软件系统日益复杂,单进程已难以高效处理海量数据。Python IPC(进程间通信)技术应运而生,使多进程协作如同训练有素的电竞战队般默契。通过`multiprocessing`模块中的Pipe等功能,进程间可以直接传递数据,无需依赖低效的文件共享或数据库读写。此外,Python IPC还提供了消息队列、共享内存和套接字等多种机制,适用于不同场景,使进程间的合作更加高效、精准。这一技术革新让开发者能轻松应对复杂挑战,构建更健壮的软件系统。
36 1
|
3月前
|
机器学习/深度学习 存储 定位技术
强化学习Agent系列(一)——PyGame游戏编程,Python 贪吃蛇制作实战教学
本文是关于使用Pygame库开发Python贪吃蛇游戏的实战教学,介绍了Pygame的基本使用、窗口初始化、事件处理、键盘控制移动、以及实现游戏逻辑和对象交互的方法。
|
6月前
|
存储 Python
如何使用Python实现“猜数字”游戏
本文介绍了使用Python实现“猜数字”游戏的过程。游戏规则是玩家在给定范围内猜一个由计算机随机生成的整数,猜对则获胜。代码中,首先导入random模块生成随机数,然后在循环中获取玩家输入并判断大小,提供猜小、猜大提示。通过增加猜测次数限制、难度选择、优化输入提示和图形化界面等方式可优化游戏。这篇文章旨在帮助初学者通过实际操作学习Python编程。
256 2
|
6月前
|
IDE 开发工具 Python
用python写出一个猜数字游戏
用python写出一个猜数字游戏
71 4
|
Python
Python实现猜数字游戏
Python实现猜数字游戏
135 0
|
6月前
|
Python
用 Python 写一个猜数字游戏并运行它
用 Python 写一个猜数字游戏并运行它
35 0