我不知道polygon函数如何排序点,文档也无济于事,所以我无法制作所需的菱形。
答案 0 :(得分:1)
想象一下,您要在一张纸的坐标系中绘制这些点,然后立即用一条接一条的线将它们连接起来。因此,第一个点将连接到第二个点,第二个点将连接到第三个点,依此类推,最后一个点将连接到第一个点。最后,将得到的形状填充为所需的颜色。
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue')
points = [(200, 200), (250, 250), (200, 300), (150, 250)]
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
screen.fill(BG_COLOR)
pg.draw.polygon(screen, BLUE, points)
pg.display.flip()
clock.tick(60)
答案 1 :(得分:1)
Pygame.draw.polygon
是一项功能,可用于将多个点连接在一起并将它们绘制为形状。
这使您可以绘制形状灵活。如果您要记住的形状在pygame.draw
或pygame.gfxdraw
的某处没有任何功能,则可以使用此功能自行创建。
以您要绘制的钻石为例。
首先,您可以绘制一个正方形并将其绕其中心旋转45°,
但由于您想使用polygon
函数(可能更整洁)来绘制它,因此下面是一个示例
注意:用于此目的的点计算如下:
首先定义宽度和高度 :
diamondWidth = 80
diamondHeight = 100
第1点和第3点 (菱形的顶部和底部):
点1可以是屏幕上的任何点。如果愿意,您可以将其视为钻石的位置。
我希望菱形位于中心,所以我将其定义如下:
pos1 = (screenWidth/2, screenHeight/2 - diamondHeight/2)
关于点3,它是菱形的底点。这意味着它具有相同的X,但是y值更大(具体来说,比点1的y值大diamondHeight
)。那应该很容易
pos3 = (pos1[0], pos1[1]+diamondHeight)
第2点和第4点 (菱形的左右两点):
点2和4之一必须在菱形的右边,另一个必须在菱形的左边。假设Point 2是左点。然后可以定义如下:
pos2 = (pos1[0] - diamondWidth/2, pos1[1] + diamondHeight/2)
点4只会在另一侧,这意味着它具有相同的Y值,但比点2的Y值小diamondWidth
。在我的情况下,由于Point 2位于左侧,而Point 4位于右侧,所以Point {4}比Point 2高diamondWidth
。
pos4 = (pos2[0]+diamondWidth, pos2[1])
现在我们定义了钻石的点,我们可以使用pygame.draw.polygon
函数将它们连接起来并绘制形状。
您提到对函数感到困惑,因此这里是参数概述:
pygame.Surface
实例。在大多数情况下,这是您在代码顶部定义的屏幕。rgb
值。如果您在第一个参数中传递的rgba
实例收到一个pygame.Surface
标志,则pygame.SRCALPHA
值(增加透明度/半透明)可以生效,如下所示:
pygame.Surface((width, height), pygame.SRCALPHA)
pointlist:要连接的点的列表(也许是元组)。这些是按照它们连接的顺序进行的。即:列表中的第一点连接到第二点,第二点连接到第三点,第三点连接到第四点,依此类推。 最后一点也连接到第一个点以完成形状(否则将是一个开放形状,它的最后一侧未连接)
width:最终(可选)参数。有时没有通过,因为 默认为0。
如果值为0:形状将使用之前传递的color参数填充。
如果形状> 0:仅绘制形状的轮廓,并且不填充该形状。线的粗细为该值 您通过。
我希望这可以解决。如果有任何疑问,请跟进
因此,这是使用多边形函数的示例。我只包含了主循环和一些设置,以缩短其长度。如果删除注释和一些设置代码(可能用您自己的代码替换),那么它将变成一个非常简短的程序:
import pygame
from pygame.locals import *
screenWidth = 600
screenHeight = 600
pygame.init()
window = pygame.display.set_mode((screenWidth, screenHeight))
pygame.display.set_caption("Diamond")
clock = pygame.time.Clock()
MAXFPS = 30
# define the diamond points as described above
diamondWidth = 80
diamondHeight = 100
pos1 = (screenWidth/2, screenHeight/2 - diamondHeight/2)
pos2 = (pos1[0] - diamondWidth/2, pos1[1] + diamondHeight/2)
pos3 = (pos1[0], pos1[1]+diamondHeight)
pos4 = (pos2[0]+diamondWidth, pos2[1])
# points for the first diamond
points = [pos1, pos2, pos3, pos4]
# points for the second diamond, which are exactly like the first except their
# Y value is incremented over the original points so it does not appear over
# it, but rather to it's left
secondPoints = [(p[0]+diamondWidth+10, p[1]) for p in points]
stop = False
while not stop:
for event in pygame.event.get():
if event.type == QUIT:
stop = True
window.fill((255, 255, 255))
# DRAWING THE DIAMOND:
# Here is where we connect all the points in the [points] array, and
# draw them as a shape with a certain color (used cian because it's
# a diamond-dy color lol)
# Draw filled diamond
pygame.draw.polygon(window, (0, 255, 255), points, 0)
# Draw empty diamond with lines of thickness 4
pygame.draw.polygon(window, (0, 255, 255), secondPoints , 4)
pygame.display.flip()
clock.tick(MAXFPS)
pygame.quit()