python编程-从入门到实践-学习笔记-项目篇-外星人项目- 暂停

这篇博客详细介绍了如何使用Python的Pygame库创建一个简单的外星人入侵游戏。从安装Pygame开始,逐步讲解了初始化设置、创建游戏窗口、处理用户事件、显示背景色、添加飞船图像、控制飞船左右移动以及限制飞船在屏幕内的移动范围。此外,还涉及到了事件检查、图像更新和游戏循环等关键概念,为初学者提供了很好的实践指导。
摘要由CSDN通过智能技术生成

安装安 Pygame

如果该文件的扩展名为.whl,就将它复制到你的项目文件夹中。再打开一个命令窗口,切换到该文件所在的文件夹,并使用pip来运行它
python -m pip install --user pygame-1.9.2a0-cp35-none-win32.whl
在这里插入图片描述
编译错误原因如下:
由于我python 3.8 所以下载要
在这里插入图片描述

开始游戏项目

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()
  • 导入了模块sys 和pygame
  • pygame.init() 初始化背景设置,让Pygame能够正确地工作
  • 用pygame.display.set_mode() 来创建一个名为screen 的显示窗口
  • 创建了一个宽1200像素、高800像素的游戏
  • screen 是一个surface,surface是屏幕的一部分,用于显示游戏元素
  • 为访问Pygame检测到的事件,我们使用方法pygame.event.get()
  • 在这个循环中,我们将编写一系列的if 语句来检测并响应 特定的事件。例如,玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT 事件,而我们调用sys.exit() 来退出游戏
  • pygame.display.flip() ,命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while 循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可 见。
  • 最后一行调用run_game() ,这将初始化游戏并开始主循环。

在这里插入图片描述

创建设置类&&设置背景色screen.fill()

settings.py

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

alien.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()

在这里插入图片描述

添加飞船图像

最安全、最不费钱的方式是使用http://pixabay.com/ 等网站提供的图形,但使用**位图(.bmp)**文件最为简单。

  • 加载图像,我们调用 了pygame.image.load()
  • 加载图像后,我们使用get_rect() 获取相应surface的属性rect,矩形(rect 对象)
  • 要将游戏元素居中,可设置相应rect 对象的属性center 、centerx 或centery
  • 在Pygame中,原点(0, 0)位于屏幕左上角
  • 右下角的坐标为(1200, 800)。
    为此,首先将表示屏幕的矩形存储在self.screen_rect 中(见❸),再将self.rect.centerx (飞船中心的x 坐标)设置为表示屏幕 的矩形的属性centerx (见❹),并将self.rect.bottom (飞船下边缘的y 坐标)设置为表示屏幕的矩形的属性bottom 。Pygame将使用这些rect 属性来放置飞船图像, 使其与屏幕下边缘对齐并水平居中。 在❺处,我们定义了方法blitme() ,它根据self.rect 指定的位置将图像绘制到屏幕上。
    ship.py
import pygame 

class Ship(): 
    def __init__(self, screen): #screen  屏
        """初始化飞船并设置其初始位置""" 
        self.screen = screen 
        # 加载飞船图像并获取其外接矩形 
        self.image = pygame.image.load('images/ship/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)

settings.py

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

main.py

import sys 
import pygame
from settings import Settings
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:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        # 每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)
        ship.blitme()
        # 让最近绘制的屏幕可见
        pygame.display.flip()
run_game()

在这里插入图片描述

运行的函数game_functions()

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()

驾驶飞船不断向右移动

本质的核心的是数据结构进行修改、然后不断加载变化。

game_func.py

import sys 
import pygame 
def check_events(ship): 
    """响应按键和鼠标事件""" 
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT: 
            sys.exit()
        elif event.type == pygame.KEYDOWN: 
            if event.key == pygame.K_RIGHT: 
                ship.moving_right = True
        elif event.type == pygame.KEYUP: 
            if event.key == pygame.K_RIGHT: 
                ship.moving_right = False
def update_screen(ai_settings, screen, ship): 
    """更新屏幕上的图像,并切换到新屏幕""" 
    # 每次循环时都重绘屏幕 
    screen.fill(ai_settings.bg_color) 
    ship.blitme()
    # 让最近绘制的屏幕可见 
    pygame.display.flip()

settings.py

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

ship.py

import pygame 

class Ship(): 
    def __init__(self, screen): #screen  屏
        """初始化飞船并设置其初始位置""" 
        self.screen = screen 
        # 加载飞船图像并获取其外接矩形 
        self.image = pygame.image.load('images/ship/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 

        self.moving_right = False
    
    def update(self):
        if self.moving_right: 
            self.rect.centerx += 1
    def blitme(self): 
        """在指定位置绘制飞船""" 
        self.screen.blit(self.image, self.rect)

在键盘上按 →键如图所示
在这里插入图片描述

左右移动

修改部分如下
game_func.py

        elif event.type == pygame.KEYDOWN: 
            if event.key == pygame.K_RIGHT: 
                ship.moving_right = True
            elif event.key == pygame.K_LEFT: 
                ship.moving_left = True

        elif event.type == pygame.KEYUP: 
            if event.key == pygame.K_RIGHT: 
                ship.moving_right = False
            elif event.key == pygame.K_LEFT: 

修改部分如下
ship.py

    def update(self):
        if self.moving_right: 
            self.rect.centerx += 1
        elif self.moving_left: 
            self.rect.centerx -= 1

在这里插入图片描述

玩家可能同时按住左右箭头键

我们就将moving_left 设置为True ;如果因玩家松开K_LEFT 而触发了KEYUP 事件,我们就将moving_left 设置 为False 。这里之所以可以使用elif 代码块,

ship.py

    def update(self):
        if self.moving_right: 
            self.rect.centerx += 1
        elif self.moving_left: 
            self.rect.centerx -= 1

限制飞船的活动范围

当前,如果玩家按住箭头键的时间足够长,飞船将移到屏幕外面,消失得无影无踪
按住crtl 点击center ,我们找到相关定义 ,将最右边参数找到。right
在这里插入图片描述

修改部分如下
ship.py

    def update(self):
        if self.moving_right and self.rect.centerx < self.screen_rect.right: 
            self.rect.centerx += 1
        elif self.moving_left and self.rect.centerx > 0: 
            self.rect.centerx -= 1

我们这边左边的值设最小是0,右边的设置为小于right值
在这里插入图片描述
在这里插入图片描述

重构重 check_events()

"""响应按键和鼠标事件""" 
def check_keydown_events(event, ship): 
    """响应按键""" 
    if event.key == pygame.K_RIGHT: 
        ship.moving_right = True 
    elif event.key == pygame.K_LEFT: 
        ship.moving_left = True 

def check_keyup_events(event, ship): 
    """响应松开""" 
    if event.key == pygame.K_RIGHT: 
        ship.moving_right = False 
    elif event.key == pygame.K_LEFT: 
        ship.moving_left = False
def check_events(ship): 
    """响应按键和鼠标事件""" 
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT: 
            sys.exit() 
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event, ship) 
        elif event.type == pygame.KEYUP: 
            check_keyup_events(event, ship)

射击

在这里插入代码片

设置背景色

在这里插入代码片

设置背景色

在这里插入代码片

设置背景色

在这里插入代码片

设置背景色

在这里插入代码片

设置背景色

在这里插入代码片
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值