PyGame Negative สี / พื้นผิว

Aug 31 2020

ฉันกำลังสร้างเกมด้วย PyGame ที่นั่นฉันต้องการสร้างเอฟเฟกต์เชิงลบโดยที่หน้าจอทั้งหมดกลายเป็นลบ

สิ่งนี้ค่อนข้างง่ายสำหรับรูปทรงธรรมดาเช่นสี่เหลี่ยมผืนผ้า: (และใช้rectแทนpygame.draw.rect)

# set negative to 1 to activate effect
negative = 0

def rect(win, color, area, width=0):
    if negative:
        pygame.draw.rect(win, (255 - color[0], 255 - color[1], 255 - color[2]), area, width)
    else:
        pygame.draw.rect(win, color, area, width)

แต่ฉันไม่รู้ว่าจะมีผลกับภาพอย่างไร ฉันพยายามคัดลอกรูปภาพเชิงลบ แต่หากเอฟเฟกต์นี้ไม่เกิดขึ้นทันทีและจะค่อยๆเต็มหน้าจอสิ่งนี้จะไม่ช่วย

# negative image copy
def negcopy(image):
    neg = pygame.Surface(image.get_size())

    for y in range(image.get_height()):
        for x in range(image.get_width()):
            c = image.get_at((x, y)
            neg.set_at((x, y), (255 - color[0], 255 - color[1], 255 - color[2], 255))

    return neg

คำตอบ

4 Rabbid76 Aug 31 2020 at 13:35

คุณสามารถใช้ pygame.Surface.blitกับอาร์กิวเมนต์special_flagBLEND_SUBสำหรับสิ่งนี้
สร้างภาพสีขาวที่มีขนาดเท่ากันและลบภาพต้นฉบับ:

neg = pygame.Surface(image.get_size())
neg.fill((255, 255, 255))
neg.blit(image, (0, 0), special_flags=pygame.BLEND_SUB)