目录
- 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=screen
self.ai_settings=ai_settings
#加载外星人图像,并设置成rect属性
self.image=pygame.image.load("img/alien.png")
self.rect=self.image.get_rect()
#每个外星人最初都在屏幕左上角附近
self.rect.x=self.rect.width
self.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 gf
def run_game():
--snip--
#创建一个外星人
alien=Aliens(ai_settings,screen)
#开始游戏主循环
while True:
gf.check_keydown_events
ship.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=1200
self.screen_hight=800
self.bg_color=(230,230,230)
alien_invasion.py:
from pygame.sprite import Sprite
from ship import Ship
from alien import Aliens
from settings import Settings
def 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.centerx
self.rect.bottom=self.screen_rect.bottom
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image,self.rect)
2、在屏幕上绘制飞船,我们更新一下alien_invasion.py,使其创建一艘飞船,并调用其方法blitme(),由于报错,我们现将创建外星人的代码注释掉,并加入新的代码:
import pygame
#import game_functions as gf
import sys
from pygame.sprite import Sprite
from ship import Ship
from alien import Aliens
from settings import Settings
def 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:效果如下: