天天看點

Python遊戲開發入門:pygame色彩與繪圖機制-4Pygame色彩機制Pygame圖形繪制機制Pygame文字繪制機制Pygame繪圖機制原理精髓代碼示例

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()      
Python遊戲開發入門:pygame色彩與繪圖機制-4Pygame色彩機制Pygame圖形繪制機制Pygame文字繪制機制Pygame繪圖機制原理精髓代碼示例
# -*- 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()