PygamePygame游戏开发(三)_背景颜色  Pygame是个游戏开发的敲门砖,大家可以按照自己的喜好选择是否学习Pygame。喜欢游戏的同学可以学习Pygame,制作一个自己喜欢的小游戏。因为是游戏,我特意将背景设为了天空,希望大家在学习游戏开发时遨游梦想天空,体会游戏快乐!Pygame游戏开发(三)_图层_02Pygame游戏开发(三)_图层_03

一、Pygame的色彩及绘图机制

 再上一个例子中我们已经用到了Pygame的屏幕绘制绘制,在这一节我们将继续深入的讲解pygame的色彩及绘图机制。


先介绍一些函数

pygame.Color

Color类用于表达色彩,使用RGB或RGBA色彩模式,A可选。Color类可以用色彩名字、RGBA值、HTML色彩格式等方式定义Color(name)、Color(r,g,b,a)或Color(rgbvalue),例:

Color(“grey”)

Color(190,190,190,255)

Color("#BEBEBEFF")

pygame.Color.r 获得Color类的红色值r

pygame.Color.g 获得Color类的绿色值g

pygame.Color.b 获得Color类的蓝色值b

pygame.Color.a 获得Color类的aphla值a

pygame.Color.normalize 将RGBA各通道值归一到0-1之间


alpha通道

RGBA为RGB模式的衍生,alpha通道表示不透明度,取值0-255,默认255。alpha通道值越大,不透明度越高。

下面我们更改一下我们之前小游戏的代码,有助于大家理解:

import pygame,sys


pygame.init() #初始化参数
size = width, height = 600,400 #设置窗体大小参数
speed = [1,1] #设置移动速度参数
BLACK = 0, 0, 0 #设置背景颜色参数RGB
screen = pygame.display.set_mode(size, pygame.RESIZABLE) #窗口大小可调


icon = pygame.image.load("code.jpg") #导入图标文件
pygame.display.set_icon(icon) #设置图标文件
pygame.display.set_caption("跟着夜寒学Python") #设置标题栏
ball = pygame.image.load("test.png") #导入图片,注意图片为自己下载的,在自己机子上运行时注意更改
ballrect = ball.get_rect() #设置图片surface参数
fps = 300 #设置刷新帧率参数
fclock = pygame.time.Clock() #创建clock.用于后续操作刷新时间
still = False
bgcolor = pygame.Color("black") #创建背景的颜色


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


while True:
for event in pygame.event.get(): #获取事件
if event.type == pygame.QUIT: #点击右上角叉退出
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] ==0 else (abs(speed[0]) -1 )* int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] ==0 else (abs(speed[1]) -1 )* int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_ESCAPE:
sys.exit()
elif event.type == pygame.VIDEORESIZE: #界面可调
size = width, height = event.size[0], event.size[1]
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
elif event.type == pygame.MOUSEBUTTONDOWN: #鼠标按下
if event.button == 1:
still = True
elif event.type == pygame.MOUSEBUTTONUP: #鼠标抬起
still = False
if event.button == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
elif event.type == pygame.MOUSEMOTION:
if event.buttons[0] == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
if pygame.display.get_active() and not still: #是否最小化界面
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
speed[0] = - speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = - speed[1]
if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
speed[1] = - speed[1]


bgcolor.r = RGBChannel(ballrect.left*255/width)
bgcolor.g = RGBChannel(ballrect.top*255/height)
bgcolor.b = RGBChannel(min(speed[0],speed[1])*255/max(speed[0],speed[1],1))
screen.fill(bgcolor) #设置轨迹填充
screen.blit(ball, ballrect) #将图片放在rect切线矩形上
pygame.display.update() #刷新
fclock.tick(fps) #刷新帧率


Pygame游戏开发(三)_图层_03

二、Pygame图形绘制体系



先介绍一些函数

pygame.draw

图形绘制后,返回一个矩形rect类表示该形状

pygame.Rect

表达一个矩形区域的类,用于储存坐标和长度信息。Pygame利用Rect类操作图形/图像等元素。其中包含四个参数:矩形的左上角坐标(left,top)和矩形的宽度width高度height。

Rect类提供了如下属性,返回一个数值或一个代表坐标的元组,以下是一些参数,若需要具体参数意义还需参考官方文档。

Pygame游戏开发(三)_图层_05

Rect类提供了如下方法,用来操作Rect类,若需要具体用法还需参考官方文档。

