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小游戏
“谁想出来的这么缺德的题目啊!!!!”一个声音在我心中回荡 这个题目很早就在课堂上公布了,我和我的小伙伴都惊呆了! 这是个毛?根本无从下手的感觉 总是觉得这个小游戏不是程序能给出答案的,因为我的第一印 ...
随机推荐
- pandas入门之DataFrame
创建DataFrame - DataFrame是一个[表格型]的数据结构.DataFrame由按一定顺序排列的多列数据组成.设计初衷是将Series的使用场景从一维拓展到多维.DataFrame既有行 ...
- 史上最详细的C语言和Python的选择排序算法
未经同意,请勿转载!如有收货,请留一赞,不胜感激! 同时欢迎加入我们的qq交流群:326079727 话不多说上代码: C语言: //选择排序走起 //原理:吃透原理再去实现,选择排序也是类似于冒泡排 ...
- 写给新手看的 MyBatis 入门
目录 MyBatis 使用前的准备 什么是 MyBatis 使用Maven 进行 MyBatis 开发环境搭建 MyBatis 入门 项目整体结构一览 MyBatis 的简单生命周期 1.获取 Sql ...
- Qt自定义委托在QTableView中绘制控件、图片、文字
自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...
- idea 使用maven 下载源码包
方式1:全量下载源码包 方式二:下载单个源码包 随便找个源码可以看到文件上有download (标识下载源码包) choose sources表示选择那个版本的源码包
- python小白之字典使用笔记
Python 字典(Dictionary) 字典是一种可变容器模型,且可存储任意类型对象. 每个键值 key=>value 对,用冒号 : 分割 每个键值对之间用逗号 , 分割 整个字典包括 ...
- 图解centos7如何关闭ipv6仅使用ipv4
方法/步骤 使用ifconfig命令查看网卡信息,如果出现inet6 fe80::20c:29ff:fed0:3514,说明机器开启了ipv6,如下图所示: 编辑/etc/sysctl.c ...
- iOS-SVPullToRefresh下拉刷新,上拉加载(转)
https://github.com/Sephiroth87/ODRefreshControl 类似刷新控件,类似qq动画的那种刷新. 一.下载第三方库 https://github.com/samv ...
- git clone、 remote、fetch、pull、push、remote
git clone命令笔记 作用:远程克隆版本库 1. 克隆版本库 git clone <版本库的网址> git clone zoran@192.168.2.167:/data/gitda ...
- windows下exfat无法写入怎么修复?
为了能够实现mac与windows文件共享,把移动硬盘格式化为exfat了,可是在osx中放入文件后,在windows上紧进行读取写入时出现错误,提示使用chkdsk进行修正,下面是修正步骤. 方法/ ...