手把手讲解超详细python入门游戏项目‘打外星飞船’(四)

在经过创立屏幕、飞船移动和设置子弹,我们这里开始设置外形人的创建和移动。我们这里主要的任务是:创建一众外星人让它们充满屏幕,让他们向下和两边移动,这里继承了上面四个文件外我们还多键一个文件来管理外星人的类,也就是五个文件。这里后三个文件没有太大的变化,我们主要调整了前两个文件

主文件

import sysimport pygamefrom settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Alienclass AlienInvasion:def __init__(self):pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().heightpygame.display.set_caption("Alien Invasion")self.ship = Ship(self)self.bullets = pygame.sprite.Group()self.aliens = pygame.sprite.Group()self._creat_fleet()def run_game(self):while True:self._check_events()self.ship.update()self._update_bullets()#这里多加了外星人的运动函数self._update_aliens()self._update_screen()def _check_events(self):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)def _check_keydown_events(self, event):if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self, event):if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _fire_bullet(self):if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_bullets(self):self.bullets.update()for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)def _update_aliens(self):"""判断外星人有没有到边,到了就调整位置"""self._check_fleet_edges()self.aliens.update()def _create_fleet(self):"""用来创建外星人"""# 计算出一行可以容纳多少外星人alien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width)#计算出一列可以容纳多少外星人ship_height = self.ship.rect.heightavailable_space_y = (self.settings.screen_height -(3 * alien_height) - ship_height)number_rows = available_space_y // (2 * alien_height)# 这里用了一个嵌套循环,外部是列,内部是行,创建多个外形人for row_number in range(number_rows):for alien_number in range(number_aliens_x):self._create_alien(alien_number, row_number)def _create_alien(self, alien_number, row_number):"""创建一个外星人,放在一行里面"""alien = Alien(self)alien_width, alien_height = alien.rect.size#总宽度是所有外星人的宽度加间隔,间隔也取外星人的宽度乘上总行数alien.x = alien_width + 2 * alien_width * alien_number#要创建的外星人的数alien.rect.x = alien.x#总高度是所有外星人的高加间隔,间隔也取外星人的宽度,乘上总列数alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberself.aliens.add(alien)def _check_fleet_edges(self):"""这里判断外星人到底屏幕底部没有"""for alien in self.aliens.sprites():#遍历每个外星人if alien.check_edges():self._change_fleet_direction()#如果到了就退出循环breakdef _change_fleet_direction(self):"""将外星人下移加左右飘"""for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _update_screen(self):self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aliens.draw(self.screen)pygame.display.flip()if __name__ == '__main__':# Make a game instance, and run the game.ai = AlienInvasion()ai.run_game()

外星人控制

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):"""管理的外星人的类"""def __init__(self, ai_game):"""初始化外星人并设置他们初始位置"""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settings#外星人图像并且rect属性         self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 外星人一开始出现在屏幕的左上角self.rect.x = self.rect.widthself.rect.y = self.rect.height# 记录下外星人的位置self.x = float(self.rect.x)def check_edges(self):#判断是否超过屏幕"""看看飞船有没有超过屏幕,如果屏幕大于右边的屏幕的数后者小于零是超越屏幕的左边"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0:return Truedef update(self):"""这里用乘积的办法,每次就是用所在的x坐标减去方向*1or-1"""self.x += (self.settings.alien_speed *self.settings.fleet_direction)self.rect.x = self.x

子弹管理类

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):def __init__(self, ai_game):super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_colorself.rect = pygame.Rect(0, 0, self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop = ai_game.ship.rect.midtopself.y = float(self.rect.y)def update(self):# Update the decimal position of the bullet.self.y -= self.settings.bullet_speed# Update the rect position.self.rect.y = self.ydef draw_bullet(self):pygame.draw.rect(self.screen, self.color, self.rect)

总设置参数

class Settings:"""这个类用于储存一些参数"""def __init__(self):# 屏幕参数self.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230)# 飞船参数self.ship_speed = 1.5# 子弹参数self.bullet_speed = 1.0self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3# 外星人左右移动的速度1,向下移动的速度10self.alien_speed = 1.0self.fleet_drop_speed = 10# 这里其实是在设置每次外形人飞船的位置,1为右移一位,-1为左移self.fleet_direction = 1

飞船设置

import pygameclass Ship:"""飞船参数"""def __init__(self, ai_game):self.screen = ai_game.screenself.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)self.moving_right = Falseself.moving_left = Falsedef update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speedself.rect.x = self.xdef blitme(self):self.screen.blit(self.image, self.rect)

