【有书共读05】python编程--从入门到实践12

武装飞船

现在我开始制作一个小型项目了!!!(还是参考书本o_o ....)

一、准备工作

安装Pygame模块
推荐使用pip方式安装
windows环境下可以这样安装(其他环境大家找度娘……

pip install Pygame

二、创建Pygame窗口以及响应用户输入

alien_invasion.py

import sys
import pygame
def  rungame():
    #初始化游戏,并创建一个游戏变量
    pygame.init()
    screen = pygame.display.set_mode((1200,800))
    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()
    pass
rungame()

pygame.init():是初始化背景设置,让Pygame可以正确的工作
screen = pygame.display.set_mode((1200,800)):通过调用 pygame.display.set_mode()来创建一个名为screen的显示窗口,且这个窗口的宽为1200像素,高为800像素
对象screen是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在该游戏中, 每个元素(比如外星人和飞船)都是一个surface。而pygame.display.set_mode()返回的surface表示整个游戏窗口。我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。
游戏是由while循环控制,其中包括一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏的执行的操作,如按键或是移动鼠标。为了让程序响应事件,我们编写了一个时间循环来侦听事件,并根据发生的时间来执行相应的任务。
pygame.event.get():通过此方法来访问Pygame监测到的事件。
pygame.display.flip():命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元素时,pygame.display.flip()将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。
bg_color = (230,230,230):在Pygame中,颜色以RGB值指定的。如果不太清楚,可以问度娘!
screen.fill(bg_color):我们调用该方法,用背景色填充屏幕,这个方法只接受一个参数:一种RGB颜色

三、创建设置类

每次给游戏添加新功能时,通常需要添加一些新的设置。所以我们需要单独一个模块存贮这些信息。
我将设置信息存放在名为settings的模块中。

settings.py

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

因为引入了Settings类,相应地,我们要将aliens_invasion.py做一些更改

import sys
import pygame
from settings import Settings
def  rungame():
    #初始化游戏,并创建一个游戏变量
    pygame.init()
    screen = pygame.display.set_mode((Settings.screen_width,Settings.screen_height))
    pygame.display.set_caption("Alien Invasion")
    #设置背景色
    bg_color = Settings.bg_color
    #开始游戏的主循环
    while True:
        #监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        #每次循环时都重绘屏幕
        screen.fill(bg_color)
        #让最近回值的屏幕可见
        pygame.display.flip()
    pass
rungame()

在主程序文件中为我们导入Settings类,调用pygame.init(),再创建一个Settings实例,并将其存储在变量ai_settings中。创建屏幕时,使用了ai_settings的属性,填充颜色时也使用了ai_settings的属性。

三、创建ship类

ship.py

import pygame
class ship(object):
    """初始化飞船并获取其外接图形"""
    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)
        pass

首先,先引用了pygame模块
init():此方法接收两个参数self和screen,其中后者指定了要将飞船绘制到什么地方。为加载图像,调用了pygame.image.load(),此函数返回一个表示飞船的surface,我们将这个surface存储到self.image中。
get_rect():获取相应surface的属性rect。(rect是矩形的简写)
处理rect对象时,可使用矩形四角和中心的x,y坐标。可通过设置这些值来指定矩形的位置。
要将游戏元素居中,可设置相应rect对象的属性center、centerx或centery。要将游戏元素与屏幕边缘对齐,可使用属性top、bottom、left或right;要调整游戏元素水平或垂直位置,可使用属性x和y,它们分别是相应矩形左上角的x和y坐标。

四、在屏幕上绘制飞船

下面来更新alien_invasion.py,使其创建一艘飞船,并调用其方法blitme();

alien_invasion.py

import sys
import pygame
from settings import Settings
from ship import Ship
def  rungame():
    #初始化游戏,并创建一个游戏变量
    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)
    #设置背景色
    bg_color = ai_settings.bg_color
    #开始游戏的主循环
    while True:
        #监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        #每次循环时都重绘屏幕
        screen.fill(bg_color)
        ship.blitme()
        #让最近回值的屏幕可见
        pygame.display.flip()
    pass
rungame()

我们导入Ship类,并在创建屏幕后创建一个名为ship的Ship实例。必须在主循环前面创建该实例 ,以免每次循环时都创建一艘飞船。填充背景后,我们调用ship.blitme()将飞船绘制到屏幕上,确保它出现在背景前面。

运行后的结果如图所示
图片说明
ship.bmp
图片说明

此小项目的目的只是让大家熟悉一下用python绘制窗口的基本操作,远远没有达到制作小游戏的程度。饭要一口一口地吃,之后再讲解外星人入侵的加强版、进阶版!这个版本就叫基础版吧→_→

#Python#
全部评论

相关推荐

尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
SinyWu:七院电话面的时候问我有没有女朋友,一听异地说你赶紧分。我:???
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务