首页 > 编程语言 >【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本

【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本

时间:2025-01-15 12:57:57浏览次数:3  
标签:鹰击长空 self boss 小游戏 pygame frames 源代码 frame rect

【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本

背景

之前优雅草央千澈在AE特效制作处博文已经完整介绍了本款游戏的素材开发,本文开始把素材利用起来放进去,本游戏命名为鹰击长空,Eagles strike across the sky,简称名字ESAS!

内容概要

·加入boss机
·将图像换成png序列图(AE开发博文制作的AE特效)
·规范资源文件目录加入static
·代码开源发布

开源源代码下载地址

鹰击长空-飞机大战game开源项目: 鹰击长空-飞机大战game开源项目-优雅草央千澈飞机大战项目,开源,可游玩,持续更新!游戏名字Eagles strike across the sky,鹰击长空,简称名字ESAS!!!本game持续更新,提供更新记录,以及开发记录,详情可以搜索关注优雅草央千澈的博客

游戏运行包

还未打包,下个版本稍微完整在打包。

完善飞机大战小游戏-换上制作的特效序列png图片-加入boss机

换上png特效序列图

接上一篇,

pygame.image.load(f”explosion_{i}.png”).提示我们要加载序列图

首先我们把素材都放进去,但是我们直接放根目录肯定不太对,因此我们安规矩建立目录 \static\png 我们放进去

额外建立img是预留来放背景素材等内容。

导入所有的素材,首先我们修改爆炸序列图,原来的代码

# 加载爆炸动画序列
explosion_frames = []
for i in range(10):  # 假设有10帧
    frame = pygame.image.load(f"explosion_{i}.png").convert_alpha()
    explosion_frames.append(frame)

修改后:

# 加载爆炸动画序列
explosion_frames = []
for i in range(15):  # 假设有15帧,从00到14
    frame = pygame.image.load(f"img/png/explosion{i:02d}.png").convert_alpha()
    explosion_frames.append(frame)

再次运行

报错,嗷嗷,马虎了 我的文件名是”static, 修改后再次运行

成功,但是我飞机爆炸的画面实在是太大了,不关心,后面再改

接下来把其他几个部分也改掉,

# 加载玩家动画序列
player_frames = []
for i in range(12):  # 假设有12帧,从player_100.png到player_111.png
    frame = pygame.image.load(f"static/png/player_{100 + i:03d}.png").convert_alpha()
    player_frames.append(frame)

# 加载敌人动画序列
enemy_frames = []
for i in range(10):  # 假设有10帧,从boss00.png到boss09.png
    frame = pygame.image.load(f"static/png/boss{i:02d}.png").convert_alpha()
    enemy_frames.append(frame)

# 加载子弹动画序列
bullet_frames = []
for i in range(6):  # 假设有6帧,从bullet0.png到bullet5.png
    frame = pygame.image.load(f"static/png/bullet{i}.png").convert_alpha()
    bullet_frames.append(frame)

改造后代码

# 玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = player_frames
        self.frame = 0
        self.image = self.frames[self.frame]
        self.rect = self.image.get_rect(center=(player_x, player_y))
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 100  # 每100毫秒切换一帧

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= player_speed
        if keys[pygame.K_RIGHT] and self.rect.right < screen_width:
            self.rect.x += player_speed

        # 更新动画帧
        now = pygame.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame = (self.frame + 1) % len(self.frames)
            self.image = self.frames[self.frame]

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        bullets.add(bullet)  # 使用 add 方法将子弹添加到组中
        bullet_sound.play()

# 子弹类
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.frames = bullet_frames
        self.frame = 0
        self.image = self.frames[self.frame]
        self.rect = self.image.get_rect(center=(x, y))
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 100  # 每100毫秒切换一帧

    def update(self):
        self.rect.y -= bullet_speed
        if self.rect.bottom < 0:
            self.kill()

        # 更新动画帧
        now = pygame.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame = (self.frame + 1) % len(self.frames)
            self.image = self.frames[self.frame]

# 敌人类
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = enemy_frames
        self.frame = 0
        self.image = self.frames[self.frame]
        self.rect = self.image.get_rect(center=(random.randint(50, screen_width - 50), -50))
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 100  # 每100毫秒切换一帧

    def update(self):
        self.rect.y += enemy_speed
        if self.rect.top > screen_height:
            self.kill()

        # 更新动画帧
        now = pygame.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame = (self.frame + 1) % len(self.frames)
            self.image = self.frames[self.frame]

# 爆炸类
class Explosion(pygame.sprite.Sprite):
    def __init__(self, center):
        super().__init__()
        self.frames = explosion_frames
        self.frame = 0
        self.image = self.frames[self.frame]
        self.rect = self.image.get_rect(center=center)
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 50

    def update(self):
        now = pygame.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame += 1
            if self.frame == len(self.frames):
                self.kill()
            else:
                center = self.rect.center
                self.image = self.frames[self.frame]
                self.rect = self.image.get_rect(center=center)

