Pygame游戏 —— 飞机大战

基本功能:

1.创建游戏窗口,效果如上图;

2.新增游戏配置脚本,将游戏的配置参数放置到游戏配置脚本中,如:游戏窗口大小、游戏背景图片路径等;

3.在游戏窗口中绘制背景图;

4.在游戏窗口中绘制主角飞机;

5.实现键盘控制主角飞机左右移动;

6.绘制主角飞机的子弹;

7.实现主角飞机发射子弹效果;

8.在游戏窗口上方生成一架敌机,并且敌机从上往下移动,当敌机移动到游戏窗口下方后(即超出游戏窗口范围),在游戏窗口上方重新生成一架敌机,循环往复;

9.当玩家飞机的子弹击中敌机后,销毁敌机,并且在游戏窗口上方重新生成一架敌机。

 

 

附加:

1.实现背景图片无限向下移动效果;

2.实现主角飞机的飞行动画;

3.实现敌机射击;

4.实现主角飞机被击中后,显示游戏结束;

5.实现主角飞机击毁10个敌机后,显示游戏胜利;

6.实现主角飞机的上下移动。

88b034e03928403ba0ff5f4dc3dc54cd.pngffe41bdfc9fd407c949c94b121939b46.png862d5f7565814e9294860537f6bb35bb.png

 

 

Game

#  游戏脚本,在这里封装游戏类,来编写游戏整体框架
import sys
import pygame

import Config
import DrawManager
from Config import screenSize

