python---项目实战《飞机大战》热身内容

飞机大战

pygame的初始化和退出

在使用pygame提供的所有功能之前,需要调用init方法,在游戏结束之前,需要调用一下quit方法。

方法说明
pygame.init()导入并初始化所有pygame模块,在使用其他模块之前,必须先调用init方法
pygame.quit()卸载所有pygame模块,在游戏结束前调用

pygame中的坐标系,坐标原点在左上角,x轴水平向右,y轴垂直向下。

在游戏中所有可见元素都是以矩形区域来描述位置的:

(x, y)(width, height)
Rect类

pygame中专门提供了一个子类pygame.Rect用于描述矩形区域。

Rect(x, y, width, height) -->Rect

在这里插入图片描述
pygame.Rect是一个比较特殊的类,不执行pygame.init()方法也能使用。

访问size属性时会返回一个元组,元组的第一个值是矩形的宽度,第二个值是高度

创建主窗口:pygame.display

pygame专门提供了一个模块pygame.display用于创建、管理游戏窗口。

方法说明
pygame.display.set_mode()初始化游戏窗口
pygame.display.update()刷新屏幕显示,稍后使用

set_mode方法

set_mode方法用于创建游戏窗口

set_mode(resolution=(0,0),flags=0,depth=0) -->Surface

resolution指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致
flags参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
depth参数模式颜色位数,默认自动匹配

返回值:暂时可以理解为游戏屏幕,游戏元素都需要被绘制在游戏屏幕上

必须使用变量记录set_mode方法的返回结果,因为后续所有图像的绘制都基于这个返回结果

screen = pygame.display.set_mode(400, 700)
实现图像的绘制

1、使用image模块中的load方法pygame.image.load()加载图像数据
2、使用游戏屏幕对象,调用blit方法将图像绘制到指定位置
3、调用pygame.display.update方法更新整个屏幕的显示
在这里插入图片描述
游戏的动画实现本质上是快速的在屏幕上绘制图像并刷新,一般每秒60次即可达到高品质动画效果,每次绘制的结果被称帧。

游戏循环

游戏循环象征着游戏的正式开始。
在这里插入图片描述
游戏时钟

pygame中专门提供了一个pygame.time.Clock类可以非常方便的设置刷新帧率。

1、在游戏初始化的时候创建一个时钟对象
2、在游戏循环内部让时钟调用tick(帧率)方法

tick方法会根据上次被调用的时间,自动设置游戏循环中的延时,可以指定循环体内部代码执行的频率。

英雄移动动画的实现:
1、在游戏初始化中定义一个pygame.Rect的变量记录英雄的位置
2、在循环中每次让英雄的y - 1 实现向上移动
3、y <= 0时,让英雄移动到屏幕底部

每次调用update()方法之前,都需要把所有图像重新绘制一遍,而且应该最先绘制背景图像。

在循环中监听事件

pygame中通过pygame.event.get()可以获得用户当前所做动作的事件列表

监听游戏退出事件:

clock = pygame.time.Clock()
while True:
	clock.tick(60)
	for even in pygame.event.get():
		if event.type == pygame.QUIT:
			print("退出游戏")
			pygame.quit()
			exit()

pygame.quit() 可以卸载所有pygame模块

exit()内置函数可以吧当前正在执行的程序直接退出
break可以退出当前的循环,如果上面的程序用break,只会退出for循环,不会退出while True循环。

精灵、精灵组

pygame中提供的高级类—精灵、精灵组

pygame.sprite.Sprite —存储图像数据image和位置rect的对象
pygame.sprite.Group —包含了多个精灵的对象

精灵包含连个对象,两个方法
因为每个精灵的移动方式不同,所以需要使用派生类,来重写update方法。

精灵组调用一次update方法,精灵组中的精灵就会各自调用自己的update方法。
精灵组调用一次draw方法,精灵组中所有精灵的image都会绘制到屏幕上的rect位置。
在这里插入图片描述
在这里插入图片描述
因为如果没处理一张图片都需要加载、绘制、更新、那么代码就非常繁琐,所以可以将每张图片作为精灵类的一个派生类来加载和更新位置,然后将每个精灵都添加到精灵组中,在精灵组中统一进行绘制和更新,使代码更简洁。

派生精灵子类

1、新建一个plane_sprites.py文件
2、定义GameSprite类继承自pygame.sprite.Sprite精灵类

注意:如果一个类的父类不是object,在重写初始化方法时,一定要先super()一下父类的__init__方法,保证父类中实现的__init__代码能够被正常执行,因为如果不调用一下父类方法,就会只执行子类的__init__方法,相当于被覆盖了。
在这里插入图片描述
属性:
image精灵图像,使用image_name加载
rect精灵大小,默认使用图像大小
speed精灵移动速度,默认为1

方法
update每次更新屏幕时在游戏循环内调用

self.rect.y += self.speed

提示
imageget_rect()方法,可以返回pygame.Rect(0, 0 图像宽, 图像高)的对象

创建派生精灵类示例:
在新建的plane_sprites.py中编写如下代码:

# *-*coding:utf-8*-*
import pygame
pygame.init()


class GameSprite(pygame.sprite.Sprite):
    """游戏精灵子类"""

    def __init__(self, image_name, speed=1):
        # 调用父类初始化方法
        super().__init__()
        self.image = pygame.image.load(image_name)
        self.speed = speed
        self.rect = self.image.get_rect()

    def update(self):
        self.rect.y -= self.speed

这样在主程序中就可以通过派生精灵类来创建敌机对象。

在游戏循环上方添加:

enemy = GameSprite("c\images\zed.png")
enemy1 = GameSprite("c\images\zed1.png", 2)
enemy_Group = pygame.sprite.Group(enemy, enemy2)

游戏循环内部调用精灵组的方法

enemy_group.update()
enemy_group.draw(screen)

screen是用set_mod方法创建的屏幕对象。

这样就大大简化了代码的开发。

以上是《飞机大战》游戏开发需要知道的热身内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值