改造后的类,哎哟妈呀再次运行吓一跳

图像太大了,我们得改下他的大小,这个步骤的话我们就在AE中处理了。

改变类的尺寸调整游戏整体大小

因为是飞机游戏,因此我们宽高改一下,720*1280

对AI魔法;限制玩家类Player的图像宽高分别是150px ,150px ,限制子弹类Bullet的图像宽高分别为50px,50px ,限制敌人类的图像高分别为80px,80px ,

frame = pygame.transform.scale(frame, (150, 150))  # 调整为150x150像素

大概就是加这段代码,

我们分别加上。

再次运行,满意,不过我发现个问题,把boss机和小敌机搞反了,反了就反了吧、因为不影响美观,还是很好看。

为对方加入BOSS机,设定为10秒出场

为对方加入BOSS机,设定为10秒出场,为啥要设定是10秒出场只是为了看看效果,后续直接改就行。

先把小飞机的图像换了,这次我们加入boss机,其次我们加入boss机肯定需要加入一个强大的背景音乐咯,因此, 我们加入背景音乐

还记得free sounds吗?找到个非常好听 非常紧张的boss音乐,我加入进去

建立sound 目录,放入我们的音乐文件

施法 :为游戏中加入敌人机BOSS,增加boss这个类,boss在游戏开始的10秒后进入战场,进入战场的时候加入背景音乐,背景音乐的文件目录为boss.wav

然后 再修改,加入boss类