class Game(object):

    #开始游戏
    def Open(self):
        #  初始化pygame
        pygame.init()
        #  创建游戏窗口
        self.screen = pygame.display.set_mode(screenSize)
        #  加载背景图片
        '''
        self.bgImg = pygame.image.load('pygame图片素材/background.png')
        #self.bgImgRect = self.bgImg.get_rect()
        '''

        # 初始化游戏元素
        self.GameInit()


        #  进入游戏性主循环
        while True:
            #  (1)处理游戏事件
            self.GameEvent()
            #  (2)更新游戏状态
            self.GameUpdate()

            #  (3)刷新游戏屏幕
            pygame.display.flip()



    #  处理游戏事件
    def GameEvent(self):
        #  遍历游戏事件
        for event in pygame.event.get():
            #  判断是否有点击关闭按钮
            if event.type == pygame.QUIT:
                #  卸载Pygame,结束项目
                pygame.quit()
                sys.exit()
            #  判断是否有按下
            if event.type == pygame.KEYDOWN:
                # 上方向键
                if event.key == pygame.K_UP or event.key == pygame.K_w:
                    self.drawPlayer.up = True
                #  下方向键
                if event.key == pygame.K_DOWN or event.key == pygame.K_s:
                    self.drawPlayer.down = True
                #  左方向键
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    self.drawPlayer.left = True
                #  右方向键
                if event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    self.drawPlayer.right = True
            #  判断是否松开
            if event.type == pygame.KEYUP:
                # 上方向键
                if event.key == pygame.K_UP or event.key == pygame.K_w:
                    self.drawPlayer.up = False
                #  下方向键
                if event.key == pygame.K_DOWN or event.key == pygame.K_s:
                    self.drawPlayer.down = False
                #  左方向键
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    self.drawPlayer.left = False
                #  右方向键
                if event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    self.drawPlayer.right = False




    #  初始化游戏元素
    def GameInit(self):
        #  创建存放玩家飞机发射的子弹的容器(该容器是图片组)
        self.playerBullets = pygame.sprite.Group()
        #  创建游戏背景的对象
        self.drawBg = DrawManager.DrawBg(self.screen)
        #  创建玩家飞机
        self.drawPlayer = DrawManager.DrawPlayer(self.screen,self.playerBullets)
        #  创建存放敌机容器(该容器为图片组)
        self.enemys = pygame.sprite.Group()
        #  创建敌机子弹的容器(该容器为图片组)
        self.enemyBullets = pygame.sprite.Group()
        #  创建敌机管理器
        self.drawEnemyManager = DrawManager.DrawEnemyManager(self.screen, self.enemys, self.enemyBullets)
        #  创建游戏失败的游戏元素
        self.drawGameover = DrawManager.DrawGameOver(self.screen)
        #  创建游戏成功的游戏元素
        self.drawGamewin = DrawManager.DrawGameWin(self.screen)
        #  定义击败了多少个敌机
        self.count = 0









    #  更新游戏状态
    def GameUpdate(self):
        #  当达成游戏目标时,则弹出游戏胜利
        if self.count >= Config.gameTarget:
            #  绘制背景图片
            self.drawBg.Draw()
            #  绘制敌机管理器
            self.drawEnemyManager.Draw(True)
            #  绘制玩家飞机
            self.drawPlayer.Draw()
            #  绘制游戏胜利
            self.drawGamewin.Draw()
            return
        #  飞机处于正常状态
        if self.drawPlayer.state == '飞行中':
            #  碰撞检测函数
            self.GameCollision()

            #  绘制背景图片
            self.drawBg.Draw()

            #  绘制敌机管理器
            self.drawEnemyManager.Draw()

            #  绘制玩家飞机
            self.drawPlayer.Draw()
        #  飞机处于摧毁或已摧毁状态
        else:
            #  绘制背景图片(结束状态)
            self.drawBg.Draw(True)
            #  绘制敌机管理器(结束状态)
            self.drawEnemyManager.Draw(True)
            #  如果敌机处于损毁中的话,才绘制敌机
            if self.drawPlayer.state == '损毁中':
                self.drawPlayer.Draw()
            else:
                self.drawGameover.Draw()








    #  碰撞检测函数
    def GameCollision(self):
        #  检测玩家子弹与敌机是否有发生碰撞
        #  {有发生碰撞的子弹1:【跟子弹1有发生碰撞的敌机的列表】, 有发生碰撞的子弹2:【跟子弹2有发生碰撞的敌机的列表】}
        collider = pygame.sprite.groupcollide(self.playerBullets, self.enemys, False, False)
        #  遍历所有有发生碰撞的子弹,移除这些子弹
        for bullet in collider.keys():
            self.playerBullets.remove(bullet)
        #  遍历所有发生碰撞的敌机,移除这些敌机
        for enemys in collider.values():
            for enemy in enemys:
                #  判断敌机是否是第一次被攻击,如果是的话,我们才计数
                if enemy.obj.state == '飞行中':
                    self.count += 1
                    print(self.count, '/', Config.gameTarget)
                #  攻击敌机
                enemy.Damage()




        #  检测玩家飞机 与 敌军子弹是否发生碰撞
        #  [与玩家飞机发生了碰撞的子弹列表]
        collider1 = pygame.sprite.spritecollide(self.drawPlayer.sprite, self.enemyBullets, False)
        #  遍历子弹,来把碰撞到的敌机子弹移除
        for bullet in collider1:
            self.enemyBullets.remove(bullet)
        #  判断下,返回的碰撞列表中是否有子弹
        if len(collider1) > 0:
            #  让玩家飞机被攻击
            self.drawPlayer.Damage()




#  创建游戏对象
game = Game()
#  开始游戏
game.Open()

 

DrawManager

#  绘制管理脚本,存放 游戏元素的绘制类
import random
import pygame

import Animation
import Config
import time
from Animation import Animation

#  游戏元素

