Pygame小游戏练习四
@Python编程从入门到实践 Python项目练习
九、添加Play按钮
一、创建Button类
先让游戏一开始为非活动状态
# game_stats.py
# --snip--
self.game_active = False
# def reset_stats(self):
# --snip--
button类为带标签的实心矩形,将“play”字符串渲染为图像,放在矩形上方居中
# button.py
import pygame.font
class Button():
def __init__(self, ai_settings, screen, msg):
"""初始化按钮的属性"""
self.screen = screen
self.screen_rect = screen.get_rect()
# 设置按钮的尺寸和其他属性
self.width, self.height = 200, 50
self.button_color = (0, 0, 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
# 按钮的标签只需创建一次,即将字符串msg渲染为图像
self.prep_msg(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 # 使文字形成的图像居中
def draw_button(self):
# 绘制一个用颜色填充的按钮,再绘制文本图像,使其在上方
self.screen.fill(self.button_color, self.rect)
self.screen.blit(self.msg_image, self.msg_image_rect)
二、绘制按钮
在alien_invasion.py中创建实例,修改up_screen(),让游戏处于非活动状态显示按钮
# alien_invasion.py
# --snip--
# 创建play按钮
play_button = Button(ai_settings, screen, "Play")
# 开始游戏主循环
while True:
# --snip--
# 每次循环重绘窗口并更新屏幕
gf.update_screen(ai_settings, screen, stats, ship, passenger_group, bullet_group,play_button)
# game_functions.py
# --snip--
# 如果游戏处于非活动状态,就绘制Play按钮
if not stats.game_active:
play_button.draw_button()
# --snip--
三、点击按钮
玩家点击按钮时,应重置游戏统计信息,保证下次游戏不重复。而且,只有在游戏激活状态为False时,点击才有效。
# game_functions.py
# for event in pygame.event.get():
# if event.type == pygame.QUIT:
# sys.exit()
# --snip--
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(ai_settings, screen, stats, play_button, ship,
passenger_group, bullet_group, mouse_x, mouse_y)
def check_play_button(ai_settings, screen, stats, play_button, ship,
passenger_group, bullet_group, mouse_x, mouse_y):
"""在玩家单击Play按钮时开始游戏"""
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active: # 检查鼠标点击位置是否在play范围内
# 隐藏光标
pygame.mouse.set_visible(False)
# 重置游戏统计信息
stats.reset_stats()
stats.game_active = True
# 清空外星人列表和子弹列表
passenger_group.empty()
bullet_group.empty()
# 创建一群新的外星人,并在飞船居中
create_fleet(ai_settings, screen, ship, passenger_group)
ship.center_ship()
注意,修改alien_invasion.py中,check_events的形参,与game_functions.py中的同步。
十、提高游戏难度
通过修改乘客、飞机移动速度不断增加游戏难度。
重构setting 类设置选项分为动态设置和静态设置,每一次消灭全部乘客后,将速度乘以speedup_scale。
# settings.py
class Settings(object):
"""设置所有设置的类"""
def __init__(self):
"""初始化游戏的静态设置"""
# 屏幕设置
self.screen_width = 600
self.screen_height = 400
self.bg_color = (255, 255, 255)
# 飞船设置
self.ship_limit = 3
# 子弹设置
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60, 60, 60
self.bullet_group_allowed = 3
# 乘客设置
self.fleet_drop_speed = 7
# 以什么样的速度加快游戏的节奏
self.speedup_scale = 1.1
self.initialize_dynamic_settings()
def initialize_dynamic_settings(self):
"""初始化随游戏进行而变化的动态设置"""
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.passenger_speed_factor = 1
# fleet_direction为1表示向右移动,为-1表示向左移动
self.fleet_direction = 1
def increase_speed(self):
"""提高速度的设置"""
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.passenger_speed_factor *= self.speedup_scale
# game_functions.py
# def check_bullet_passenger_collisions(ai_settings, screen, ship, passenger_group,
# bullet_group):
# if len(passenger_group) == 0:
# --snip--
# 删除现有子弹并新建一波新的乘客, 并加快游戏速度
# bullet_group.empty()
ai_settings.increase_speed()
# game_functions.py
# def check_play_button(ai_settings, screen, stats, play_button, ship,
# passenger_group, bullet_group, mouse_x, mouse_y):
# """在玩家单击Play按钮时开始游戏"""
# button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
# if button_clicked and not stats.game_active: # 检查鼠标点击位置是否在play范围内
# 重置游戏速度设置
ai_settings.initialize_dynamic_settings()
# --snip--
Pygame小游戏练习四的更多相关文章
- pygame小游戏之坦克大战
以前在学校的时候无聊的学了会pygame.看了大概一周的教学视频,做出来个坦克大战的小游戏 Python3.5 pycharm import pygame,sys,time from random ...
- Pygame小游戏练习二
@Python编程从入门到实践 Python项目练习 四.创建Ship类 建立ship.py,创建Ship类,管理飞船行为. # ship.py import pygame class Ship(): ...
- web版扫雷小游戏(四)
~~~接上篇,游戏的主体框架完成了,接下来我们对游戏中存在的两个主要实体进行分析,一个是雷点类BombObject(节点对象),一个是节点对象对应的图片对象BombImgObject,根据第一篇的介绍 ...
- Pygame小游戏练习五
@Python编程从入门到实践 Python项目练习 十一.显示游戏得分及最高分 创建新类Scoreboard,用以显示得分和最高分. # scoreboard.py import pygame.fo ...
- Pygame小游戏练习三
@Python编程从入门到实践 Python项目练习 七.创建Passenger类 创建passenger.py文件,创建Passenger类,控制乘客属性和行为 # passenger.py imp ...
- Pygame小游戏练习一
@Python编程从入门到实践 Python项目练习 一.安装Python包Pygame 通过pip安装包工具安装 python3 -m pip --version #查看是否安装pip 确定安装pi ...
- python小游戏-pygame模块
一.tkinter模块的GUI 基本上使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinter模块中我们需要的东西. 创建一个顶层窗口对象并用它来承载整个GUI应用. 在顶层窗口对象上 ...
- Python小游戏——外星人入侵(保姆级教程)第一章 01创建Pygame窗口 02创建设置类Setting()
系列文章目录 第一章:武装飞船 01:创建Pygame窗口以及响应用户输入 02:创建设置类Setting() 一.前期准备 1.语言版本 Python3.9.0 2.编译器 Pycharm2022 ...
- 第四次作业——WORDSEARCH小游戏
“谁想出来的这么缺德的题目啊!!!!”一个声音在我心中回荡 这个题目很早就在课堂上公布了,我和我的小伙伴都惊呆了! 这是个毛?根本无从下手的感觉 总是觉得这个小游戏不是程序能给出答案的,因为我的第一印 ...
随机推荐
- Ubuntu14.04 dd命令克隆系统镜像安装到另一台机器上
linux系统如果想做备份还原,使用ghost的时候经常出现问题,后来发现可以直接使用dd命令完成硬盘的克隆和还原.当拷贝完硬盘后,就可以拿这个硬盘放到其它设备上跑了.也就是完成了“烧写”了. 用U盘 ...
- c 判断是否为nan
/* isnan example */ #include <stdio.h> /* printf */ #include <math.h> /* isnan, sqrt */ ...
- Servlet中接收和返回数据
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest re ...
- [Windows]Visual Studio Code个人配置
编辑器要添加的 settings.json 打开这个: { ,//编辑字号 "files.autoSave": "afterDelay",//自动保存 &quo ...
- redis数据结构有哪些
1.String 可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作. 2.list 一个链表, ...
- Mac OS 下三种修改Hosts文件的方法
一.系统偏好设置修改 1.打开系统偏好设置,底部有一个Hosts的快捷入口2.输入ip和hostname后,回车确定,勾选改host即可 二.终端命令行修改 sudo vi /etc/hosts ...
- Add hyperlink to textblock wpf
Add hyperlink to textblock wpf Displaying is rather simple, the navigation is another question. XAML ...
- python项目生成及导入依赖的第三方库
requirements.txt用来记录项目所有的依赖包和版本号,只需要一个简单的pip命令就能完成. pip freeze >requirements.txt 然后就可以用 pip insta ...
- Win7 双系统安装Centos7,并由windows引导程序引导
1. 在windows磁盘管理中,压缩卷,腾出40G,需保证一个磁盘设备最多只有3个主分区2. 网上下载centos7的dvd.iso3. 使用UltraISO刻录到U盘4. 重启系统F12使用usb ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_01-自定义查询页面-服务端-Dao
在页面输入查询条件,查询符合条件的页面信息. 查询条件如下: 站点Id:精确匹配 模板Id:精确匹配 页面别名:模糊匹配 spring mongoDB如何自定义条件 在Repository的findA ...