# BOSS 类
class Boss(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = [pygame.image.load(f"static/png/boss{i:02d}.png").convert_alpha() for i in range(15)]
        self.frame = 0
        self.image = self.frames[self.frame]
        self.rect = self.image.get_rect(center=(screen_width // 2, -100))
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 100  # 每100毫秒切换一帧
        self.health = 100  # BOSS 的生命值

    def update(self):
        # 移动 BOSS
        self.rect.y += 2  # BOSS 向下移动

        # 更新动画帧
        now = pygame.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame = (self.frame + 1) % len(self.frames)
            self.image = self.frames[self.frame]

        # 检查 BOSS 是否超出屏幕
        if self.rect.top > screen_height:
            self.kill()

然后加入游戏主循环中,

# 游戏主循环
boss_spawned = False
boss_spawn_time = 10000  # 10秒后生成BOSS

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()

    # 更新所有精灵
    all_sprites.update()
    all_enemies.update()

    # 生成敌人
    if random.randint(1, 100) < 5:
        enemy = Enemy()
        all_enemies.add(enemy)
        all_sprites.add(enemy)

    # 检测碰撞
    hits = pygame.sprite.groupcollide(all_enemies, bullets, True, True)
    for hit in hits:
        explosion = Explosion(hit.rect.center)
        all_sprites.add(explosion)

    # 检测 BOSS 是否生成
    if not boss_spawned and pygame.time.get_ticks() > boss_spawn_time:
        boss = Boss()
        all_sprites.add(boss)
        all_enemies.add(boss)
        boss_spawned = True
        pygame.mixer.music.load("boss.wav")  # 加载背景音乐
        pygame.mixer.music.play(-1)  # 播放背景音乐,-1表示循环播放

    # 绘制屏幕
    screen.fill((0, 0, 0))
    all_sprites.draw(screen)
    pygame.display.flip()

    # 控制帧率
    clock.tick(60)

# 退出游戏
pygame.quit()
sys.exit()

完成,再次测试。

笑死了 boss直接飞上来撞我脸上了,因此要改造boss,boss进入后在上方,

# BOSS 类
class Boss(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = [pygame.image.load(f"static/png/boss{i:02d}.png").convert_alpha() for i in range(15)]
        self.frame = 0
        self.image = self.frames[self.frame]
        self.rect = self.image.get_rect(center=(screen_width // 2, -100))
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 100  # 每100毫秒切换一帧
        self.health = 100  # BOSS 的生命值
        self.move_direction = 1  # 1 表示向右移动,-1 表示向左移动
        self.move_speed = 2  # BOSS 的移动速度
        self.shoot_delay = 1000  # 发射子弹的间隔时间(毫秒)
        self.last_shot = pygame.time.get_ticks()  # 上一次发射子弹的时间

    def update(self):
        # 移动 BOSS
        self.rect.y += 2  # BOSS 向下移动
        if self.rect.top > 0:
            self.rect.x += self.move_speed * self.move_direction
            if self.rect.right > screen_width or self.rect.left < 0:
                self.move_direction *= -1  # 改变移动方向

        # 更新动画帧
        now = pygame.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame = (self.frame + 1) % len(self.frames)
            self.image = self.frames[self.frame]

        # 发射子弹
        if now - self.last_shot > self.shoot_delay:
            self.last_shot = now
            self.shoot()

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.bottom)
        bullets.add(bullet)  # 使用 add 方法将子弹添加到组中

修改boss的类,再修改主循环,笑死了 这次出来 boss直接爆炸了,好本文到这里,大家可以持续关注和学习如何开发游戏欢迎给优雅草央千澈点赞收藏加关注,下篇我们完善下boss的打斗机制,主角机的打斗机制,背景画面,以及第一张关卡的内容,完成游戏开发目录专业分类。

标签:鹰击长空,self,boss,小游戏,pygame,frames,源代码,frame,rect
From: https://blog.csdn.net/dujiangdu123/article/details/145119450

相关文章

  • 【python游戏】最经典的五个小游戏(完整代码)
    文章目录前言案例1:猜数字游戏案例2:石头剪刀布游戏案例3:使用pygame的简单打砖块游戏案例4:井字棋(Tic-Tac-Toe)案例5:贪吃蛇游戏(使用pygame)前言当然,我可以为你提供五个简单的Python游戏案例。这些游戏涵盖了不同的难度和类型,从文本冒险到简单的图形界面游戏。......
  • 【MATLAB代码】CV和CA模型组成的IMM(滤波方式为UKF),可复制粘贴源代码
    该代码实现了一维无迹卡尔曼滤波器(UKF)与交互式多模型(IMM)结合的状态估计。代码分为多个部分,主要功能包括参数定义、观测数据生成、状态估计、模型更新以及结果可视化。文章目录运行结果程序代码主要功能代码结构应用场景注意事项运行结果程序代码下方......
  • 如何安全地修改网站源代码的时间戳?
    要安全地修改网站源代码的时间戳,请遵循以下最佳实践:备份现有文件:在任何实质性操作之前,务必先备份当前文件。可以选择物理备份或逻辑备份,视具体情况而定。理解影响范围:仔细评估即将做出的更改会对哪些应用程序产生影响。特别是那些依赖于特定时间戳的应用,比如缓存机制、版本控制......
  • 如何在线修改已上线网站的源代码?
    有时需要对已上线的网站进行紧急修复或功能改进,直接在线修改源代码是最快速的方法之一。解决方案:使用FTP/SFTP:通过FTP/SFTP工具连接到服务器,下载并修改文件后再上传。这是最常用的方式,适合大多数网站。通过后台编辑器:某些CMS平台(如WordPress、PbootCMS)提供在线代码编辑器,可以......
  • AI磁力聚星提现生成器小游戏提现截图带动态带音效辅助的自定义提现截图生成工具技术研
    AI辅助的自定义提现截图生成工具技术文献本文介绍了一种基于人工智能技术的自定义提现截图生成工具,该工具旨在为用户提供一种便捷、高效的方式来生成磁力小游戏提现截图。通过该工具,用户可以自定义截图内容,包括金额、时间等关键信息,并支持录屏功能,以满足用户在社交媒体分享时......
  • cgroup与systemd: 通过src rpm获取systemd源代码,添加日志并使用rpmbuild重新打包
    问题起源服务跑在富容器中。容器使用init进程作为一号进程,然后用systemd管理所有service。在做一次升级时,nginx启动脚本有更新,原来是root拉起,现在进行了去root改造,使用nginx用户拉起。升级过程中,发现nginx进程无法被拉起,报错:"RefusingtoacceptPIDoutsideofservicecon......
  • 用java做一个有关方块切换的小游戏
    闲暇时间利用自己所写的知识写了一个简单的小游戏,该游戏我暂且叫它方块切换,玩法也很简单,大致是,点击一个方格,然后这个方格以及它相邻的方格都会在黑白色中切换,获胜条件就是把所有的黑色块变为白色块就算赢了。以下是游戏效果图:具体实现代码如下:SwitchBlock类代码importja......
  • 数字猜猜小游戏
      游戏中首先使用随机对象产生一个1~100之间的整数,当用户单击“开始”按钮时,动态生成100个按钮,并开始计时,如果用户单击的数字大于随机数,那么被单击的按钮变为红色,并显示字符串“大”:如果用户单击的数字小于随机数,那么被单击的按钮变为红色,并显示字符串“小”:如果单击的数字......
  • 网站源代码修改教程
    修改网站源代码需要一定的编程知识,以下是详细的教程:准备工具:FTP工具(如FileZilla)文本编辑器(如VSCode、SublimeText)备份文件:使用FTP工具登录到服务器。找到需要修改的文件,下载到本地并备份。编辑文件:使用文本编辑器打开文件。根据需求修改代码,例如更改文字、调......
  • 项目50:简易健康问卷调查【源代码】 --- 《跟着小王学Python·新手》
    项目50:简易健康问卷调查【源代码】—《跟着小王学Python·新手》《跟着小王学Python》是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的核心概念。通过开发游戏、构建Web应用......