#  背景图片的绘制类
class DrawBg(object):
    #  构造函数
    def __init__(self, screen):
        #  加载背景图片1

        self.bgImg = pygame.image.load(Config.bgImg_filePath)
        self.bgImgRect = self.bgImg.get_rect()

        #  加载背景图片2

        self.bgImg2 = pygame.image.load(Config.bgImg_filePath)
        self.bgImgRect2 = self.bgImg2.get_rect()

        #  定义游戏窗口
        self.screen = screen

        self.screenRect = screen.get_rect()

        #  将背景图片2的初始位置放到背景图片1的上方
        self.bgImgRect2.bottom = self.bgImgRect.top



    #  绘制函数
    def Draw(self, isFinish = False):
        #  绘制背景图片
        self.screen.blit(self.bgImg,self.bgImgRect)
        #  绘制背景图片1
        self.screen.blit(self.bgImg2, self.bgImgRect2)
        if not isFinish:
            #  移动背景图片1、背景图片2
            speed = Config.bgImgSpeed
            self.bgImgRect.centery += speed
            self.bgImgRect2.centery += speed
            #  判断背景图片是否有超出游戏窗口下方
            if self.bgImgRect.top >= self.screenRect.bottom:
                self.bgImgRect.bottom = self.screenRect.top
            elif self.bgImgRect2.top >= self.screenRect.bottom:
                self.bgImgRect2.bottom = self.screenRect.top



#  主角飞机的绘制类
class DrawPlayer(object):
    #  构造函数,来加载主角飞机
    def __init__(self,screen,playerBullets):
        #  创建主角飞机图片对象
        self.sprite = pygame.sprite.Sprite()
        #  加载主角飞机图片,对象位置
        self.sprite.image = pygame.image.load(Config.playerImg_filePath)
        self.sprite.rect = self.sprite.image.get_rect()
        #  定义游戏窗口
        self.screen = screen
        self.screenRect = screen.get_rect()
        #  设置主角飞机初始位置:底部居中
        #  1)先让主角飞机居中
        self.sprite.rect.center = self.screenRect.center
        #  2)再让主角飞机底部对齐
        self.sprite.rect.bottom = self.screenRect.bottom
        #  定义玩家子弹容器
        self.playerBullets = playerBullets
        #  定义变量,记录当前时间
        self.timer = time.time()

        #  定义上下左右变量
        self.up = False
        self.down = False
        self.left = False
        self.right = False
        #  创建主角飞机的飞行动画对象  参数:存放动画的文件夹路径,游戏窗口
        self.moveAni = Animation(Config.playerMoveAni_path, screen, link_rect= self.sprite.rect)
        self.moveAni.playSpeed = Config.playerMoveAni_playSpeed
        self.moveAni.loop = Config.playerMoveAni_loop
        #  定义主角飞机飞行状态
        self.state = '飞行中'
        #  创建主角飞机的损毁动画
        self.damageAni = Animation(Config.playerDamageAni_path, screen, link_rect=self.sprite.rect)
        #  设置损毁动画的参数
        self.damageAni.playSpeed = Config.playerDamageAni_playSpeed
        self.damageAni.loop = Config.playerDamageAni_loop



    #  绘制函数,绘制主角飞机
    def Draw(self):
        if self.state == '飞行中':
            #  绘制主角飞机
            self.screen.blit(self.sprite.image, self.sprite.rect)
            #  发射子弹
            self.Shooting()
            #  移动主角飞机
            self.Move()
            #  播放动画
            self.moveAni.Play()
        #  否则,则执行损毁中的函数
        else:
            self.Damaging()

    #  主角飞机的移动控制函数
    def Move(self):
        speed = Config.playerSpeed
        #  根据上下左右的信号,控制主角飞机的移动
        if self.up:
            self.sprite.rect.centery -= speed
        elif self.down:
            self.sprite.rect.centery += speed
        if self.left:
            self.sprite.rect.centerx -= speed
        elif self.right:
            self.sprite.rect.centerx += speed


    #  发射子弹函数
    def Shooting(self):
        hit = Config.playHit     #  1秒发射子弹十次
        bulletSpeed = Config.playerBulletSpeed
        bulletImg_filePath = Config.playerBulletImg_filePath
        #  判断是否已经达到可以发射的时间
        if time.time() - self.timer >= 1/hit:
            #  如果达到时间要求,则生成一颗子弹
            bullet = DrawUpBullet(self.screen, self.sprite.rect, bulletSpeed, bulletImg_filePath)
            #  把子弹存储到子弹容器中去
            self.playerBullets.add(bullet.sprite)
            #  更新记录时间,方便计算下一颗子弹的时间
            self.timer = time.time()
        #  遍历子弹容器,绘制子弹
        for bullet in self.playerBullets.sprites():
            #  绘制子弹
            bullet.Draw()
        #  遍历子弹,来判断子弹是否超过游戏窗口的上边界
        temp = list(self.playerBullets.sprites()).copy()
        for bullet in temp:
            #  如果有超过,则将子弹容器中移除
            if bullet.rect.bottom <= self.screenRect.top:
                self.playerBullets.remove(bullet)



    #  玩家飞机被攻击方法
    def Damage(self):
        #  将玩家状态设置为损毁中
        if self.state == '飞行中':
            self.state = '损毁中'



    #  玩家飞机损毁中的方法
    def Damaging(self):
        #  播放损毁动画
        self.damageAni.Play()
        #  若播放完毕,则将状态设置为 已损毁
        if self.damageAni.isFinish:
            self.state = '已损毁'



