用Python和Pygame写游戏-从入门到精通(7)
admin
2023-07-31 00:36:45
0

我们上一个章节使用了pygame.draw中的一些函数,这个模块的作用是在屏幕上绘制各种图形。事实上,你可以不加载任何图片,只是要这些图形来制作一个游戏(经典游戏Asteroids便是,这里有一个HTML5写就的例子。好像访问不了?搜个Flash版吧,多得很)。

注:该图与该文无任何联系(最近在玩神鬼寓言3,感觉还是不错的~)

pygame.draw中函数的第一个参数总是一个surface,然后是颜色,再后会是一系列的坐标等。稍有些计算机绘图经验的人就会知道,计算机里的坐标,(0,0)代表左上角。而返回值是一个Rect对象,包含了绘制的领域,这样你就可以很方便的更新那个部分了。

函数 作用
rect 绘制矩形
polygon 绘制多边形(三个及三个以上的边)
circle 绘制圆
ellipse 绘制椭圆
arc 绘制圆弧
line 绘制线
lines 绘制一系列的线
aaline 绘制一根平滑的线
aalines 绘制一系列平滑的线

我们下面一个一个详细说明。

pygame.draw.rect

用法:pygame.draw.rect(Surface, color, Rect, width=0)

pygame.draw.rect在surface上画一个矩形,除了surface和color,rect接受一个矩形的坐标和线宽参数,如果线宽是0或省略,则填充。我们有一个另外的方法来画矩形——fill方法,如果你还记得的话。事实上fill可能还会快一点点,因为fill由显卡来完成。

pygame.draw.polygon

用法:pygame.draw.polygon(Surface, color, pointlist, width=0)

polygon就是多边形,用法类似rect,第一、第二、第四的参数都是相同的,只不过polygon会接受一系列坐标的列表,代表了各个顶点。

pygame.draw.circle

用法:pygame.draw.circle(Surface, color, pos, radius, width=0)

很简单,画一个圆。与其他不同的是,它接收一个圆心坐标和半径参数。

pygame.draw.ellipse

用法:pygame.draw.ellipse(Surface, color, Rect, width=0)

你可以把一个ellipse想象成一个被压扁的圆,事实上,它是可以被一个矩形装起来的。pygame.draw.ellipse的第三个参数就是这个椭圆的外接矩形。

pygame.draw.arc

用法:pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1)

arc是椭圆的一部分,所以它的参数也就比椭圆多一点。但它是不封闭的,因此没有fill方法。start_angle和stop_angle为开始和结束的角度。

pygame.draw.line

用法:pygame.draw.line(Surface, color, start_pos, end_pos, width=1)

我相信所有的人都能看明白。

pygame.draw.lines

用法:pygame.draw.lines(Surface, color, closed, pointlist, width=1)

closed是一个布尔变量,指明是否需要多画一条线来使这些线条闭合(感觉就和polygone一样了),pointlist是一个点的数组。

上面的表中我们还有aaline和aalines,玩游戏的都知道开出“抗锯齿(antialiasing)”效果会让画面更好看一些,模型的边就不会是锯齿形的了,这两个方法就是在画线的时候做这事情的,参数和上面一样,省略。

我们用一个混杂的例子来演示一下上面的各个方法:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 #!/usr/bin/env python import pygamefrom pygame.locals import *from sys import exit from random import *from math import pi pygame.init()screen = pygame.display.set_mode((640, 480), 0, 32)points = [] while True:     for event in pygame.event.get():        if event.type == QUIT:            exit()        if event.type == KEYDOWN:            # 按任意键可以清屏并把点回复到原始状态            points = []            screen.fill((255,255,255))        if event.type == MOUSEBUTTONDOWN:            screen.fill((255,255,255))            # 画随机矩形            rc = (randint(0,255), randint(0,255), randint(0,255))            rp = (randint(0,639), randint(0,479))            rs = (639randint(rp[0], 639), 479randint(rp[1], 479))            pygame.draw.rect(screen, rc, Rect(rp, rs))            # 画随机圆形            rc = (randint(0,255), randint(0,255), randint(0,255))            rp = (randint(0,639), randint(0,479))            rr = randint(1, 200)            pygame.draw.circle(screen, rc, rp, rr)            # 获得当前鼠标点击位置            x, y = pygame.mouse.get_pos()            points.append((x, y))            # 根据点击位置画弧线            angle = (x/639.)*pi*2.            pygame.draw.arc(screen, (0,0,0), (0,0,639,479), 0, angle, 3)            # 根据点击位置画椭圆            pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y))            # 从左上和右下画两根线连接到点击位置            pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y))            pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y))            # 画点击轨迹图            if len(points) > 1:                pygame.draw.lines(screen, (155, 155, 0), False, points, 2)            # 和轨迹图基本一样,只不过是闭合的,因为会覆盖,所以这里注释了            #if len(points) >= 3:            #    pygame.draw.polygon(screen, (0, 155, 155), points, 2)            # 把每个点画明显一点            for p in points:                pygame.draw.circle(screen, (155, 155, 155), p, 3)     pygame.display.update()

运行这个程序,在上面点鼠标就会有图形出来了;按任意键可以重新开始。另外这个程序只是各个命令的堆砌,并不见得是一个好的程序代码。

到这次为止,文字、颜色、图像、图形都讲好了,静态显示的部分都差不多了。然而多彩的游戏中只有静态的东西实在太让人寒心了(GalGame大多如此),下次开始我们学习游戏中的动画制作。


相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python查找阿姆斯特朗数 题目解释 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。 例如1^3 + 5...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...