找回密码
 立即注册
首页 业界区 安全 pygame小游戏飞机大战_14绘制文字

pygame小游戏飞机大战_14绘制文字

崆蛾寺 昨天 18:05
在Manager中加入文字函数:
  1. def drawText(self,text,x,y,textHeight=30,fontColor=(225,0,0),backgroudColor=None):
  2.     # 通过字体文件获取字体对象
  3.     font_obj = pygame.font.Font('freesansbold.ttf', textHeight)
  4.     # 配置要显示的文字
  5.     text_obj = font_obj.render(text, True, fontColor, backgroudColor)
  6.     # 获取要显示的对象的rect
  7.     text_rect = text_obj.get_rect()
  8.     # 设置显示对象的坐标
  9.     text_rect.topleft = (x, y)
  10.     # 绘制字到指定区域
  11.     self.screen.blit(text_obj, text_rect)
复制代码
在循环中引入文字:
  1. while True:
  2.     # 把背景图片贴到窗口
  3.     # self.screen.blit(self.background, (0, 0))
  4.     # 移动地图
  5.     self.map.move()
  6.     # 把地图贴到窗口上
  7.     self.map.draw()
  8.     # 遍历所有的事件
  9.     for event in pygame.event.get():
  10.         # 判断事件类型如果是pygame的退出
  11.         if event.type == pygame.QUIT:
  12.             self.exit()
  13.     # 绘制文字
  14.     self.drawText('hp:10000',0,0)