#  向上发射的子弹绘制类
class DrawUpBullet(object):
    #  构造函数,加载子弹  参数:游戏窗口,飞机坐标位置,移动速度,子弹图片路径
    def __init__(self, screen, flyRect, speed, bulletImg_filePath):
        #  加载子弹图片
        #  (1)创建子弹图片对象
        self.sprite = pygame.sprite.Sprite()
        #  (2)给子弹图片对象,赋予图片,坐标位置
        self.sprite.image = pygame.image.load(bulletImg_filePath)
        self.sprite.rect = self.sprite.image.get_rect()
        #  定义游戏窗口
        self.screen = screen
        #  设置子弹初始位置:设置飞机的前进方向
        #  (1)设置子弹与飞机在同一个位置,也就是中心点相同
        self.sprite.rect.center = flyRect.center
        #  (2)将子弹的下边 跟 飞机的上边 同步
        self.sprite.rect.bottom = flyRect.top
        #  定义子弹速度
        self.speed = speed
        #  给图片对象增加一个Draw函数
        self.sprite.Draw = self.Draw



    #  绘制函数,绘制子弹
    def Draw(self):
        #  通过游戏窗口,绘制子弹
        self.screen.blit(self.sprite.image, self.sprite.rect)
        #  发射子弹
        self.sprite.rect.centery -= self.speed



#  向下发射的子弹绘制类
class DrawDownBullet(object):
    #  构造函数,加载子弹  参数:游戏窗口,飞机坐标位置,移动速度,子弹图片路径
    def __init__(self, screen, flyRect, speed, bulletImg_filePath):
        #  加载子弹图片
        #  (1)创建子弹图片对象
        self.sprite = pygame.sprite.Sprite()
        #  (2)给子弹图片对象,赋予图片,坐标位置
        self.sprite.image = pygame.image.load(bulletImg_filePath)
        self.sprite.rect = self.sprite.image.get_rect()
        #  定义游戏窗口
        self.screen = screen
        #  设置子弹初始位置:设置飞机的前进方向
        #  (1)设置子弹与飞机在同一个位置,也就是中心点相同
        self.sprite.rect.center = flyRect.center
        #  (2)将子弹的上边 跟 飞机的下边 同步
        self.sprite.rect.top = flyRect.bottom
        #  定义子弹速度
        self.speed = speed
        #  给图片对象增加一个Draw函数
        self.sprite.Draw = self.Draw



    #  绘制函数,绘制子弹
    def Draw(self):
        #  通过游戏窗口,绘制子弹
        self.screen.blit(self.sprite.image, self.sprite.rect)
        #  发射子弹
        self.sprite.rect.centery += self.speed



