外星人入侵
开发环境
pyhton3.6+pycharm+pygame模块
开始游戏项目
- . 创建pygame窗口以及响应用户的输入
首先创建一个空的pygame窗口,编写基本游戏结构
创建文件alien_invasion.py
import sys
import pygame
def run_game():
#初始化游戏并创建一个屏幕对象
pygame.init()
#创建游戏窗口大小
screen=pygame.display.set_mode((600,480))
#创建游戏标题
pygame.display.set_caption("外星人大战")
#开始游戏的主循环
while True:
#监视键盘和鼠标的事件
#从pyganme的事件监听器中遍历,是否有退出指令,有则退出
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
#让最近绘制的屏幕可见,否则是看不见的
pygame.display.flip()
if __name__ == '__main__':
run_game()
- 设置背景色
完整的修改后的代码如下
import sys
import pygame
def run_game():
#初始化游戏并创建一个屏幕对象
pygame.init()
#创建游戏窗口大小
screen=pygame.display.set_mode((600,480))
#创建游戏标题
pygame.display.set_caption("外星人大战")
#设置背景色
bg_color=(230,230,230)
#开始游戏的主循环
while True:
#监视键盘和鼠标的事件
#从pyganme的事件监听器中遍历,是否有退出指令,有则退出
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
#背景填充颜色
screen.fill(bg_color)
#让最近绘制的屏幕可见,否则是看不见的
pygame.display.flip()
if __name__ == '__main__':
run_game()
- 设置类的创建
settings.py
完整的代码如下
class Settings():
"""存储《外星人入侵》的所有设置的类"""
def __init__(self):
"""初始化游戏的设置"""
#屏幕设置
self.screen_width=1200
self.screen_height=800
self.bg_color=(230,230,230)
- 更新alien_invasion,py
完整代码如下所示
import sys
import pygame
#导入设置类
from settings import Settings
def run_game():
#初始化游戏并创建一个屏幕对象
pygame.init()
#实例化settings对象
ai=Settings()
#创建游戏窗口大小
screen=pygame.display.set_mode((ai.screen_width,ai.screen_height))
#创建游戏标题
pygame.display.set_caption("外星人大战")
#开始游戏的主循环
while True:
#监视键盘和鼠标的事件
#从pyganme的事件监听器中遍历,是否有退出指令,有则退出
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
#背景填充颜色
screen.fill(ai.bg_color)
#让最近绘制的屏幕可见,否则是看不见的
pygame.display.flip()
if __name__ == '__main__':
run_game()
图片加载
- 添加飞船图片
新建文件夹images,并将文件ship.bmp图片放入其中、可在下面绘制飞船运行图上裁剪下来,改名即可
创建ship类
ship.py
import pygame
class Ship():
def __init__(self,screen):
"""初始化飞船并设置其初始位置"""
self.screen=screen
#加载飞船图像
self.image=pygame.image.load('images/ship.bmp')
#获取飞船图像的长宽尺寸
self.rect=self.image.get_rect()
#获取游戏屏幕的尺寸
self.screen_rect=screen.get_rect()
#将每艘新飞船放在屏幕底部的中央
#飞船的x坐标=屏幕的x中间位置坐标
self.rect.centerx=self.screen_rect.centerx
#飞船的y坐标=屏幕的底部Y值
self.rect.bottom=self.screen_rect.bottom
def blitme(self):
"""指定位置绘制飞船"""
#blit(图像,图像绘制的位置坐标)
self.screen.blit(self.image,self.rect)
在屏幕上绘制飞船
- 更新alien_nvasion.py
- 完整代码见下
import sys
import pygame
#导入设置类
from settings import Settings
from ship import Ship
def run_game():
#初始化游戏并创建一个屏幕对象
pygame.init()
#实例化settings对象
ai=Settings()
#创建游戏窗口大小
screen=pygame.display.set_mode((ai.screen_width,ai.screen_height))
#创建游戏标题
pygame.display.set_caption("外星人大战")
#实例化飞船对象ship,传入屏幕实参
ship=Ship(screen)
#开始游戏的主循环
while True:
#监视键盘和鼠标的事件
#从pyganme的事件监听器中遍历,是否有退出指令,有则退出
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
#背景填充颜色
screen.fill(ai.bg_color)
#将飞船绘制到屏幕上
ship.blitme()
#让最近绘制的屏幕可见,否则是看不见的
pygame.display.flip()
if __name__ == '__main__':
run_game()
运行,效果如下
逻辑分离
避免主程序冗长
实现逻辑分离的功能
创建game_functions.py
- 完整代码如下,实现了一部分主程序中的代码迁移
import sys
import pygame
def check_evens():
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def update_screen(ai_settings,screen,ship):
"""每次更新屏幕上的图像,并切换到新屏幕"""
# 背景填充颜色
screen.fill(ai_settings.bg_color)
# 将飞船绘制到屏幕上
ship.blitme()
# 让最近绘制的屏幕可见,否则是看不见的
pygame.display.flip()
- 逻辑分离后的主程序alien_invasion.py如下
完整代码
import sys
import pygame
#导入设置类
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
#初始化游戏并创建一个屏幕对象
pygame.init()
#实例化settings对象
ai=Settings()
#创建游戏窗口大小
screen=pygame.display.set_mode((ai.screen_width,ai.screen_height))
#创建游戏标题
pygame.display.set_caption("外星人大战")
#实例化飞船对象ship,传入屏幕实参
ship=Ship(screen)
#开始游戏的主循环
while True:
#监视键盘和鼠标的事件
gf.check_evens()
gf.update_screen(ai,screen,ship)
if __name__ == '__main__':
run_game()
总结
这一部分主要实现基础的游戏结构以及图片加载,最重要的是培养一个逻辑分离的思想,没什么重要的东西,都很基础,一些东西都有注释,也就没有详细写。