在本篇文章中,主要学习如何在Pygame中绘制按钮,并点击按钮开始游

一、编程思路

1.1 修改游戏活动状态

在上篇文章中,我们通过game_active标志来控制游戏的进行与停止。我们需要在点击“play”按钮后游戏才开始运行。因此将game_active = False。游戏在开始时处于非活动状态,等待点击play后运行。

def __init__(self, ai_settings):"""初始化统计信息"""self.ai_settings = ai_settingsself.reset_stats()# 让游戏一开始处于非活动状态self.game_active = False

1.2 创建Button类

pygame中没有内置创建按钮的方法,故我们采取最原始的方法绘制一个带标签的矩形。
button,py

import pygame.font
class Button():def __init__(self, ai_settings, screen, msg):"""初始化按钮的属性"""self.screen = screenself.screen_rect = screen.get_rect()#设置按钮的尺寸和其他属性self.width, self.height = 200, 50self.button_color = (0, 255, 0)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 48)#创建按钮的rect对象,居中self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.center#按钮的标签只需创建一次self.prep_msg(msg)

pygame.font的作用是将文本渲染到屏幕上,msg是显示按钮里的文本。

    def prep_msg(self, msg):"""将msg渲染为图像,并使其在按钮上居中"""self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.center

prep_msg()将参数和文字渲染为msg,调用font.render()把msg中的文本转换为图像,存储在msg_image中,让文本图像在按钮上居中。

    def draw_button(self):#绘制一个用颜色填充的按钮,再绘制文本self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)

draw_button()将按钮显示到屏幕上。
最后再alien_invasion.py中引入Button类,创建Play按钮,在gf.update_screen()中添加play_button实参,就可以在屏幕上显示button按钮了。

#创建play按钮play_button = Button(ai_settings, screen, "Play")"""游戏主循环"""while True:"""监视键鼠事件"""gf.check_events(ai_settings, screen, ship, bullets)if stats.game_active:ship.update()#print(len(bullets))gf.update_bullets(ai_settings, screen, ship, aliens, bullets)gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)gf.update_screen(ai_settings, screen, stats, ship,aliens, bullets, play_button)

修改update_screen(),如果game_active为false,就绘制play按钮。

def update_screen(ai_settings, screen, stats, ship, aliens, bullets,play_button):"""更新屏幕上的图像,并切换到新屏幕"""--snip--# 如果游戏处于非活动状态,就绘制Play按钮if not stats.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()

运行效果如下:

1.3 添加鼠标响应事件

修改check_events()的定义,在其中添加了形参stats和play_button。使用stats来访问标志game_active,并使用play_button来检查玩家是否单击了Play按钮。
通过pygame.mouse.get_pos()来获得鼠标单击时的xy坐标,判断该坐标是否处于“play”按钮的rect坐标,如果处于就认为单击了按钮,game_active = True,游戏开始。

def check_events(ai_settings, screen, stats, play_button, ship, bullets):#键鼠响应for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(stats, play_button, mouse_x,mouse_y)

在alien_invasion.py中调用check_events(),需要传递另外两个实参——stats和play_button

    while True:"""监视键鼠事件"""gf.check_events(ai_settings, screen, stats, play_button,ship, bullets)

1.4 重置游戏

在1.3中我们添加了单击按钮开始游戏,但是没有处理游戏结束的情况。在玩家每次点击play按钮时都重置游戏,我们在check_play_button()中重置统计信息、删除现有的外星人和子弹、创建一群新的外星人,并让飞船居中。

def check_play_button(ai_settings, screen, stats,play_button, ship, aliens,bullets, mouse_x, mouse_y):"""单击按钮时开始新游戏"""if play_button.rect.collidepoint(mouse_x, mouse_y):#重置游戏统计信息stats.reset_stats()stats.game_active = True#清空外星人列表和子弹列表aliens.empty()bullets.empty()#创建一群新的外星人create_fleet(ai_settings,screen,ship,aliens)ship.center_ship()

再修改check_events()和check_play_button()的形参。

def check_events(ai_settings, screen, stats, play_button, ship, aliens,bullets):#键鼠响应for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats,play_button, ship,aliens,bullets, mouse_x, mouse_y)

alien_invasion.py

"""监视键鼠事件"""gf.check_events(ai_settings, screen, stats, play_button, ship,aliens, bullets)

1.5 隐藏按钮和光标

在游戏运行时,即便按钮不可见,但只要鼠标单击原来按钮所在的游戏时还是会做出响应。因此我们将响应条件改为在game_active=False时才开始。同理光标得修改也如此。

def check_play_button(ai_settings, screen, stats,play_button, ship, aliens,bullets, mouse_x, mouse_y):"""单击按钮时开始新游戏"""button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:#隐藏光标pygame.mouse.set_visible(False)#重置游戏统计信息stats.reset_stats()stats.game_active = True#清空外星人列表和子弹列表aliens.empty()bullets.empty()#创建一群新的外星人create_fleet(ai_settings,screen,ship,aliens)ship.center_ship()