#  敌机绘制类
class DrawEnemy(object):
    #  构造函数  参数:游戏窗口,敌机子弹容器
    def __init__(self, screen, enemyBullets):
        #  加载敌机  参数:游戏窗口
        self.sprite = pygame.sprite.Sprite()
        self.sprite.image = pygame.image.load(Config.enemyImy_filePath)
        self.sprite.rect = self.sprite.image.get_rect()
        #  定义游戏窗口变量
        self.screen = screen
        self.screenRect = screen.get_rect()
        #  初始化敌机位置,设置敌机在游戏窗口上方生成
        self.sprite.rect.bottom = self.screenRect.top
        #  定义敌机子弹容器
        self.enemyBullets = enemyBullets
        #  定义变量,记录当前的时间
        self.timer = time.time()
        #  敌机状态:飞行中,损毁中,已损毁
        self.state = '飞行中'
        #  定义敌机损毁动画
        self.damageAni = Animation(Config.enemyDamageAni_path, self.screen, link_rect=self.sprite.rect)
        #  设置敌机损毁动画参数
        self.damageAni.playSpeed = Config.enemyDamageAni_playSpeed
        self.damageAni.loop = Config.enemyDamageAni_loop
        #  给敌机图片对象增加损毁的方法
        self.sprite.Damage = self.Damage
        self.sprite.obj = self



    #  绘制函数
    def Draw(self):
        self.screen.blit(self.sprite.image, self.sprite.rect)

    #  敌机攻击函数
    def Shooting(self):
        #  定义攻击频率变量hit
        hit = Config.enemyHit
        bulletSpeed = Config.enemyBulletSpeed
        bulletImg_filPath = Config.enemyBulletImg_filePath
        #  判断是否要生成下一个子弹
        if time.time() - self.timer > 1/hit:
            #  生成子弹
            bullet = DrawDownBullet(self.screen , self.sprite.rect, bulletSpeed, bulletImg_filPath)
            #  将子弹存放至容器
            self.enemyBullets.add(bullet.sprite)
            #  更新记录的时间,
            self.timer = time.time()



    #  移动参数  参数:uSpeed 向上移动速度,dSpeed 向下移动速度,lSpeed 向左移动速度,rSpeed 向右移动速度
    def Move(self, uSpeed = 0,dSpeed = 0, lSpeed = 0, rSpeed = 0):
        #  上下移动
        self.sprite.rect.centery -= uSpeed
        self.sprite.rect.centery += dSpeed
        #  左右移动
        self.sprite.rect.centerx -= lSpeed
        self.sprite.rect.centerx += rSpeed

    def Damage(self):
        #  将状态设置为损毁中的状态
        if self.state == '飞行中':
            self.state = '损毁中'

    def Damaging(self):
        #  播放损毁动画
        self.damageAni.Play()
        #  判断损毁动画是否播放完毕
        if self.damageAni.isFinish:
            #  将状态设置为已损毁状态
            self.state = '已损毁'



