Python游戏开发入门:pygame色彩与绘图机制-4

简介: Python游戏开发入门:pygame色彩与绘图机制-4

Pygame色彩与绘制机制

• Pygame色彩机制
• Pygame图形绘制机制
• Pygame文字绘制机制
• Pygame绘制机制原理精髓

Pygame色彩机制

色彩表达

Color类用于表达色彩,使用RGB或RGBA色彩模式,A可选
Color类可以用色彩名字、RGBA值、HTML色彩格式等方式定义
pygame.Color
Color(name) 例如:Color("grey")
Color(r,g,b,a) 例如:Color(190, 190, 190, 255)
Color(rgbvalue) 例如:Color("#BEBEBEFF")
红绿蓝三个通道颜色组合
• 覆盖视力所能感知的所有颜色
• RGB取值范围0-255

英文名称 R.G.B. 中文名称

white 255 255 255 白色
black 0 0 0 黑色
grey 190 190 190 灰色
darkgreen 0 100 0 深绿色
gold 255 215 0 金色
violet 238 130 238 紫罗兰
purple 160 32 240 紫色

RGBA色彩模式

• RGB色彩模式之外增加了第四维度:alpha通道
• alpha通道表示不透明度,取值0-255,默认255
• alpha通道值越大,不透明度越高,255表示不透明

pygame.Color类

pygame.Color.r 获得Color类的红色值r
pygame.Color.g 获得Color类的绿色值g
pygame.Color.b 获得Color类的蓝色值b
pygame.Color.a 获得Color类的不透明度值a
pygame.Color.normalize 将RGBA各通道值归一到0-1之间

Pygame图形绘制机制

图形绘制

向屏幕上绘制一些简单的图形,如直线、圆形、椭圆等
任何一个图形绘制后,会返回一个矩形Rect类表示该形状
pygame.draw
圆形绘制后,用Rect类表示

Rect类

表达一个矩形区域的类,用于存储坐标和长度信息
Pygame利用Rect类来操作图形/图像等元素
pygame.Rect
四个参数如下:
left, top, width, height
Rect类提供了如下属性,返回一个数值或一个代表坐标的元组
pygame.Rect
x, y, w, h, size, width, height
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
Rect类提供了如下方法,用来操作Rect类
pygame.Rect
.copy(), .move(), .inflate(), .clamp(), .clip(),
.union(), .unionall(), .fit(),
.normalize(), .contains(), .collidepoint()
.colliderect(), .collidelist(), .collidelistall(),
.collidedict(), .collidedictall()

图形绘制

pygame.draw
.rect() 矩形
.polygon() 多边形
.circle() 圆形
.ellipse() 椭圆形
.arc() 椭圆弧形
.line() 直线
.lines() 连续多线
.aaline() 无锯齿线
.aalines() 连续无锯齿线

矩形绘制

pygame.draw.rect(Surface, color, Rect, width=0)
• Surface 矩形的绘制屏幕
• color 矩形的绘制颜色
• Rect 矩形的绘制区域
• width=0 绘制边缘的宽度,默认为0,即填充图形

多边形绘制

pygame.draw.polygon(Surface, color, pointlist, width=0)
• Surface 多边形的绘制屏幕
• color 多边形的绘制颜色
• pointlist多边形顶点坐标列表
• width=0 绘制边缘的宽度,默认为0,即填充图形

圆形绘制

pygame.draw.circle(Surface, color, pos, radius, width=0)
• Surface 圆形的绘制屏幕
• color 圆形的绘制颜色
• pos 圆形的圆心坐标
• radius 圆形的半径
• width=0 绘制边缘的宽度,默认为0,即填充图形

椭圆形绘制

pygame.draw.ellipse(Surface, color, Rect, width=0)
• Surface 椭圆形的绘制屏幕
• Color 椭圆形的绘制颜色
• Rect 椭圆形的绘制区域
• width=0 绘制边缘的宽度,默认为0,即填充图形

椭圆弧形绘制

pygame.draw.arc(Surface, color, Rect, start_angle,
stop_angle, width=0)
• Surface 椭圆弧形的绘制屏幕
• Color 椭圆弧形的绘制颜色
• Rect 椭圆弧形的绘制区域
• start_angle, stop_angle 弧形绘制起始和结束弧度值
• width=0 绘制边缘的宽度,默认为0,即填充图形

直线绘制

pygame.draw.line(Surface, color, start_pos, end_pos, width=1)
• Surface 直线的绘制屏幕
• Color 直线的绘制颜色
• start_pos, end_pos 直线的起始和结束坐标
• width=1 直线的宽度,默认值为1

连续多线绘制

pygame.draw.lines(Surface, color, closed, pointlist, width=1)
• Surface 连续多线的绘制屏幕
• Color 连续多线的绘制颜色
• closed 如果为True,起止节点间自动增加封闭直线
• pointlist连续多线的顶点坐标列表
• width=1 连续多线的宽度,默认值为1

无锯齿线绘制