在游戏结束后,我们需要重新显示光标,能够点击按钮,故将ship_hit()函数修改如下:

def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):"""响应被外星人撞到的飞船"""if stats.ships_left > 0:#将ships_left减1stats.ships_left -= 1#清空外星人列表和子弹列表aliens.empty()bullets.empty()#创建新的外星人create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()#暂停sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)

基于pygame的射击小游戏制作(五)绘制开始按钮相关推荐

  1. 基于pygame的射击小游戏制作(一)让飞船动起来

    基于pygame的射击小游戏制作(一)让飞船动起来 一.文件结构 alien_invasion.py 是整个系统的主文件,用来创建游戏中的一系列对象,ai_settings存储设置.screen存储显 ...

  2. 基于pygame的射击小游戏制作(二)射击子弹

    在本篇文章中,将学习如何创建子弹移动的元素,如何在屏幕中让子弹向上飞驰,如何删除超过屏幕边界的子弹. 1.编程思路 1.1 创建一个子弹 功能描述:玩家将按空格键时发射子弹,子弹在屏幕中向上穿行,抵达 ...

  3. 基于pygame的射击小游戏制作(四)击杀外星人

    在本篇文章中,主要学习射击子弹时外星人消失,达到击杀外星人的效果 一.编程思路 1.1击杀 我们需要在碰撞发生后让外星人立即消失,故在更新子弹的位置后检测碰撞.我们创建一个字典,这个字典的每一个键都是 ...

  4. 基于pygame的射击小游戏制作(三)让外星人动起来

    在本篇文章中,将学习如何创建一群外星人,如何使用嵌套循环来创建元素网格,如何移动外星人 1.编程思路 1.1 创建外星人 创建Alien.py 文件,该文件配置与Ship.py类似,每个外星人最初都出 ...

  5. 基于Pygame的Python小游戏,《这是一场滑稽与阴险的较量》

    选用贴吧最火的表情包滑稽和阴险表情包,肯定都认得出吧,背景由胡大佬提供,添加了很多细节,一款射击闯关类小游戏,滑稽会不断逼近阴险,在这之前你必须把阴险全部击落,左上角是你的生命,被滑稽撞到则减少一生命 ...

  6. 基于pygame做的小游戏

    最近一边学习pygame模块一边做了个小游戏,完成功能如下: 鼠标右键控制移动 人物跟随鼠标方向转动 鼠标左键控制攻击 动画效果 血量计数效果 画面比较乱入,请自行过滤.直接上代码: # coding ...

  7. 基于pygame的滑雪小游戏

    import pygame import sys import random from pygame.locals import * class SkierClass(pygame.sprite.Sp ...

  8. 微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹

    微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹 在资源管理器中复制炮弹,重命名为敌人坦克的炮弹. 修改敌方坦克的积木 给敌方坦克炮弹添加事件 现在,敌方坦克已经可以自动发射炮弹啦. 下一篇文章:微信 ...

  9. 五个基于Google Earth的小游戏

    五个基于Google Earth的小游戏 Google Earth是互联网巨头Google公司于2005年推出的一款虚拟地球仪软件,它把卫星照片.航空照相和地理信息系统布置在一个地球的三维模型上,使用 ...

最新文章

  1. linux中bash的功能主要有,Linux系统中的Bash功能的介绍
  2. python字符串逆序输出代码_一行代码实现字符串逆序输出
  3. 在Spring中使用jOOQ:CRUD
  4. TensorFlow 2.0和PyTorch谁更好?大牛们争了好几天
  5. java io类型_Java NIO之Java中的IO分类
  6. python画十字_Python解决十字消除棋
  7. 统一身份认证系统方案
  8. 简单的Charles抓包ios微信网页
  9. e站app里站hosts_流浪e站
  10. 【求职】江苏省 2020 年大学生核心就业能力培训笔记
  11. 对比excel,轻松学习python数据分析(读书笔记1-3章)
  12. python多态_python多态和规范
  13. opc客户端读取数据品质是bad_如何通过OPC自定义接口来实现客户端数据的读取
  14. 【Linux 网络】IP校验和计算相关
  15. NO.74——《人工智能·一种现代方法》通过搜索进行问题求解 学习笔记
  16. 爬取马蜂窝英国旅行攻略
  17. SQL计算连续登陆天数大于等于3天的用户
  18. Star CCM+ 如何创建自己的物性参数数据库
  19. 校园IP网络广播方案
  20. 万字长文|如何定义“失败的产品经理”

热门文章

  1. Linear_algebra_02_行列式
  2. Python爬虫学习系列教程
  3. SQLiteHelper
  4. Are We Ready for SDN? Implementation Challenges for Software-Defined Networks
  5. Conputer Vision-边缘检测-OpenCV实践
  6. Mac下给sublime text3配置Nodejs
  7. Oracle12c安装出错
  8. C#控制管理VisualSVN Server
  9. 用extjs4做个登录框
  10. jsp怎么连接mysql_jsp如何连接数据库!