python3.7 + pygame1.9.3实现游戏《外星人入侵》(一):飞船创建

windows系统,python3.7 64bit安装pygame1.9.3
在如下链接中:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
找到pygame 的版本pygame-1.9.3-cp37-cp37m-win_amd64.whl并下载
cmd进入控制台后,进入该文件所在地,pip install即可下载(前提是已经安装了wheel)

实现《外星人入侵》小游戏

一、窗口构建
首先新建alien_invasion.py文件,目的是创建一个空的Pygame窗口,供后续绘制游戏元素,如飞船和外星人:

import sys
import pygame

def run_game():
    # 初始化并创建一个屏幕对象
    pygame.init()
    screen = pygame.display.set_mode((1200,800))
    pygame.display.set_caption("Alien Invasion")

    # 游戏的主循环
    while True:
        # 监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        # 让最近绘制的屏幕可见
        pygame.display.flip()

run_game()

运行上述代码后即可看到一个空的黑色Pygame窗口。方法pygame.event.get()可以访问pygame检测到的事件,例如在单击游戏窗口的关闭按钮时,将检测到pygame.QUIT,从而调用 sys.exit()退出游戏。
pygame.display.flip()使得最近绘制的屏幕可见,每次执行while循环时都会绘制一个空屏幕,并擦去旧屏幕,即不断更新屏幕,以显示元素的新位置,营造平滑移动的效果。

二、游戏设置
编写settings模块,以存储游戏的所有设置,方便后续调用和修改:

class Settings():
# 存储游戏所有设置的类
    def __init__(self):
        # 初始化游戏的设置
        # 屏幕设置
        self.screen_width = 1200
        self.screen_height = 600
      
        # 背景色由RGB指定,(230,230,230)为浅灰色
        self.bg_color = (230,230,230)         

同时需要修改alien_invasion.py的代码以访问设置:

import sys
import pygame
from settings import Settings

def run_game():
    # 初始化并创建一个屏幕对象
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # 游戏的主循环
    while True:
        # 监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        # 每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)

        # 让最近绘制的屏幕可见
        pygame.display.flip()

run_game()

三、添加飞船图像
游戏选择素材可以使用:https://pixabay.com/ 网站提供的图形,安全且免费。推荐使用位图(.bmp)文件,因为Pygame默认加载位图。或是在图书《Python编程:从入门到实践》的官方网站,可以下载配套资源:http://www.ituring.com.cn/book/1861
在文件夹images中可以找到ship.bmp,将images复制到自己项目的文件夹下,方便后续调用
创建ship模块,负责管理飞船的大部分行为:

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()
        
        # 将每搜新飞船放在屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
        
    def blitme(self):
        # 在指定位置绘制飞船
        self.screen.blit(self.image,self.rect)

Pygame之所以效率高,原因之一是它能让你像处理矩形(rect对象)一样处理游戏元素,即使它们并非矩形,因为矩形是简单的几何形状,且玩家几乎注意不到区别。
rect对象属性:
需要居中时,可以使用center、centerx或centery
需要与屏幕边缘对齐,有属性top、bottom、left或right
需要调整水平或垂直位置,可设置属性x和y,在Pygame中,原点(0,0)位于屏幕的左上角,向右下方移动时,坐标值将增大。

四、绘制飞船
更新alien_invasion.py,使其在屏幕上创建飞船(未改动代码省略):

--snip--
from ship import Ship

def run_game():
   --snip--
    pygame.display.set_caption("Alien Invasion")

    # 创建一搜飞船
    ship = Ship(screen)

    # 游戏的主循环
    while True:
        --snip--
        # 每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)
        ship.blitme()

        # 让最近绘制的屏幕可见
        pygame.display.flip()

run_game()

如上,导入ship类,在创建屏幕后,在主while循环前创建一个名为ship的Ship实例。填充背景后,调用ship.blitme()将船绘制到屏幕上,确保它出现在背景前面。

五、重构
在大型项目中,经常需要在添加新代码前重构既有代码,旨在简化既有代码的结构,是其更易扩展。我们将创建一个名为game_functions的新模块,以存储大量让游戏运行的函数。
为简化run_game(),将其中管理事件和更新屏幕的代码放在新模块中:

import sys
import pygame

def check_events():
    # 响应按键和鼠标事件
    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_incasion.py更新为:

import sys
import pygame
from settings import Settings
import game_functions as gf
from ship import Ship

def run_game():
    # 初始化并创建一个屏幕对象
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # 创建一搜飞船
    ship = Ship(screen)

    # 游戏的主循环
    while True:
        gf.check_events()
        gf.update_screen(ai_settings,screen,ship)

run_game()

实现效果如下所示:
python3.7 + pygame1.9.3实现游戏《外星人入侵》(一):飞船创建_第1张图片

你可能感兴趣的:(学习笔记)