Pygame游戏开发(三)_学python_06

pygame.draw

用于绘制图形,以下是绘制图形的一些方法:

.rect(Surface,color,Rect,width)

绘制矩形,其中Surface:矩形的绘制屏幕;Color:矩形的绘制颜色;Rect:举行的绘制区域;width:绘制边缘的宽度,默认为0,即填充图形。下面给大家一个例子方便大家理解。

import pygame,sys                #引入


pygame.init() #初始化
screen = pygame.display.set_mode((600, 400)) #设置窗体大小
pygame.display.set_caption("跟着夜寒学Python") #设置标题栏
GOLD = 255, 251, 0
RED = pygame.Color('red')


r1rect = pygame.draw.rect(screen, GOLD, (100,100,200,100), 5)
r2rect = pygame.draw.rect(screen, RED, (210,210,200,100), 0)


while True: #无限循环
for event in pygame.event.get():
if event.type == pygame.QUIT: #设置推出响应
sys.exit() #退出程序
pygame.display.update()


.polygon(Surface,color,position,width)

绘制多边形,其中

Surface:多边形的绘制屏幕;

Color:多边形的绘制颜色;

position:多边形顶点坐标列表;

width=0绘制边缘的宽度,默认为0,即填充图形


.circle(Surface,color,pos,radius,width)

绘制圆形,其中

Surface:圆形的绘制屏幕;

Color:圆形的绘制颜色;

pos:圆形的原心坐标;

radius:圆形的半径;

width:绘制边缘的宽度,默认为0,即填充图形


.ellipse(Surface,color,Rect,width)

绘制椭圆,其中

Surface:椭圆形的绘制屏幕;

Color:椭圆形的绘制颜色;

Rect:椭圆形的绘制区域;

width:绘制边缘的宽度,默认为0,即填充图形


.arc(Surface,color,Rect,start_angle,stop_angle,width)

绘制椭圆弧形,其中

Surface:椭圆弧形的绘制屏幕;

Color:椭圆弧形的绘制颜色;

Rect:椭圆弧形的绘制区域;

start_angle,stop_angle:弧形绘制起始和结束的弧度值,横向右侧为0度;

width:绘制边缘的宽度,默认为0,即填充图形


.line(Surface,color,start_pos,stop_pos,width)

绘制直线,其中

Surface:直线的绘制屏幕;

Color:直线的绘制颜色;

start_pos,stop_pos:直线绘制的起始和结束坐标;

width:直线的宽度,默认为1


.lines(Surface,color,closed,pointlist,width)

绘制多条直线,其中

Surface:连续多线的绘制屏幕;

Color:连续多线的绘制颜色;

closed如果为True,起止点吉间自动增加封闭直线;

pointlist:连续多线的顶点坐标列表;

width:连续多线的宽度,默认为1

.aaline(Surface,color,start_pos,stop_pos,blend)

绘制无锯齿线,其中

Surface:无锯齿线的绘制屏幕;

Color:无锯齿线的绘制颜色;

start_pos,stop_pos:无锯齿线绘制的起始和结束坐标;

blend:不为0时,与线条所在背景颜色进行混合;

.aalines(Surface,color,closed,pointlist,blend)

Surface:连续无锯齿线的绘制屏幕;

Color:连续无锯齿线的绘制颜色;

closed如果为True,起止点吉间自动增加封闭直线;

pointlist:连续无锯齿线的顶点坐标列表;

blend:不为0时,与线条所在背景颜色进行混合;

下面给大家举一个例子,方便深入了解

import pygame, sys
from math import pi
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("跟着夜寒学Python")
GOLD = 255, 251, 0
RED = pygame.Color('red')
WHITE = 255, 255, 255
GREEN = pygame.Color('green')
#r1rect = pygame.draw.rect(screen, GOLD, (100,100,200,100), 5)
#r2rect = pygame.draw.rect(screen, RED, (210,210,200,100), 0)
e1rect = pygame.draw.ellipse(screen, GREEN, (50,50,500,300), 3)
c1rect = pygame.draw.circle(screen, GOLD, (200,180), 30, 5)
c2rect = pygame.draw.circle(screen, GOLD, (400,180), 30)
r1rect = pygame.draw.rect(screen, RED, (170, 130, 60, 10), 3)
r2rect = pygame.draw.rect(screen, RED, (370, 130, 60, 10))
plist = [(295,170), (285,250), (260,280), (340,280), (315,250), (305,170)]
l1rect = pygame.draw.lines(screen, GOLD, True, plist, 2)
a1rect = pygame.draw.arc(screen, RED, (200,220,200,100), 1.4*pi, 1.9*pi, 3)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()



ptgame.freetype

像屏幕上绘制特定字体的文字,文字不能直接print(),而是用像素根据字体点阵图绘制,注意需额外使用import导入


pygame.freetype.Font(file,size)

形成字体类型

file:字体类型名称或路径

size:字体的大小

Font.render_to(surf,dest,text,fgcolor,bgcolor,rotation,size)

surf:绘制字体的平面,Surface对象

dest:在平面中的具体位置,(x,y)

text:绘制的文字内容

fgcolor文字颜色

bgcolor背景颜色

rotation逆时针的旋转角度,取值0-359,部分字体可旋转

size文字大小,复制该参数将覆盖Font中的设定值

最后返回一个Rect类

下面给大家举个例子,方便大家理解


import pygame, sys
import pygame.freetype
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("跟着夜寒学Python")
GOLD = 255, 251, 0
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1rect = f1.render_to(screen, (200,160), "关注'夜寒信息'", fgcolor=GOLD, size=50)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()


Font.render_to(text,fgcolor,bgcolor,rotation,size)

text:绘制的文字内容

fgcolor文字颜色

bgcolor背景颜色

rotation逆时针的旋转角度,取值0-359,部分字体可旋转

size文字大小,复制该参数将覆盖Font中的设定值

最后返回一个元组,包含Surface对象和Rect对象

下面给大家举个例子,方便大家理解


import pygame, sys
import pygame.freetype
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("跟着夜寒学Python")
GOLD = 255, 251, 0
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1surf, f1rect = f1.render("关注'夜寒信息'", fgcolor=GOLD, size=50)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.blit(f1surf, (200,160))
pygame.display.update()


pygame.Surface

绘图层,或绘图平面,或图层

用于表示图形、文字或图像的绘制效果,与当前屏幕主图层可以并列存在,如果不绘制在主图层上、则不会被显示。


pygame.Rect

矩形区域

对应于当前主图层的某个具体区域,相当于某个矩形区域的指针或标识信息,可以指定图层绘制在某个矩形区域中。


下面给大家举个render_to方法的例子,方便大家理解


import pygame, sys
import pygame.freetype
pygame.init()
size = width, height = 600, 400
speed = [1,1]
GOLD = 255, 251, 0
BLACK = 0, 0, 0
pos = [230, 160]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("跟着夜寒学Python")
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1rect = f1.render_to(screen, pos, "关注'夜寒信息'", fgcolor=GOLD, size=50)
fps = 300
fclock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if pos[0] < 0 or pos[0] + f1rect.width > width:
speed[0] = - speed[0]
if pos[1] <0 or pos[1] + f1rect.height > height:
speed[1] = - speed[1]
pos[0] = pos[0] + speed[0]
pos[1] = pos[1] + speed[1]
screen.fill(BLACK)
f1rect = f1.render_to(screen, pos, "关注'夜寒信息'", fgcolor=GOLD, size=50)
pygame.display.update()
fclock.tick(fps)


下面给大家举个render方法的例子,方便大家理解


import pygame, sys
import pygame.freetype
pygame.init()
size = width, height = 600, 400
speed = [1,1]
GOLD = 255, 251, 0
BLACK = 0, 0, 0
pos = [230, 160]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("跟着夜寒学Python")
f1 = pygame.freetype.Font("C://Windows//Fonts//FZSTK.TTF", 36)
f1surf, f1rect = f1.render("关注'夜寒信息'", fgcolor=GOLD, size=50)
fps = 300
fclock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if pos[0] < 0 or pos[0] + f1rect.width > width:
speed[0] = - speed[0]
if pos[1] <0 or pos[1] + f1rect.height > height:
speed[1] = - speed[1]
pos[0] = pos[0] + speed[0]
pos[1] = pos[1] + speed[1]
screen.fill(BLACK)
f1surf, f1rect = f1.render("关注'夜寒信息'", fgcolor=GOLD, size=50)
screen.blit(f1surf, (pos[0], pos[1]))
pygame.display.update()
fclock.tick(fps)


Pygame游戏开发(三)_学python_07Pygame游戏开发(三)_背景颜色_08扫 码 关 注