#  敌机管理绘制类
class DrawEnemyManager(object):
    #  构造函数  参数:游戏窗口,存放敌机的容器
    def __init__(self, screen, enemys, enemyBullets):
        #  定义游戏窗口变量
        self.screen = screen
        self.screenRect = screen.get_rect()
        #  定义敌机存放的容器
        self.enemys = enemys

        #  定义敌机子弹容器
        self.enemyBullets = enemyBullets


    #  绘制函数
    def Draw(self, isFinish = False):
        #  当游戏还没有结束时,调用敌机方案一来生成敌机
        if not isFinish:
            self.G1()
        #  绘制敌机
        self.DrawEnemy()
        #  绘制敌机子弹
        self.DrawEnemyBullet()


    #  绘制敌机函数
    def DrawEnemy(self):
        #  遍历敌机容器中的所有敌机
        for enemy in self.enemys:
            #  判断当前该敌机状态,如果是飞行中,则正常绘制
            if enemy.obj.state == '飞行中':
                #  绘制敌机
                enemy.obj.Draw()
                #  移动敌机
                enemy.obj.Move(dSpeed = Config.enemySpeed)
                #  敌机发射子弹
                enemy.obj.Shooting()

            #  若敌机当前处于摧毁中或已摧毁状态
            else:
                enemy.obj.Damaging()
        #  遍历所有敌机,检测敌机是否有超出游戏窗口下方,或者,敌机处于已摧毁的状态
        #  如果有,将该敌机移除
        temp = list(self.enemys.sprites()).copy()
        for enemy in temp:
            #  判断敌机的顶部top是否超出 游戏窗口的底部bottom
            if enemy.rect.top >= self.screenRect.bottom or enemy.obj.state =='已损毁':
                self.enemys.remove(enemy)



    #  绘制敌机子弹函数
    def DrawEnemyBullet(self):
        #  遍历敌机子弹容器绘制子弹
        for bullet in self.enemyBullets:
            # 绘制子弹
            bullet.Draw()
        #  再次遍历敌机子弹容器,来检测子弹是否有超出游戏窗口,如果有,则将他移除
        temp = list(self.enemyBullets.sprites()).copy()
        for bullet in temp:
            #  判断子弹是否有超出窗口下边
            if bullet.rect.top >= self.screenRect.bottom:
                self.enemyBullets.remove(bullet)



    #  随机敌机出生的x坐标
    def RandomX(self, enemyRect):
        #  先获得随机x坐标
        randomx = random.uniform(enemyRect.width/2, self.screenRect.right - enemyRect.width/2)
        #  然后再赋值
        enemyRect.centerx = randomx





    #  敌机方案一
    def G1(self):
        #  判断敌机容器中是否有敌机,若没有,则生成敌机
        if len(self.enemys) == 0:
            # 生成敌机
            self.enemy = DrawEnemy(self.screen, self.enemyBullets)
            #  随机敌机出生的x坐标
            self.RandomX(self.enemy.sprite.rect)
            #  将生成的敌机存到容器中去,方便后面与玩家子弹碰撞检测
            self.enemys.add(self.enemy.sprite)



#  游戏失败绘制类
class DrawGameOver(object):
    #  构造函数  参数:游戏窗口
    def __init__(self, screen):
        #  加载字体,显示游戏失败文本
        self.f = pygame.font.Font(Config.gameoverFont_path, Config.gameoverFont_size)
        self.text = self.f.render(Config.gameoverFont_content, True, Config.gameoverFont_color)
        self.textRect = self.text.get_rect()
        #  定义游戏窗口
        self.screen = screen
        self.screenRect = screen.get_rect()
        #  设置游戏失败文本的初始位置:居中
        self.textRect.center = self.screenRect.center


    #  绘制函数
    def Draw(self):
        self.screen.blit(self.text, self.textRect)





#  游戏胜利绘制类
class DrawGameWin(object):
    #  构造函数  参数:游戏窗口
    def __init__(self, screen):
        #  加载字体,显示游戏成功文本
        self.f = pygame.font.Font(Config.gamewinFont_path, Config.gamewinFont_size)
        self.text = self.f.render(Config.gamewinFont_content, True, Config.gamewinFont_color)
        self.textRect = self.text.get_rect()
        #  定义游戏窗口
        self.screen = screen
        self.screenRect = screen.get_rect()
        #  设置游戏胜利文本的初始位置:居中
        self.textRect.center = self.screenRect.center

    #  绘制函数
    def Draw(self):
        self.screen.blit(self.text, self.textRect)








Config

#  游戏配置脚本,存放游戏参数
screenSize = (480,752)
#  游戏背景图片的文件路径
bgImg_filePath = 'pygame图片素材\\background.png'
#  游戏背景图片下移速度
bgImgSpeed = 5

#  玩家飞机参数
#  玩家飞机图片路径
playerImg_filePath = 'pygame图片素材\\hero1.png'
#  玩家飞机速度
playerSpeed = 4
#  玩家飞机攻击频率
playHit = 1000
#  玩家飞机子弹速度
playerBulletSpeed = 10
#  玩家飞机子弹图片路径
playerBulletImg_filePath = 'pygame图片素材/bullet1.png'
#  玩家飞机动画
playerMoveAni_path = 'pygame图片素材/player_move'
#  玩家飞机动画播放速度
playerMoveAni_playSpeed = 50
#  玩家飞机动画循环播放
playerMoveAni_loop = True
#  玩家飞机摧毁动画的文件夹路径
playerDamageAni_path = 'pygame图片素材/here_blow up'
#  玩家损毁动画的播放速度
playerDamageAni_playSpeed = 10
#  玩家损毁动画循环播放
playerDamageAni_loop = False

