Python小游戏——外星人入侵(保姆级教程)第一章 06让飞船移动
系列文章目录
第一章:武装飞船
06:让飞船移动
一、驾驶飞船
下面来让玩家能够左右移动飞船。我们将编写代码,在用户按左或右箭头键时做出响应。我们将首先专注于向右移动,再使用同样的原理来控制向左移动。通过这样做,你将学会如何控制屏幕图像的移动。
二、让飞船移动
1.代码及注释(笔记)
(笔记在代码的注释中!!!)
A:修改文件:game_functions.py
点击查看代码
#渗透小红帽python的学习之路
#外星人入侵小游戏
#game_functions.py
#存储让游戏运行的函数
import sys
import pygame
def check_events(ship): # 在玩家按右箭头时需要将飞船向右移动,
# 所以给函数加上了形参ship
for event in pygame.event.get(): # 监听键盘和鼠标事件
if event.type == pygame.QUIT:
sys.exit()
#修改alien_invasion.py,使其导入game_functions
#并将事件循环替换为对函数check_events()的调用
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
#移动飞船
ship.moving_right = True
#玩家按下右箭头键时标志设为true
elif event.key == pygame.K_LEFT:
ship.moving_left = True
# 玩家按下左箭头键时标志设为true
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
ship.moving_right = False
# 玩家松开右箭头键时标志设为false
elif event.key == pygame.K_LEFT:
ship.moving_left = False
# 玩家松开左箭头键时标志设为false
def update_screen(ai_settings,screen,ship):
# 将更新屏幕的代码移到此处
screen.fill(ai_settings.bg_color) # 每次循环都会重绘屏幕
ship.blitme() # 每次循环时重新绘制飞船
pygame.display.flip() # 让最近绘制的屏幕可见
# 然后修改alien_invasion.py

B:修改文件:alien_invasion.py
点击查看代码
#渗透小红帽python的学习之路
#外星人入侵小游戏
#创建pygame窗口以及响应用户输入
import sys
#模块sys用来退出游戏
import pygame
from settings import Setting
#导入刚创建的设置类
from ship import Ship
#导入管理飞船行为的类
import game_functions as gf
def run_game():
pygame.init() #初始化屏屏幕对象
ai_settings = Setting()
# 创建Setting类的实例,并存储在ai_settings变量中
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) #创建显示窗口
pygame.display.set_caption("Alien Invasion")
ship = Ship(screen) #绘制一艘飞船
#开始游戏主循环
while True:
gf.check_events(ship)
ship.update()
# 飞船移动已经设置完成
gf.update_screen(ai_settings,screen,ship)
run_game()
# 代码重构完成

C:修改文件:ship.py
点击查看代码
#渗透小红帽python的学习之路
#外星人入侵小游戏
#ship.py
#管理飞船行为的类
import pygame
class Ship():
def __init__(self,screen):
#参数screen用来指定将飞船绘制到什么地方
self.screen = screen
#加载飞船图片并获取其外接矩形
self.image = pygame.image.load('F:/PythonProject/pythongame/images/ship.bmp')
#复制图片路径后需要将斜杠改为反斜杠
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
#将每艘新飞船放在屏幕中间
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# 移动标志,玩家按下右箭头键时,将标志设为true,松开时重新设置为false
self.moving_right = False
self.moving_left = False
# 方法update()检查标志状态,标志为true时调整飞船位置
def update(self):
if self.moving_right:
self.rect.centerx += 1 #实现了飞船向右移动
if self.moving_left:
self.rect.centerx -= 1 #实现了飞船向左移动
def blitme(self):
# 在指定位置绘制飞船
self.screen.blit(self.image, self.rect)

2.运行效果
A.按下右箭头键后向右移动,再按下左箭头键时停止

B.按下左箭头键后向右移动,再按下右箭头键时停止