pygame.draw.aaline(Surface, color, start_pos, end_pos, blend=1)
• Surface 无锯齿线的绘制屏幕
• Color 无锯齿线的绘制颜色
• start_pos, end_pos 无锯齿线的起始和结束坐标
• blend=1 不为0时,与线条所在背景颜色进行混合

连续无锯齿线绘制

pygame.draw.aalines(Surface, color, closed, pointlist, blend=1)
• Surface 连续无锯齿线的绘制屏幕
• Color 连续无锯齿线的绘制颜色
• closed 如果为True,起止节点间自动增加封闭直线
• pointlist连续无锯齿线的顶点坐标列表
• blend=1 不为0时,与线条所在背景颜色进行混合

Pygame文字绘制机制

文字绘制

向屏幕上绘制特定字体的文字
文字不能直接print() ,而是用像素根据字体点阵图绘制
pygame.freetype
Windows系统
C:\Windows\Fonts
字体文件的扩展名
*.ttf *.ttc

文字绘制机制简介

pygame.freetype
pygame.freetype.Font
根据字体和字号生成
一个Font对象
Font.render_to()
用Font对象的render*方
法绘制具体文字

Font类

pygame.freetype.Font(file, size=0)
• file 字体类型名称或路径
• size 字体的大小

Font类的绘制方法(1)

Font.render_to(surf, dest, text, fgcolor=None,
bgcolor=None, rotation=0, size=0) —> Rect
surf 绘制字体的平面,Surface对象
• dest 在平面中的具体位置,(x,y)
• text 绘制的文字内容
• fgcolor 文字颜色
bgcolor 背景颜色
• rotation 逆时针的旋转角度,取值0-359,部分字体可旋转
• size 文字大小,赋值该参数将覆盖Font中的设定值
Rect 返回一个Rect对象

Font类的绘制方法(2)

Font.render(text, fgcolor=None, bgcolor=None,
rotation=0, size=0) —> (Surface, Rect)
• text 绘制的文字内容
• fgcolor, bgcolor 字体颜色、背景颜色
• rotation 逆时针的旋转角度,取值0-359,部分字体可旋转
• size 文字大小,赋值该参数将覆盖Font中的设定值
返回一个元组,包含Surface对象和Rect对象

Pygame绘图机制原理精髓

理解Pygame的两个重要类型
pygame.Surface 
绘图层,或绘图平面,或图层
• 用于表示图形、文字或图像的绘制效果
• 与当前屏幕主图层可以并列存在
• 如果不绘制在主图层上,则不会被显示

pygame.Rect

矩形区域
• 对应于当前主图层的某个具体区域
• 相当于某个矩形区域的指针或标识信息
• 可以指定图层绘制在某个矩形区域中
主图层
由pygame.display.set_mode((width, height))生成的Surface对象
在主图层上绘制其他图层使用.blit(pygame.Surface, pygame.Rect)方法
pygame.Surface包含某个图形的图层
pygame.Rect定位某个区域

代码示例

图形绘制

# -*- coding: utf-8 -*-
# @File    : pygame_draw.py
# @Date    : 2018-05-24
from math import pi
import pygame,sys
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame图形绘制")
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)
al1rect = pygame.draw.aalines(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()

a18.1.png


文字绘制

# -*- coding: utf-8 -*-
# @File    : pygame_text.py
# @Date    : 2018-05-25
import pygame,sys
import pygame.freetype
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame文字绘制")
GOLD = 255, 251, 0
f1 = pygame.freetype.Font('C://Windows//Fonts//msyh.ttc', 36) #微软雅黑
# 方式一:
f1rect = f1.render_to(screen, (200,100), "世界和平", fgcolor=GOLD, size=50)
# 方式二:
f2surf, f2rect = f1.render("宇宙和谐", fgcolor=GOLD, size=50)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        screen.blit(f2surf, (200, 200))
        pygame.display.update()
相关文章
|
Windows Python 网络安全
Python pygame安装过程笔记
今天看到一个教程,是关于Python安装pygame模块的。觉得很好,拿来分享一下。 安装Python 额,这个小题貌似在这里很是多余啊。但是为了照顾到刚刚学习Python的童鞋,我还是多啰嗦两句吧。
1227 0
|
19天前
|
存储 程序员 开发者
Python编程基础:从入门到实践
【10月更文挑战第8天】在本文中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息。我们将从Python的基本概念开始,然后逐步深入到更复杂的主题,如数据结构、函数和类。最后,我们将通过一些实际的代码示例来巩固我们的知识。让我们一起开始这段Python编程之旅吧!
|
7天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
2天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
7天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。
26 9
|
3天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
4天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
1天前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
7 1
|
5天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
13 3
|
5天前
|
Python
Python编程中正则表达式的使用
【10月更文挑战第22天】正则表达式,一种强大的文本处理工具,在Python编程中有着广泛的应用。本文将介绍如何使用Python中的re库来使用正则表达式,包括如何创建、匹配、查找和替换字符串等。通过学习本文,你将能够掌握Python中正则表达式的基本使用方法。