#  敌机参数
#  敌机图片路径
enemyImy_filePath = 'pygame图片素材/enemy0.png'
#  敌机攻击频率
enemyHit = 2
#  敌机子弹速度
enemyBulletSpeed = 2
#  敌机子弹图片路径
enemyBulletImg_filePath = 'pygame图片素材/bullet.png'
#  敌机速度
enemySpeed = 1

#  敌机损毁动画的文件夹路径
enemyDamageAni_path = 'pygame图片素材/enemy0_down'
#  敌机损毁动画的播放速度
enemyDamageAni_playSpeed = 5
#  敌机损毁动画的循环播放
enemyDamageAni_loop = False

#  游戏失败字体路径
gameoverFont_path = r'C:\Windows\Fonts\STXINGKA.TTF'
#  游戏失败字体大小
gameoverFont_size = 145
#  游戏失败字体颜色
gameoverFont_color = 'red'
#  游戏失败文本内容
gameoverFont_content = 'GameOver'


#  游戏胜利字体路径
gamewinFont_path = r'C:\Windows\Fonts\STXINGKA.TTF'
#  游戏胜利字体大小
gamewinFont_size = 150
#  游戏胜利字体颜色
gamewinFont_color = 'red'
#  游戏胜利文本内容
gamewinFont_content = 'Victory'


#  游戏目标值
gameTarget = 10

Animation

# 封装动画类,来让我们的动画的播放写的代码更加简单一些
import os
import time
from pygame import sprite
from pygame import image