有什么不懂的地方在评论区留言哦!希望我的文章能对你有所帮助,如果喜欢我的文章,请点赞收藏并关注!你的认可是对我创作最大的鼓励!
2022-08-22 20:59:23 星期一
Python小游戏——外星人入侵(保姆级教程)第一章 06让飞船移动的更多相关文章
- Python小游戏——外星人入侵(保姆级教程)第一章 01创建Pygame窗口 02创建设置类Setting()
系列文章目录 第一章:武装飞船 01:创建Pygame窗口以及响应用户输入 02:创建设置类Setting() 一.前期准备 1.语言版本 Python3.9.0 2.编译器 Pycharm2022 ...
- Python小游戏——外星人入侵(保姆级教程)第一章 07调整飞船速度 08限制飞船活动范围
系列文章目录 第一章:武装飞船 07调整飞船速度 08限制飞船活动范围 一.代码及演示 1.修改settings 修改文件:settings.py 点击查看代码 #渗透小红帽python的学习之路 # ...
- Python小游戏——外星人入侵(保姆级教程)第一章 05重构模块game_functions
系列文章目录 第一章:武装飞船 05:重构:模块game_functions 一.重构 在大型项目中,经常需要在添加新代码前重构既有代码.重构旨在简化既有代码的结构,使其更容易扩展.在本节中,我们将创 ...
- Python小游戏——外星人入侵(保姆级教程)第一章 03设置飞船图片 04创建Ship类
系列文章目录 第一章:武装飞船 03:设置飞船图片 04:创建Ship类--管理飞船行为的类 一.设置飞船图片 1.注意事项 A.将图片设置为位图bmp格式最简单,因为pygame默认加载位图 B.飞 ...
- 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)
写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
- RocketMQ保姆级教程
大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...
- 自建本地服务器,自建Web服务器——保姆级教程!
搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...
- Python小游戏、小程序
python 小游戏之摇骰子猜大小 python 实现一个双色球生成程序 python-循环与判断练习题
- Eclipse for C/C++ 开发环境部署保姆级教程
Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...
随机推荐
- 深度学习与CV教程(10) | 轻量化CNN架构 (SqueezeNet,ShuffleNet,MobileNet等)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- R语言读取matlab中数据
1. 在matlab中将数据保存到*.mat 文件夹 save("data.mat","data","label")#将data和label ...
- sqlserver用windows方式验证登录踩过的坑
坑位一: 之前没用过windows验证方式登录sqlserver,连接串怎么写 坑位二: 链接上了,但是启动报错 八月 19, 2020 9:33:43 上午 com.microsoft.sqlser ...
- java类的学习
什么是类: 类=属性+方法 属性来源于状态(以变量的形式存在):方法来源于动作: *属性对应的是数据,而数据只能存在变量中. 方法内的变量为局部变量:类体中的变量称为成员变量(也称为属性) java中 ...
- Jenkins + maven + svn 自动部署项目
1.安装Jenkins sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins. ...
- RocketMQ 集群的搭建部署 以及rocketmq-console-ng仪表台的安装部署
在 RocketMQ 主要的组件如下. NameServerNameServer 集群,Topic 的路由注册中心,为客户端根据 Topic 提供路由服务,从而引导客户端向 Broker 发送消息.N ...
- leetcode教程系列——Binary Tree
tree是一种常用的数据结构用来模拟真实物理世界里树的层级结构.每个tree有一个根(root)节点和指向其他节点的叶子(leaf)节点.从graph的角度看,tree也可以看作是有N个节点和N-1个 ...
- C语言-数据结构-结构体
一.结构体的定义 数组(Array)是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组 ...
- go-zero微服务实战系列(十、分布式事务如何实现)
在分布式应用场景中,分布式事务问题是不可回避的,在目前流行的微服务场景下更是如此.比如在我们的商城系统中,下单操作涉及创建订单和库存扣减操作两个操作,而订单服务和商品服务是两个独立的微服务,因为每个微 ...
- Elasticsearch深度应用(上)
索引文档写入和近实时搜索原理 基本概念 Segments in Lucene 众所周知,Elasticsearch存储的基本单元是shard,ES种一个index可能分为多个shard,事实上每个sh ...