如何使用pygame.draw.line设置alpha透明度属性?

2024-04-19 09:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用pygame.draw.line(tela, (255, 255, 255), self.a, self.b, width=1)设置绘制线的透明度,其中:

  • tela是屏幕
  • (255, 255, 255)是颜色
  • self.aself.b分别是位置和方向
  • width是它的重量

有没有一种简单直接的方法?有没有一个概念上的论点阻止我们轻易地去做?每件事都必须有一个复杂的答案吗


Tags: 方法self概念屏幕颜色line绘制方向
1条回答
网友
1楼 · 发布于 2024-04-19 09:35:13

下面是@Yannis Assael的answer对我提到的他自己的问题Pygame draw anti-aliased thick line的改编。我已经转换成一个名为aaline()的函数,并对代码进行了优化,以使其更高效、更可读

该函数被定义为具有一个调用序列,类似于现有的名为^{}的调用序列,用于绘制单像素宽的线,使得从on切换到另一个稍微容易一些

from math import atan2, cos, hypot, sin
import pygame
import pygame.gfxdraw
from pygame.locals import *
import sys


def aaline(surface, color, start_pos, end_pos, width=1):
    """ Draws wide transparent anti-aliased lines. """
    # ref https://stackoverflow.com/a/30599392/355230

    x0, y0 = start_pos
    x1, y1 = end_pos
    midpnt_x, midpnt_y = (x0+x1)/2, (y0+y1)/2  # Center of line segment.
    length = hypot(x1-x0, y1-y0)
    angle = atan2(y0-y1, x0-x1)  # Slope of line.
    width2, length2 = width/2, length/2
    sin_ang, cos_ang = sin(angle), cos(angle)

    width2_sin_ang  = width2*sin_ang
    width2_cos_ang  = width2*cos_ang
    length2_sin_ang = length2*sin_ang
    length2_cos_ang = length2*cos_ang

    # Calculate box ends.
    ul = (midpnt_x + length2_cos_ang - width2_sin_ang,
          midpnt_y + width2_cos_ang  + length2_sin_ang)
    ur = (midpnt_x - length2_cos_ang - width2_sin_ang,
          midpnt_y + width2_cos_ang  - length2_sin_ang)
    bl = (midpnt_x + length2_cos_ang + width2_sin_ang,
          midpnt_y - width2_cos_ang  + length2_sin_ang)
    br = (midpnt_x - length2_cos_ang + width2_sin_ang,
          midpnt_y - width2_cos_ang  - length2_sin_ang)

    pygame.gfxdraw.aapolygon(surface, (ul, ur, br, bl), color)
    pygame.gfxdraw.filled_polygon(surface, (ul, ur, br, bl), color)


if __name__ == '__main__':

    # Define some colors.
    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    AQUA = (0, 255, 255)
    ORANGE = (255, 165, 0)
    YELLOW = (255, 255, 0)

    # Window size.
    WIDTH, HEIGHT = 800, 600

    # Set up pygame.
    pygame.init()

    # Set up window for display.
    window = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
    pygame.display.set_caption('Wide Transparent Lines')

    # Set background color of window.
    window.fill(BLACK)

    a = (0, 0)
    b = (WIDTH, HEIGHT)

    LINE_COLOR = ORANGE
    fw = 255 / (WIDTH-1)
    fh = 255 / (HEIGHT-1)
    width = 3

    # Draw an opaque diagonal line then those on either side with
    # ever-increasing transparency.
    color = LINE_COLOR + (255,)  # Add transparency to color.
    aaline(window, color, (0, 0), (WIDTH, HEIGHT), width)

    for x in range(0, WIDTH, 25):
        color = LINE_COLOR + (int(fw*x),)  # Add transparency to color.
        aaline(window, color, (0, 0), (x, HEIGHT), width)

    for y in range(0, HEIGHT, 25):
        color = LINE_COLOR + (int(fh*y),)  # Add transparency to color.
        aaline(window, color, (0, 0), (WIDTH, y), width)

    # Copy window to screen.
    pygame.display.update()

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

出于测试和演示的目的,最后有一个驱动程序在一些循环中调用它。下面是显示内容的屏幕截图。当线条的一个端点越来越远离矩形的中心对角线时,线条逐渐变得更加透明

screenshot of what program displays

相关问题 更多 >