簡體   English   中英

如何在pygame中繪制一條透明線

[英]How to draw a transparent Line in pygame

我做了一個小游戲,我需要一個帶線條的背景圖案。 由於性能更好,我想在 Python 中繪制圖案而不是拍攝圖像。

問題是我找不到一種方法來繪制具有透明度的線條。 有曲面的解決方案,但沒有線的解決方案。

這是模式代碼:

import pygame
from math import pi

pygame.init()

size = [600, 600]
screen = pygame.display.set_mode(size)

while True:

    for i in range(0, 600, 20):
        pygame.draw.aaline(screen, (0, 255, 0), [i, 0],[i, 600], True)
        pygame.draw.aaline(screen, (0, 255, 0), [0, i],[600, i], True)

    pygame.display.flip()
 
pygame.quit()

有沒有人有辦法解決嗎?

我花了一些力氣撲朔迷離,但最終我還是明白了。 Pygame.draw不會處理透明度,因此您必須制作單獨的表面,這將:

import pygame from math import pi

pygame.init()

size = [600, 600] screen = pygame.display.set_mode(size)
while True:
    screen.fill((0, 0, 0))
    for i in range(0, 600, 20):
        vertical_line = pygame.Surface((1, 600), pygame.SRCALPHA)
        vertical_line.fill((0, 255, 0, 100)) # You can change the 100 depending on what transparency it is.
        screen.blit(vertical_line, (i - 1, 0))
        horizontal_line = pygame.Surface((600, 1), pygame.SRCALPHA)
        horizontal_line.fill((0, 255, 0, 100)) # You can change the 100 depending on what transparency it is.
        screen.blit(horizontal_line, (0, i - 1))

    pygame.display.flip()

pygame.quit()

我希望這就是您想要的。

復制自http://ostack.cn/?qa=761042/ 解釋在那里。

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM