接着上次的继续学习。

一 创建一个设置类

每次给游戏添加新功能时,通常也将引入一些新设置。下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置。这样,我们就能传递一个设置对象,而不是众多不同的设置。另外,这让函数调用更简单,且在项目增大时修改游戏的外观更容易:要修改游戏,只需修改settings.py中的一些值,而无需查找散布在文件中的不同设置
下面是最初的Settings类:

  1. class Settings():
  2. '''存储《外星人入侵》的所有设置的类'''
  3.  
  4. def __init__(self):
  5. '''初始化游戏的设置'''
  6. self.screen_width=1200
  7. self.screen_height=800
  8. self.bg_color = (230,230,230)

为创建Settings实例并使用它来访问设置,将alien_invasion.py修改成下面这样:

  1. import sys
  2. from settings import Settings
  3. from ship import Ship
  4.  
  5. import pygame
  6.  
  7. def run_game():
  8. # 初始化游戏并建立一个屏幕对象
  9. pygame.init()
  10. # screen = pygame.display.set_mode((1200,800))
  11. ai_settings=Settings()
  12. screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
  13. pygame.display.set_caption("Alien Invasion")
  14.  
  15. #开始游戏的主循环
  16. while True:
  17. # 监视键盘和鼠标事件
  18. for event in pygame.event.get():
  19. if event.type == pygame.QUIT:
  20. sys.exit()
  21. screen.fill(ai_settings.bg_color)
  22.  
  23. # 让最近描绘的屏幕可见
  24. pygame.display.flip()
  25. run_game()

二 添加飞船的图像

使用ship.bm图片加载飞船:如下图

创建Ship类:

  1. import pygame
  2.  
  3. class Ship():
  4. def __init__(self, screen):
  5. """初始化飞船并设置其初始位置"""
  6. self.screen = screen
  7. # 加载飞船图像并获取其外接矩形
  8. self.image = pygame.image.load('images/ship.bmp')
  9. self.rect = self.image.get_rect()
  10. self.screen_rect = screen.get_rect()
  11. # 将每艘新飞船放在屏幕底部中央
  12. self.rect.centerx = self.screen_rect.centerx
  13. self.rect.bottom = self.screen_rect.bottom
  14.  
  15. def blitme(self):
  16. """在指定位置绘制飞船"""
  17. self.screen.blit(self.image, self.rect)

  注意几个重要的函数:

(1)为加载图像,我们调用了pygame.image.load()(见)。这个函数返回一个表示飞船的surface,而我们将这个surface存储到了self.image中。

(2)加载图像后,我们使用get_rect()获取相应surface的属性rect

(3)处理rect对象时,可使用矩形四角和中心的x和y坐标。可通过设置这些值来指定矩形的位置。

(4)在Pygame中,原点(0, 0)位于屏幕左上角,向右下方移动时,坐标值将增大。在1200×800的屏幕上,原点位于左上角,而右下角的坐标为(1200, 800)。

三 在屏幕上绘制飞船

下面更新alien_invasion.py:

  1. import sys
  2. from settings import Settings
  3. from ship import Ship
  4.  
  5. import pygame
  6.  
  7. def run_game():
  8. # 初始化游戏并建立一个屏幕对象
  9. pygame.init()
  10. # screen = pygame.display.set_mode((1200,800))
  11. ai_settings=Settings()
  12. screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
  13. pygame.display.set_caption("Alien Invasion")
  14. # 创建一艘飞船
  15. ship = Ship(screen)
  16.  
  17. #开始游戏的主循环
  18. while True:
  19. # 监视键盘和鼠标事件
  20. for event in pygame.event.get():
  21. if event.type == pygame.QUIT:
  22. sys.exit()
  23. screen.fill(ai_settings.bg_color)
  24. ship.blitme()
  25.  
  26. # 让最近描绘的屏幕可见
  27. pygame.display.flip()
  28. run_game()

  运行之后效果如下图:

Python 项目实践一(外星人入侵)第二篇的更多相关文章

  1. 实践torch.fx第二篇-fx量化实操

    好久不见各位,哈哈,又鸽了好久. 本文紧接上一篇<实践torch.fx第一篇--基于Pytorch的模型优化量化神器>继续说,主要讲如何利用FX进行模型量化. 为什么这篇文章拖了这么久,有 ...

  2. Python 项目实践一(外星人入侵小游戏)第二篇

    接着上次的继续学习. 一 创建一个设置类 每次给游戏添加新功能时,通常也将引入一些新设置.下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方, ...

  3. Python 项目实践一(外星人入侵)第一篇

    python断断续续的学了一段实践,基础课程终于看完了,现在跟着做三个小项目,第一个是外星人入侵的小游戏: 一 Pygame pygame 是一组功能强大而有趣的模块,可用于管理图形,动画乃至声音,让 ...

  4. Python 项目实践一(外星人入侵小游戏)第三篇

    今天是圣诞节,公司放假一天,趁着有空,学习了一下午,多写一篇博客吧! 接着上节的继续学习, 一 重构:模块game_functions 在大型项目中,经常需要在添加新代码前重构既有代码.重构旨在简化既 ...

  5. Python 项目实践三(Web应用程序)第二篇

    接着上节的继续学习,使用Django创建网页的过程通常分三个阶段:定义URL.编写视图和编写模板.首先,你必须定义URL模式,每个URL都被映射到特定的视图--视图函数获取并处理网页所需的数据.视图函 ...

  6. Python 项目实践二(生成数据)第二篇之随机漫步

    接着上节继续学习,在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来.随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向 ...

  7. Python 项目实践二(生成数据)第二篇

    接着上节继续学习,在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来.随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向 ...

  8. Python 项目实践一(外星人入侵小游戏)第五篇

    接着上节的继续学习,在本章中,我们将结束游戏<外星人入侵>的开发.我们将添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏.我们还将修改这个游戏,使其在玩家的等级提高时加快 ...

  9. Python 项目实践三(Web应用程序)第一篇

    一 Djangao入门 当今的网站实际上都是富应用程序(rich application),就像成熟的桌面应用程序一样.Python提供了一组开发Web应用程序的卓越工具.在本章中,你将学习如何使用D ...

随机推荐

  1. dubbo专题」dubbo其实很简单,就是一个远程服务调用的框架(1)

    一.dubbo是什么? 1)本质:一个Jar包,一个分布式框架,,一个远程服务调用的分布式框架. 既然是新手教学,肯定很多同学不明白什么是分布式和远程服务调用,为什么要分布式,为什么要远程调用.我简单 ...

  2. NOIP2017衢二中旅游记Day 1

    NOIP前一天下午早早的去了衢州: 车程大概在4个半小时左右: 车上大家都一脸颓废,并混杂着动听的音乐: 到了衢州二中,立刻跑去吃晚饭: 吃饭的队伍特别长,吃面的却空无一人: 我毅然决然地选择了去吃面 ...

  3. map的常用方法

    1.头文件: #include<map> 2.定义: map<string,int>Map; 或: typedef map<string,int> MAP; MAP ...

  4. QT制作窗口切换的小程序

    前言:本次实验是在三个窗口之间自由切换,窗口中播放gif格式的动态图. 让我们先来看看使用到的主要的函数: 一.播放gif格式动态图的函数 QMovie *movie = new QMovie(&qu ...

  5. [转]查询 SQL Server 系统目录常见问题

    查询 SQL Server 系统目录常见问题 http://msdn.microsoft.com/zh-cn/library/ms345522.aspx#_FAQ4 下列部分按类别列出常见问题. 数据 ...

  6. ByteArrayInputStream&ByteArrayOutputStream源码分析

    #ByteArrayInputStream 源码 ``` public synchronized int read(byte b[], int off, int len) { if (b == nul ...

  7. WinForm 窗体之间相互嵌套

    public FrmScan() { InitializeComponent(); Form1 frm = new Form1(); frm.Dock = DockStyle.Fill; frm.Fo ...

  8. MyBatis开发学习记录

    使用MyBatis时主要是完成POJO和SQL的映射规则 MyBatis基本构成: SqlSessionFactoryBuilder SqlSessionFactory SqlSession SqlM ...

  9. socket.io 入门篇(二)

    本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...

  10. php 的开发工具

    通过上篇我们已经配置好了php的开发环境,我们就可以在这个模拟的环境下运行我们编写的php代码了. 在编写代码前,先安装一个自己喜欢的代码编辑器. 1.sublime text Sublime Tex ...