目录

  • 1.开发准备
  • 2.开发流程
    • 2.1创建第一个外星人
    • 2.2进行一些响应和设置操作
    • 2.3在屏幕上绘制飞船
    • 2.4设置移动、调整速度和活动范围等功能
    • 2.5射击设置部分
  • 效果展示
  • 代码

1.开发准备

1.环境
选择一个python环境,本设备选用的为一个tensorflow_gpu2.4.0的py36环境。

2.开发流程

2.1创建第一个外星人

1、首先我新建一个Aliens类,创建第一个外星人,我选择了一个tensorflow2的py36的一个编译环境;当然我需要创建一个脚本存放这个类:alien.py;在该脚本中,我导入pygame包的时候报错了,证明我这个包在该环境中没有下载,于是我去博客中找到该包下载的办法【1】:

  • 首先下载安装pygame所需要的wheel包,我们可以去该网址找到我们需要的安装包:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame,找到对应的python环境,下载之后我根据【1】安装遇到一些问题:

    于是,我尝试新的安装方法:首先,我打开该环境anaconda prompt(管理员),并激活该环境,我的虚拟环境名称为tensorflow2,所有我输入:activate tensorflow2;之后,直接pip安装会出错:pip install pygame-1.9.6-cp36-cp36m-win_amd64.whl,原来我需要先将该.whl文件拷贝到该虚拟环境指定文件夹中安装,我可以直接找到该虚拟环境的目录,拷贝之后,我再一次输入上面的安装指令,最后成功安装:

然后再去visual studio2017,在对应脚本中输入:import pygame,报错消失,说明安装成功。之后,我再去定义这个Aliens类:

## 创建Aliens类
class Aliens(Sprite):"""表示单个外星人的类"""def __init__(self,ai_settings,screen):"""初始化外星人并设置其起始位置"""super(Aliens,self).__init__()self.screen=screenself.ai_settings=ai_settings#加载外星人图像,并设置成rect属性self.image=pygame.image.load("img/alien.png")self.rect=self.image.get_rect()#每个外星人最初都在屏幕左上角附近self.rect.x=self.rect.widthself.rect.y=self.rect.height#存储外星人的准确位置self.x=float(self.rect.x)def blitme(self):"""在指定位置绘制外星人"""self.screen.blit(self,image,self.rect)

之后,我结合电脑自带的画图软件画了个简易的外星人,并经过ps软件调整图像大小,另存为png格式,并在项目根目录下新建文件夹命名为img,将该外星人图像放在img文件夹下:


2、之后再创建Aliens实例,需要新建一个脚本:alien_invasion.py;在该脚本中,我们创建这个实例:

from ship import Ship
from alien import Aliens
import game_functions as gfdef run_game():--snip--#创建一个外星人alien=Aliens(ai_settings,screen)#开始游戏主循环while True:gf.check_keydown_eventsship.update()gf.update_screen(ai_settings,screen,ship,alien,bullets)run_game()

其中,from ship import Ship ,报错,同理,在tensorflow2虚拟环境下我们直接pip安装一下这个包:pip install ship;安装成功,问题解决;

--snip--
# 先省略部分代码的作用

tips:快捷键ctrl+shift+A可以快速在该项目中创建.py脚本:

3、初始化一些游戏的功能,而让外星人出现在屏幕上只是一个功能,我们需要初始化多个这种函数,其中让外星人出现在屏幕上我们会用到update_screen(),并调用blitme(),创建一个game_functions.py,下面大家就好领悟了:

import sys
from time import sleep
import pygame#from alien import Aliens
#from bullet import Bullet"""
def check_keydown_events(event,ai_settings,screen,ship,bullets):elif event.key == pygame.k_q:sys.exit()
"""
def update_screen(alien,ai_settings,screen,ship,bullets):--snip--#在飞船和外星人后面重绘所有子弹for bullet in bullets:bullet.draw_bullet()ship.blitme()alien.blitme()#让最近绘制的屏幕可见pygame.display.flip()

之后,我运行代码发现并不会出现屏幕和外星人:

后来才发现要创建pygame窗口以及响应用户输入界面,于是我进行如下开展。

2.2进行一些响应和设置操作

1、创建pygame窗口以及用于输入的响应用户,并设置一下背景颜色,创建了一个设置类:settings.py;并实例化这个类,然后在alien_invasion.py添加访问设置,最后修改如下:
settings.py:

class Settings():"""存储《外星人入侵》的所设置的类"""def __init__(self):"""初始化游戏的设置"""#屏幕设置self.screen_width=1200self.screen_hight=800self.bg_color=(230,230,230)

alien_invasion.py:

from pygame.sprite import Sprite
from ship import Ship
from alien import Aliens
from settings import Settingsdef run_game():#--------------------------##初始化游戏并创建一个屏幕对象#-------------------------#pygame.init()#screen=pygame .display.set_mode(1200,800)screen=pygame .display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption("Alien Invasion")#--------------------------##设置背景颜色#-------------------------#bg_color=(230,230,230)#开始游戏的主循环while True:#监视键盘和鼠标事件for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()#每次循环时都重新绘制屏幕screen.fill(bg_color)#让最近绘制的屏幕可见pygame.display.flip()#创建一个外星人alien=Aliens(ai_settings,screen)#开始游戏主循环#while True:#gf.check_keydown_events#ship.update()#gf.update_screen(ai_settings,screen,ship,alien,bullets)run_game()

2、添加飞船图片,同理,我又在画图工具画了一个飞船简图,并调整大小,放置在img/文件夹下,命名为ship.png:

2.3在屏幕上绘制飞船

1、首先创建Ship类,新建ship.py脚本:

import pygame
class Ship():def __init__(self,screen):"""初始化飞船并设置其初始位置"""self.screen=screen#加载飞船图像并获取其外接矩形self.image=ppygame.image.load("img/ship.png")self.rect=self.image.get_rect()self.screen_rect=screen.get_rect()#将每艘飞船放置在屏幕底部中央self.rect.centerx=self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomdef blitme(self):"""在指定位置绘制飞船"""self.screen.blit(self.image,self.rect)

2、在屏幕上绘制飞船,我们更新一下alien_invasion.py,使其创建一艘飞船,并调用其方法blitme(),由于报错,我们现将创建外星人的代码注释掉,并加入新的代码:

import pygame
#import game_functions as gf
import sysfrom pygame.sprite import Sprite
from ship import Ship
from alien import Aliens
from settings import Settingsdef run_game():#--------------------------##初始化游戏并创建一个屏幕对象#-------------------------#pygame.init()ai_settings=Settings()#screen=pygame .display.set_mode(1200,800)screen=pygame .display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption("Alien Invasion")#--------------------------##设置背景颜色#-------------------------#bg_color=(230,230,230)#--------------------------##新建一艘飞船#-------------------------#ship=Ship(screen)#--------------------------##创建一个外星人#-------------------------##alien=Aliens(ai_settings,screen)#开始游戏的主循环while True:#监视键盘和鼠标事件for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()#每次循环时都重新绘制屏幕screen.fill(bg_color)#调用我们自己定义的函数blitme(),使其在指定位置绘制飞船ship.blitme()#让最近绘制的屏幕可见pygame.display.flip()#开始游戏主循环#while True:#gf.check_keydown_events#ship.update()#gf.update_screen(ai_settings,screen,ship,alien,bullets)run_game()

3、运行alien_invasion.py之后报错:
返回settings.py脚本发现height输错了,反正大家报错就根据错误提示去找线索并修改就好:

比如下面又是习惯性输入出错:
将ppygame修改为pygame,再运行,成功:

做到这一步已经成功一半,坚持就是胜利!

2.4设置移动、调整速度和活动范围等功能

1、我们在game_functions.py中check_event(ship)设置飞船的响应按键:点击右键向右移动,松开停止移动,飞船不移动时,moving_right置为False,玩家按下箭头,moving_right=True,松开moving_right=False,根据pygame.KEYDOWN可以检测玩家按下事件;pygame.KEYUP可以检测玩家松开按键事件。飞船每右键按一次,飞船将向右移动一个像素,将ship.rect.centerx值加一。
2、同理,左键标志也为moving_right=False,飞船每左键按一次,飞船将向左移动一个像素,将ship.rect.centerx值减一。
3、然后设置调整飞船速度,代码最后一起罗列。

2.5射击设置部分

前面我们已经创建好游戏屏幕,并能更新画面,我们还创建了一个飞船,并让其限制活动范围,而按键可以控制其移动方向,那么现在马上创建飞船的子弹设置吧。
1、添加子弹设置(包括子弹数量、颜色。速度、大小),再创建Bullet类
2、遇到的问题:参数顺序要一致,不然代码混乱,运行会报错
通过调整多次代码,最后运行成功,效果如下:

而且,移动方向我按左键它向右移,再去看看按键设置的代码,并调整飞船移动的速度;之后,对于子弹再做一些改进,删除消失的子弹、并限制子弹数量。
之后,返回2.1创建一个及多个外星人,运行alien_invasion.py:效果如下:

效果展示

代码

参考:
https://blog.csdn.net/mao_hui_fei/article/details/100124405

宇宙飞船打外星人(python-2D游戏开发)相关推荐

  1. Unity 2D游戏开发教程之摄像头追踪功能

    Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...

  2. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  3. Unity 2D游戏开发教程之为游戏场景添加多个地面

    Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...

  4. Unity 2D游戏开发教程之精灵的死亡和重生

    Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...

  5. ​Unity 2D游戏开发教程之2D游戏的运行效果

    ​Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑 ...

  6. Unity 2D游戏开发教程之使用脚本实现游戏逻辑

    Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...

  7. Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍

    Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介绍Unity的下 ...

  8. Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

    Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布 ...

  9. Unity 2D游戏开发快速入门(内部资料)

    Unity 2D游戏开发快速入门(内部资料) 试读样张:http://pan.baidu.com/s/1hqh5oqw Unity 2D游戏开发快速入门4 前  言 Unity是一款综合的游戏开发工具 ...

  10. Unity 4.x 2D游戏开发基础教程大学霸第一更

    Unity 4.x 2D游戏开发基础教程 大学霸 第1章  Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介 ...

最新文章

  1. python进阶:闭包、map/reduce/filter函数、lambda函数、装饰器
  2. 浅谈域名发散与域名收敛
  3. npm install引起的项目崩溃(This is probably not a problem with npm,there is likely additional logging outp)
  4. 给一个执行在windows 7和NAT下的VMWARE虚拟机分配固定IP
  5. Python补充03 Python内置函数清单
  6. python 01列表异或_python运算符及优先级顺序
  7. 《Unity虚拟现实开发实战》——第1章,第1.1节虚拟现实对你来说意味着什么
  8. webpack4.x实战六,处理图片
  9. 什么是IEC球压测试?
  10. java httpclient 下载_java HttpClient 下载一张图片
  11. Java安全生态-Java加解密API详解-Java安全框架官方文档翻译:对称/非对称加密、数字签名、数字证书、安全通信、密钥库等
  12. Mujoco雅克比-逆运动-传感器
  13. AI智能双标题插件+内容伪原创插件集成
  14. 值得收藏的几千T超多学习资源合集分享
  15. Ubuntu 安装 tbb 步骤详解
  16. 详解 WebRTC 高音质低延时的背后—AGC 自动增益控制
  17. 个税APP优化解决方案
  18. 可执行 jar 和普通 jar 区别
  19. 使用键鼠网络共享用windows控制ubuntu,实现跨屏跨系统操作
  20. 用Matlab创建BP神经网络

热门文章

  1. Servlet3与Servlet4
  2. python:range()和arrange()
  3. 专家系统与计算机程序的区别是,专家系统的结构和类型
  4. 牛股最阴险的洗盘方式
  5. git提交中文信息报错
  6. 计算机网络实验 静态路由的配置(DAY 55)
  7. Nokia N900上安装fennec
  8. 人文地理学部分复习思考题答案
  9. RTMP推流及协议学习
  10. MOPSO 多目标粒子群python实现