Primitive Drawing Functions(原始绘图功能)

Pygame提供了几种不同的功能,用于在表面对象上绘制不同的形状。这些形状(例如矩形,圆形,椭圆形,线条或单个像素)通常称为绘图基元(drawing primitives)。

代码

# -*- coding:utf-8 -*-

import pygame, sys
from pygame.locals import*

pygame.init()

# set up the window
DISPLAYSURF = pygame.display.set_mode((500, 400))
pygame.display.set_caption('Drawing')

# set up the colors
BLACK = (0, 0, 0) # 这样做使代码更具可读性
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# draw on the surface object
DISPLAYSURF.fill(WHITE)
pygame.draw.polygon(DISPLAYSURF, GREEN, ((146, 0), (291, 106), (236, 277), \
(56, 277), (0, 106)))
pygame.draw.line(DISPLAYSURF, BLUE, (60, 60), (120,60), 4)
pygame.draw.line(DISPLAYSURF, BLUE, (120, 60), (60, 120))
pygame.draw.line(DISPLAYSURF, BLUE, (60, 120), (120, 120), 4)
pygame.draw.circle(DISPLAYSURF, BLUE, (300, 50), 20, 0)
pygame.draw.ellipse(DISPLAYSURF, RED, (300, 250, 40, 80), 1)
pygame.draw.rect(DISPLAYSURF, RED, (200, 150, 100, 50))

pixObj = pygame.PixelArray(DISPLAYSURF)
pixObj[480][380] = BLACK
pixObj[482][382] = BLACK
pixObj[484][384] = BLACK
pixObj[486][386] = BLACK
pixObj[488][388] = BLACK
del pixObj

# run the game loop
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

结果

Drawing.PNG

下面解释代码
1、fill(color) - fill() 方法不是函数,而是pygame.Surface对象的方法。它将使用的颜色填充整个Surface对象。
2、pygame.draw.polygon(surface, color, pointlist, width)– 多边形是仅由平面构成的形状。在surface和颜color参数告诉在什么表面绘制多边形的功能,绘出什么颜色。
所述pointlist参数是一个元组或点的列表(即,元组或两个整数元组为XY坐标的列表)。通过在每个点和元组中后面的点之间绘制线来绘制多边形。然后从最后一个点到第一个点绘制一条线。还可以传递点数列表。
宽度参数是可选的。如果将其遗漏,将填充绘制的多边形,就像屏幕上的绿色多边形用颜色填充一样。如果为width参数传递整数值,则仅绘制多边形的轮廓。整数表示多边形轮廓的宽度。为width 参数传递1将产生一个瘦多边形,而传递4 或10或20将产生更厚的多边形。如果为width参数传递整数0,则将填充多边形(就像离开宽度一样) 完全参数)。
所有pygame.draw绘图函数最后都有可选的宽度参数,它们的工作方式与pygame.draw.polygon()的width 参数相同。宽度 参数的更好名称可能是厚度,因为该参数控制绘制线条的粗细度。
3、pygame.draw.line(surface, color, start_point, end_point, width) - 此函数在start_point 和end_point参数之间绘制一条线。
4、pygame.draw.lines(surface, color, closed, pointlist, width) - 这个函数从一个点到下一个点绘制一系列的线,就像pygame.draw.polygon()一样。唯一的区别是,如果为关闭的参数传递False,则不会有从pointlist参数的最后一个点到第一个点的一条线。如果传递True,则会从最后一个点到第一个点绘制一条线。
5、pygame.draw.circle(surface, color, center_point, radius, width) - 此函数绘制一个圆。圆的中心位于center_point参数处。为radius参数传递的整数设置圆的大小。
圆的半径是从中心到边缘的距离。(圆的半径始终是直径的一半。)为半径参数传递20将绘制一个半径为20像素的圆。
6、pygame.draw.ellipse(surface, color, bounding_rectangle, width) - 此函数绘制一个椭圆(类似于压扁或拉伸的圆圈)。此函数具有所有常用参数,但为了告诉函数绘制椭圆的大小和位置,必须指定椭圆的边界矩形。边界矩形 是可以围绕形状中绘制的最小矩形。
所述bounding_rectangle参数可以是一个pygame.Rect 对象或四个整数的元组。请注意,您没有像对pygame.draw.circle() 函数那样指定椭圆的中心点。
7、pygame.draw.rect(surface, color, rectangle_tuple, width)- 此函数绘制一个矩形。所述rectangle_tuple 是任一的四个整数的元组(对于XY坐标的左上角,而宽度和高度)或pygame.Rect 对象可以被替代。如果rectangle_tuple 具有相同的宽度和高度大小,则将绘制一个正方形。

pygame.PixelArray Objects

没有一个函数你可以调用它将一个像素设置为一个颜色(除非你 用相同的起点和终点调用pygame.draw.line())。Pygame框架需要在绘制到Surface对象之前和之后运行一些代码。如果必须为您想要设置的每个像素执行此操作,则程序运行速度会慢得多。(通过我的快速测试,以这种方式绘制像素要慢两到三倍。)
相反,应该创建一个Surface 对象的pygame.PixelArray对象(我们将其简称为PixelArray对象),然后设置单个像素。创建Surface对象的PixelArray对象将“锁定”Surface对象。当Surface对象被锁定时,仍然可以在其上调用绘图函数,但是它不能使用blit()方法在其上绘制PNG或JPG图像等图像。(blit()方法将在本章后面解释。)
如果要查看Surface对象是否已锁定,则get_locked() Surface方法将在锁定时返回True,否则返回False 。
pygame.PixelArray()返回的PixelArray对象可以通过使用两个索引访问它们来设置单个像素。例如,代码中pixObj [480] [380] = BLACK将X坐标480和Y坐标380的像素设置为黑色(记住BLACK变量存储颜色元组(0,0,0))。
要告诉Pygame您已完成绘制单个像素,请使用del语句删除PixelArray对象。删除PixelArray对象将“解锁”Surface对象,以便您可以再次在其上绘制图像。如果您忘记删除PixelArray对象,则下次尝试将图像blit(即绘制)到Surface时,程序将引发一个错误,指出“·pygame.error: Surfaces must not be locked during blit ”。

The pygame.display.update() Function

完成调用绘图函数以使显示Surface对象看起来像你想要的方式后,你必须调用pygame.display.update()使显示Surface实际出现在屏幕上。
你必须记住的一件事是pygame.display.update()只会使显示Surface(即从调用pygame.display.set_mode()调用返回的Surface对象)出现在屏幕上。如果希望其他Surface对象上的图像出现在屏幕上,则必须使用blit()方法将它们“blit”(即复制它们)到显示Surface对象( “绘图图像”中将对此进行说明)部分)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容