复制代码
 完整代码:
  1. # 引入random
  2. import random
  3. # 引入pygame
  4. import pygame
  5. # 引入time模块
  6. import time
  7. # 引入pygame中的所有方法
  8. from pygame.constants import K_UP, K_RIGHT, K_DOWN, K_LEFT, K_w, K_a, K_s, K_d, K_SPACE
  9. # 定义初始为向右
  10. direction = "right"
  11. # 引入敌方飞机的类
  12. class Enemy(pygame.sprite.Sprite):
  13.     def __init__(self, screen):
  14.         # 调用继承精灵初始化方法
  15.         pygame.sprite.Sprite.__init__(self)
  16.         # 引入图片创建敌人
  17.         self.enemy = pygame.image.load("./images/enemy1.png")
  18.         self.image = self.enemy
  19.         # 设置速度变量
  20.         self.speed = 10  # 降低速度使游戏可玩
  21.         # 根据图片进行获取矩形对象
  22.         self.rect = self.image.get_rect()
  23.         self.rect.topleft = [0, 0]
  24.         self.x = 0
  25.         self.y = 0
  26.         # 使screen变为飞机类的一个属性
  27.         self.screen = screen
  28.         # 定义装子弹的精灵组
  29.         self.bullets = pygame.sprite.Group()
  30.     def display(self):
  31.         self.screen.blit(self.enemy, (self.rect.left, self.rect.top))
  32.         # 改为使用精灵组的方法绘制子弹
  33.         self.bullets.update()  # 更新子弹位置
  34.         self.bullets.draw(self.screen)  # 绘制子弹
  35.     # 定义移动飞机的方法
  36.     def auto_move(self):
  37.         # 将direction改为全局变量
  38.         global direction
  39.         # 判断方向进行移动
  40.         if direction == "right":
  41.             self.rect.right += self.speed
  42.         if direction == "left":
  43.             self.rect.right -= self.speed
  44.         # 定义碰壁时调整移动方向
  45.         if self.rect.right >= 480 - 51:
  46.             direction = "left"
  47.         if self.rect.right <= 0:
  48.             direction = "right"
  49.     def update(self):
  50.         self.auto_fire()
  51.         self.auto_move()
  52.         self.display()
  53.     # 定义自动开火的方法
  54.     def auto_fire(self):
  55.         # 使用随机数函数进行随机抽取一个1到10的一个随机数
  56.         random_number = random.randint(1, 40)
  57.         # 当随机数为8时创建子弹
  58.         if random_number == 8:
  59.             # 创建单个子弹
  60.             bullet = EnemyBullet(self.screen, self.rect.left, self.rect.top)
  61.             # 将子弹放入列表中
  62.             self.bullets.add(bullet)
  63. # 引入飞机的类
  64. class Plane(pygame.sprite.Sprite):
  65.     # 创建玩家的方法,引入screen模块
  66.     def __init__(self, screen):
  67.         # 引入图片创建玩家
  68.         self.player = pygame.image.load("./images/me1.png")
  69.         self.image = self.player
  70.         # 设置速度变量
  71.         self.speed = 5
  72.         # 调用继承精灵初始化方法
  73.         pygame.sprite.Sprite.__init__(self)
  74.         # 根据图片进行获取矩形对象
  75.         self.rect = self.image.get_rect()
  76.         self.rect.topleft = [179, 500]
  77.         self.x = 179
  78.         self.y = 500
  79.         # 使screen变为飞机类的一个属性
  80.         self.screen = screen
  81.         # 定义装子弹的列表
  82.         self.bullets = pygame.sprite.Group()
  83.     # 定义update方法包含检测指令和绘制
  84.     def update(self):
  85.         self.key_control()
  86.         self.display()
  87.     # 创建玩家移动的方法
  88.     def key_control(self):
  89.         # 判断按下键盘事件,对玩家x,y坐标进行调整使玩家移动
  90.         key_pressed = pygame.key.get_pressed()
  91.         if key_pressed[K_w] or key_pressed[K_UP]:
  92.             self.rect.top -= self.speed
  93.         if key_pressed[K_d] or key_pressed[K_RIGHT]:
  94.             self.rect.right += self.speed
  95.         if key_pressed[K_a] or key_pressed[K_LEFT]:
  96.             self.rect.left -= self.speed
  97.         if key_pressed[K_s] or key_pressed[K_DOWN]:
  98.             self.rect.bottom += self.speed
  99.         if key_pressed[K_SPACE]:
  100.             # 按下空格键发射子弹
  101.             bullet = Bullet(self.screen, self.rect.left, self.rect.top)
  102.             # 将子弹存入列表
  103.             self.bullets.add(bullet)
  104.     def display(self):
  105.         # 绘制玩家
  106.         self.screen.blit(self.player, self.rect)
  107.         # 更新子弹坐标
  108.         self.bullets.update()
  109.         # 绘制所有子弹到屏幕
  110.         self.bullets.draw(self.screen)
  111. # 引入敌人子弹的类
  112. class EnemyBullet(pygame.sprite.Sprite):
  113.     def __init__(self, screen, x, y):
  114.         # 调用继承精灵初始化方法
  115.         pygame.sprite.Sprite.__init__(self)
  116.         # 引入子弹图片
  117.         self.image = pygame.image.load("./images/bullet2.png")
  118.         # 根据图片进行获取矩形对象
  119.         self.rect = self.image.get_rect()
  120.         self.rect.topleft = [x + 29 - 2, y + 43]
  121.         self.x = x + 29 - 2
  122.         self.y = y + 43
  123.         # 显示窗口
  124.         self.screen = screen
  125.         # 定义速度
  126.         self.speed = 4
  127.     def update(self):
  128.         # 修改子弹坐标
  129.         self.rect.top += self.speed
  130.         # 如果子弹出界,销毁子弹
  131.         if self.rect.top > 700:
  132.             self.kill()
  133. # 引入子弹的类
  134. class Bullet(pygame.sprite.Sprite):
  135.     def __init__(self, screen, x, y):
  136.         # 调用继承精灵初始化方法
  137.         pygame.sprite.Sprite.__init__(self)
  138.         # 引入子弹图片
  139.         self.image = pygame.image.load("./images/bullet1.png")
  140.         # 根据图片进行获取矩形对象
  141.         self.rect = self.image.get_rect()
  142.         self.rect.topleft = [x + 51 - 2, y]
  143.         self.x = x + 51 - 2
  144.         self.y = y
  145.         # 显示窗口
  146.         self.screen = screen
  147.         # 定义速度
  148.         self.speed = 10
  149.     def update(self):
  150.         # 修改子弹坐标
  151.         self.rect.top -= self.speed
  152.         # 如果子弹出界,销毁子弹
  153.         if self.rect.top < -22:
  154.             self.kill()
  155. # 定义音乐的类
  156. class GameSound(object):
  157.     def __init__(self):
  158.         # 初始化主程序
  159.         pygame.mixer.init()
  160.         # 引入背景音乐
  161.         pygame.mixer.music.load("./sound/game_music.ogg")
  162.         # 调整声音大小
  163.         pygame.mixer.music.set_volume(0.5)
  164.         self.__bomb = pygame.mixer.Sound('./sound/get_bomb.wav')
  165.     def playBombSound(self):
  166.         pygame.mixer.Sound.play(self.__bomb)
  167.     def PlayMusic(self):
  168.         # 开始播放音乐
  169.         pygame.mixer.music.play(-1)
  170. #  定义碰撞的类
  171. class Bomb(object):
  172.     # 初始化碰撞
  173.     def __init__(self, screen, type):
  174.         self.screen = screen
  175.         if type == "enemy":
  176.             # 加载爆炸资源
  177.             self.mImage = [pygame.image.load("./images/enemy1_down" + str(v) + ".png") for v in range(1, 5)]
  178.         else:
  179.             # 加载爆炸资源
  180.             self.mImage = [pygame.image.load("./images/me_destroy_" + str(v) + ".png") for v in range(1, 5)]
  181.         # 设置当前爆炸播放索引
  182.         self.mIndex = 0
  183.         # 爆炸位置
  184.         self.mPos = [0, 0]
  185.         # 是否可见
  186.         self.mVisible = False
  187.     def action(self, rect):
  188.         # 触发爆炸方法draw
  189.         # 爆炸的坐标
  190.         self.mPos[0] = rect.left
  191.         self.mPos[1] = rect.top
  192.         # 打开爆炸的开关
  193.         self.mVisible = True
  194.         # 重置索引
  195.         self.mIndex = 0
  196.     def draw(self):
  197.         if not self.mVisible:
  198.             return
  199.         # 绘制当前爆炸帧
  200.         self.screen.blit(self.mImage[self.mIndex], (self.mPos[0], self.mPos[1]))
  201.         # 更新索引
  202.         self.mIndex += 1
  203.         if self.mIndex >= len(self.mImage):
  204.             self.mVisible = False
  205.             self.mIndex = 0
  206. class BackGround :
  207.     # 初始化地图
  208.     def __init__(self,screen):
  209.         self.mImage1 = pygame.image.load("./images/background.png")
  210.         self.mImage2 = pygame.image.load("./images/background.png")
  211.         # 窗口
  212.         self.screen = screen
  213.         # 辅助移动
  214.         self.y1 =0
  215.         # 衔接地图y轴
  216.         self.y2 =-Manager.bg_size[1]
  217.     def draw(self):
  218.         self.screen.blit(self.mImage1,(0,self.y1))
  219.         self.screen.blit(self.mImage2,(0,self.y2))
  220.     def move(self):
  221.         self.y1+=2
  222.         self.y2 += 2
  223.         if self.y1 >= Manager.bg_size[1]:
  224.             self.y1=0
  225.         if self.y2 >= 0:
  226.             self.y2 = -Manager.bg_size[1]
  227. class Manager(object):
  228.     bg_size = (480,700)
  229.     def __init__(self):
  230.         pygame.init()
  231.         # 创建窗口
  232.         self.screen = pygame.display.set_mode(Manager.bg_size, 0, 32)
  233.         # 创建背景图片
  234.         #self.background = pygame.image.load("./images/background.png")
  235.         self.map = BackGround(self.screen)
  236.         # 初始化一个装玩家精灵的group
  237.         self.players = pygame.sprite.Group()
  238.         # 初始化一个装敌机精灵的group
  239.         self.enemys = pygame.sprite.Group()
  240.         # 初始化一个玩家爆炸的对象
  241.         self.player_bomb = Bomb(self.screen, 'player')
  242.         # 初始化一个敌机爆炸的对象
  243.         self.enemy_bomb = Bomb(self.screen, 'enemy')
  244.         # 初始化一个声音播放的对象
  245.         self.sound = GameSound()
  246.     def exit(self):
  247.         print('退出')
  248.         pygame.quit()
  249.         exit()
  250.     def new_player(self):
  251.         # 创建飞机对象 添加到玩家的组
  252.         player = Plane(self.screen)
  253.         self.players.add(player)
  254.     def new_enemy(self):
  255.         # 创建敌机的对象 添加到敌机的组
  256.         enemy = Enemy(self.screen)
  257.         self.enemys.add(enemy)
  258.     def drawText(self,text,x,y,textHeight=30,fontColor=(225,0,0),backgroudColor=None):
  259.         # 通过字体文件获取字体对象
  260.         font_obj = pygame.font.Font('freesansbold.ttf', textHeight)
  261.         # 配置要显示的文字
  262.         text_obj = font_obj.render(text, True, fontColor, backgroudColor)
  263.         # 获取要显示的对象的rect
  264.         text_rect = text_obj.get_rect()
  265.         # 设置显示对象的坐标
  266.         text_rect.topleft = (x, y)
  267.         # 绘制字到指定区域
  268.         self.screen.blit(text_obj, text_rect)
  269.     def main(self):
  270.         # 播放背景音乐
  271.         self.sound.PlayMusic()
  272.         # 创建一个玩家
  273.         self.new_player()
  274.         # 创建一个敌机
  275.         self.new_enemy()
  276.         while True:
  277.             # 把背景图片贴到窗口
  278.             # self.screen.blit(self.background, (0, 0))
  279.             # 移动地图
  280.             self.map.move()
  281.             # 把地图贴到窗口上
  282.             self.map.draw()
  283.             # 遍历所有的事件
  284.             for event in pygame.event.get():
  285.                 # 判断事件类型如果是pygame的退出
  286.                 if event.type == pygame.QUIT:
  287.                     self.exit()
  288.             # 绘制文字
  289.             self.drawText('hp:10000',0,0)
  290.             # 玩家飞机和子弹的显示
  291.             self.players.update()
  292.             # 敌机和子弹的显示
  293.             self.enemys.update()
  294.             # 绘制爆炸效果
  295.             self.player_bomb.draw()
  296.             self.enemy_bomb.draw()
  297.             # 刷新窗口内容
  298.             pygame.display.update()
  299.             time.sleep(0.01)
  300.             # 判断碰撞
  301.             iscollide = pygame.sprite.groupcollide(self.players, self.enemys, True, True)
  302.             if iscollide:
  303.                 items = list(iscollide.items())[0]
  304.                 print(items)
  305.                 x = items[0]
  306.                 y = items[1][0]
  307.                 # 玩家爆炸图片
  308.                 self.player_bomb.action(x.rect)
  309.                 # 敌机爆炸图片
  310.                 self.enemy_bomb.action(y.rect)
  311.                 # 重新创建玩家和敌机
  312.                 self.new_player()
  313.                 self.new_enemy()
  314.                 # 加入声音
  315.                 self.sound.playBombSound()
  316. if __name__ == "__main__":
  317.     # 初始化pygame
  318.     pygame.init()
  319.     manager = Manager()
  320.     manager.main()
复制代码
演示如下:
1.gif

 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册