# 动画类
class Animation(object):

    # 构造函数 参数:动画图片存放路径,播放速度(1秒内播放多少张图片),绑定外面的区域坐标rect
    def __init__(self, filePath, screen, playSpeed=1, loop=True, link_rect=None):
        # 根据动画图片存放路径,来加载图片
        # 1.创建图片组
        # self.group = sprite.Group()
        self.group = []
        # 2.获取该路径下的图片名称  os.listdir(存放路径) 获取存放路径下的所有文件的名称
        filenames = os.listdir(filePath)
        # 3.遍历这些文件名称,来加载这些文件
        for name in filenames:
            # 试着去加载图片,如果是图片的话,则加载并存放到图片组中,如果不是图片,则加载下一个文件
            try:
                # (1)创建图片对象
                s = sprite.Sprite()
                # (2)给图片对象加载本地图片
                s.image = image.load(filePath + '/' + name)
                # (3)给图片对象加载区域坐标
                s.rect = s.image.get_rect()
                # (4)存放到图片组中
                self.group.append(s)
            except:
                pass
        # 4.变量来记录经过了当前的时间
        self.timer = time.time()
        # 5.创建当前动画播放的图片对象
        if len(self.group) > 0:
            self.currentSprite = sprite.Sprite()
            self.currentSprite.image = self.group[0].image
            if link_rect is None:
                self.currentSprite.rect = self.group[0].rect
            else:
                self.currentSprite.rect = link_rect
        # 6.创建一个变量,记录当前播放的图片索引
        self.currentIndex = 0
        # 7.定义播放速度
        self.playSpeed = playSpeed
        # 8.定义是否循环播放
        self.loop = loop
        # 9.定义游戏窗口
        self.screen = screen
        # 10.动画是否播放完毕
        self.isFinish = False

    # 编写动画播放的函数
    def Play(self):
        # 第一步,判断是否有图片要播放
        if len(self.group) == 0:
            # 如果没有图片的话,则不播放
            return
        # 切换动画图片
        self.__SwitchAniamtionImg()
        # 绘制动画图片
        self.screen.blit(self.currentSprite.image, self.currentSprite.rect)

    # 切换动画图片
    def __SwitchAniamtionImg(self):
        # 第一步,判断是否循环播放,且是否播放完毕
        # 如果不循环播放,且播放完毕了,则不切换下一张动画图片
        if not self.loop and self.isFinish:
            return
        # 第二步,判断经过的时间,是否超过一张图片播放的时间 1/self.playerSpeed=>1张图片播放的时间
        if time.time() - self.timer >= 1 / self.playSpeed:
            # 图片索引号加一
            self.currentIndex += 1
            # 第三步,判断图片索引号是否超过 图片组的索引界限
            if self.currentIndex >= len(self.group):
                # 如果是循环播放的话,则把图片切换到第一张图片的索引号
                if self.loop:
                    self.currentIndex = 0
                    self.isFinish = False
                # 如果它是不循环播放的话,则把图片切换到最后一张图片的索引号
                else:
                    self.currentIndex = len(self.group) - 1
                    self.isFinish = True
            # 把当前播放的图片 切换到下一张图片
            self.currentSprite.image = self.group[self.currentIndex].image
            # 更新记录的时间,方便计算下一张图片的播放时长
            self.timer = time.time()

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的飞机大战游戏pygame代码示例,你可以参考一下: ```python import pygame import random pygame.init() # 设置游戏窗口大小 screen = pygame.display.set_mode((480, 700)) # 设置游戏标题 pygame.display.set_caption("飞机大战") # 定义颜色 BLACK = pygame.Color(0, 0, 0) WHITE = pygame.Color(255, 255, 255) GREEN = pygame.Color(0, 255, 0) RED = pygame.Color(255, 0, 0) # 加载背景图片 bg = pygame.image.load("background.png") # 加载飞机图片 player_img = pygame.image.load("player.png") # 加载敌机图片 enemy_img = pygame.image.load("enemy.png") # 加载子弹图片 bullet_img = pygame.image.load("bullet.png") # 设置字体 font = pygame.font.SysFont("arial", 36) # 定义玩家飞机类 class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = player_img self.rect = self.image.get_rect() self.rect.centerx = 240 self.rect.bottom = 680 self.speed = 5 self.bullets = pygame.sprite.Group() def update(self): key_pressed = pygame.key.get_pressed() if key_pressed[pygame.K_LEFT]: self.rect.x -= self.speed if key_pressed[pygame.K_RIGHT]: self.rect.x += self.speed if key_pressed[pygame.K_SPACE]: bullet = Bullet(self.rect.centerx, self.rect.top) self.bullets.add(bullet) def draw(self, surface): surface.blit(self.image, self.rect) self.bullets.draw(surface) def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.top) self.bullets.add(bullet) # 定义子弹类 class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = bullet_img self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -10 def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill() # 定义敌机类 class Enemy(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = enemy_img self.rect = self.image.get_rect() self.rect.x = random.randint(0, 480 - self.rect.width) self.rect.y = random.randint(-100, -50) self.speed = random.randint(3, 8) def update(self): self.rect.y += self.speed if self.rect.top > 700: self.kill() # 创建精灵组 all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() player = Player() all_sprites.add(player) # 设置游戏帧率 clock = pygame.time.Clock() FPS = 60 # 游戏循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 更新玩家飞机 player.update() # 创建敌机 if random.randint(0, 60) == 0: enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) # 更新所有精灵 all_sprites.update() # 碰撞检测 hits = pygame.sprite.groupcollide(enemies, player.bullets, True, True) for hit in hits: enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) hits = pygame.sprite.spritecollide(player, enemies, False) if hits: text = font.render("Game Over", True, RED) screen.blit(text, (240 - text.get_rect().width // 2, 300)) pygame.display.update() pygame.time.delay(2000) pygame.quit() exit() # 绘制背景 screen.blit(bg, (0, 0)) # 绘制所有精灵 all_sprites.draw(screen) # 更新屏幕 pygame.display.update() # 控制游戏帧率 clock.tick(FPS) ``` 以上是一个非常简单的飞机大战游戏pygame代码示例,你可以根据自己的需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值