上一节我们实现了一个简单的弹球动画,本节我们将在这个程序的基础上进行改进,增加一个新的功能,就是背景随着小球的移动不断变换。

用python和pygame游戏编程入门-弹球[变换背景]

第一步:定义一个bgcolor对象,这是Pygame 中用于描述颜色的对象


bgcolor = pygame.Color("black")


Pygame 使用 Color 类表示 RGBA 颜色值,每个颜色值的取值范围是 0 ~ 255。允许通过基本的算术运算创造新的颜色值,支持转换为其他颜色空间,例如 HSV 或 HSL,并让你调整单个颜色通道。当没有给出 alpha 的值是,默认是 255(不透明)。

第二步:设置bgcolor对象的RGB色彩,色彩值与当前小球的位置相关联,实现小球位置变化,背景颜色也跟着改变

pygame.Color.r  —  获取或设置 Color 对象的红色值

pygame.Color.g  —  获取或设置 Color 对象的绿色值

pygame.Color.b  —  获取或设置 Color 对象的蓝色值

具体代码:

bgcolor.r = RGBchannel(ballrect.left*255/width)
bgcolor.g = RGBchannel(ballrect.left * 255 / height)
bgcolor.b = RGBchannel(min(speed[0],speed[1]) * 255 / max(speed[0],speed[1],1))

RGBchannel(a)是自定义的一个方法,负责返回一个0~255的值,当a<0时 返回值为0,当a>255时 返回值为255,当0

第三步:定义RGBchannel(a)方法:

def RGBchannel(a):
    return 0 if a<0 else (255 if a>255 else int(a))

第四步: 由于图片不断运动,运动后原位置默认填充白色,因此需要不断刷新,更新背景颜色,将之前的黑色背景改为bgcolor


screen.fill(bgcolor)


完整的程序代码:

import pygame, sys  # 引入pygame sys	
pygame.init()  # 初始化  对pygame内部各功能模块进行初始化创建及变量设置,默认调用
size = width, height = 600, 400

speed = [1,1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size)  
pygame.display.set_caption("弹球")  # 设置窗口标题
ball = pygame.image.load("img/ball.png")  # pygame.image.load(filename) 将filename路径下的图像载入游戏,支持13种常用图片格式
ballrect = ball.get_rect()              # surface对象 ball.get_rect() pygame使用内部定义
fps = 300  # Frame per second 每秒帧率参数
fclock = pygame.time.Clock()  # pygame.time.Clock() 创建一个Clock对象,用于操作时间surface对象表示所有载入的图像,其中.get_rect()方法返回一个覆盖图像的矩形(图像的外接矩形)rect对象rect中top, bottom, left, right表示上下左右,width, height表示宽度,高度
bgcolor = pygame.Color("black")
def RGBchannel(a):
	#当a<0时 返回值为0,当a>255时 返回值为255,当0255 else int(a))

while True:  # 执行死循环
    for event in pygame.event.get():  # 从事件队列中取出事件,并从队列中删除该事件
        if event.type == pygame.QUIT:  # pygame.QUIT是Pygame中定义的退出时间常量
            sys.exit()      # sys.exit()用于退出结束游戏并退出
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
               sys.exit()   # sys.exit()用于退出结束游戏并退出

    if pygame.display.get_active() :     #当显示器上处于活动状态时返回True,进一步半段后可以暂停游戏,改变响应模式等
        ballrect = ballrect.move(speed[0],speed[1])  # ballrect.move(x,y) 矩形移动一个偏移量(x,y)x,y为整数
    if ballrect.left < 0 or ballrect.right > width:
            speed[0] = -speed[0] 
    if ballrect.top < 0 or ballrect.bottom > height:
            speed[1] = -speed[1]  # 碰壁后速度取反
	
    bgcolor.r = RGBchannel(ballrect.left*255/width)
    bgcolor.g = RGBchannel(ballrect.left * 255 / height)
    bgcolor.b = RGBchannel(min(speed[0],speed[1]) * 255 / max(speed[0],speed[1],1))
	#显示窗口背景填充为color颜色采用RGB色彩体系 由于图片不断运动,运动后原位置默认填充白色,因此需要不断刷新
    screen.fill(bgcolor)

    screen.blit(ball, ballrect)     # screnen,blit(src,dest)将图像绘制在另一个图像上,即将src绘制到dest位置上,通过rect对象引导对壁球的绘制
    pygame.display.update()      # 对显示窗口进行刷新,默认窗口全部重绘
    fclock.tick(fps)    # clock.tick(framerate) 控制帧速度,即窗口刷新速度。

本站内容未经许可,禁止任何网站及个人进行转载。