手把手讲解超详细python入门游戏项目‘打外星飞船’(四)相关推荐

  1. 手把手讲解超详细python入门游戏项目‘打外星飞船’(二)

    手把手讲解超详细python入门游戏项目'打外星飞船'(二) 上次我们在(一)中创建了游戏的背景,现在我们这里将要实现用键盘控制飞船的移动.射击子弹,但是在此之前我们还有一个非常重要的部分–重构. 重 ...

  2. 手把手讲解超详细python入门游戏项目‘打外星飞船’(五)

    手把手讲解超详细python入门游戏项目'打外星飞船'(五) 这是最后一个项目了,前面我们讲了整个游戏页面的控制.飞船.子弹.外星人的创建,这里我们讨论一下子弹射杀外星人和整个游戏的结束,我们这里的文 ...

  3. 手把手讲解超详细python入门游戏项目‘打外星飞船’(三)

    手把手讲解超详细python入门游戏项目'打外星飞船'(三) 第三部分我们讲解一下飞船需要射出子弹,那么子弹的部分是怎么操作呢?接下来我直接把项目的四个文件展示出来,以注释的形式在旁边讲解.因为有很多 ...

  4. 手把手讲解超详细python入门游戏项目‘打外星飞船’(一)

    手讲解超详细python入门游戏项目'打外星飞船'手把(一) 由于内容比较多,这里会分为五篇文章来讲解,从页面的创建.飞船控制.射击.外星人创建.射杀外星人五片来展开. 做一个窗口和设置响应用户 im ...

  5. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使用r ...

  6. 【转】超强、超详细Redis入门教程 ,建议收藏

    转载自: 这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3. ...

  7. python详细安装教程-超详细Python与PyCharm安装教程,看这一篇就够了

    原标题:超详细Python与PyCharm安装教程,看这一篇就够了 学习了三天的python, 之前测试一直用课程自带的网页版玩玩, 为了学习 然后就下载了一个python和pycharm 现在分享下 ...

  8. 超详细Redis入门教程——Redis命令(下)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令 相关知识,具体内容包括简单动态字符串 SDS,集合的底层实现原理,BitMap 操作命令,HyperLogLog 操作命令,Geo ...

  9. 超详细Redis入门教程——Redis命令(上)

    前言 本文小新为大家带来 超详细Redis入门教程--Redis命令(上) 相关知识,具体内容包括Redis 基本命令,Key 操作命令,String 型 Value 操作命令,Hash 型 Valu ...

最新文章

  1. python字符串截取及Html解析
  2. Silverlight 2 应用程序部署到任意HTML页面
  3. 为容器提供持久存储,这个方法试试看
  4. 1.5编程基础之循环控制 38 计算多项式的导函数
  5. java 中传输文件的代码_java文件上传Demo(必看篇)
  6. 定点乘法运算之原码一位乘法
  7. 今天开始,吾使用手机上的五笔输入法
  8. HBuilderX的各版本软件自取
  9. php评论表情包怎么引入,纯代码实现WordPress添加评论表情(心情)的教程
  10. revit二次开发之插件安装包制作
  11. EasyUI+JavaWeb奖助学金管理系统[18]-奖助学金申请功能开发
  12. 打开图片或者视频显示“文件系统错误-2147416359”
  13. mysql中端口的概念_端口的概念,端口的分类
  14. Mac下挂载NTFS硬盘
  15. 经营者购买餐饮商铺需要注意些什么
  16. mpvue脚手架模板,添加mpvue-entry、mpvue-router-patch、minapp-api-promise、vuex、less、flyio、wux-weapp...
  17. Unicode 码和汉字,十进制之间互转!二进制、十六进制,十进制的转换
  18. 字节跳动任命凯文·梅耶尔为首席运营官
  19. html中将文字设置成红色,怎样用css将文字改为红色?
  20. 76套机械爪图纸机械手夹具三爪四指夹爪爪子sw三维夹持器抓手3d图

热门文章

  1. JDK 16 新特性,正式发布!程序员:追不上了...
  2. HY的Web前端周记 Day1
  3. CSS常用英文字体介绍
  4. 什么是`前端路由`?什么时候使用`前端路由`?`前端路由`存在哪些优缺点?
  5. carplay逆向开发流程
  6. 基于JAVA餐厅座位预约系统设计与实现 开题报告
  7. vue element-----实现table前端分页
  8. java制作游戏脚本,面试篇
  9. 支付宝和Ping++的包冲突问题:Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files defin
  10. 工作报告注意事项总结思维导图