pygame面膜中的透明位是黑色的,而不是透明

发布于 2025-01-27 16:27:11 字数 2138 浏览 4 评论 0 原文

我有一个程序,其中它填充了一个从另一个面具重叠的掩模的碎片,但是当我将重叠位的口罩闪烁到屏幕上时,透明的位是完全黑色的,出于某种原因?该程序按预期运行,我尝试将重叠位的表面转换为每个像素alpha,但透明的位是黑色

import pygame
import sprites

SCREEN_HEIGHT, SCREEN_WIDTH = 800, 800
running = True

pygame.init()

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
clock = pygame.time.Clock()

player = sprites.Block((100, 100))
block2 = sprites.Block((100, 100))
blocks = pygame.sprite.Group(block2)

block2.rect.topleft = 150, 150
block2.image.fill((0, 255, 0))

while running:
    events = pygame.event.get()

    screen.fill((100, 100, 100))
    for event in events:
        if event.type == pygame.QUIT:
            running = False

    player.move(screen.get_rect())
    screen.blit(player.image, player.rect)
    blocks.draw(screen)

    for block in blocks:
        offset = (player.rect.x - block.rect.x, player.rect.y - block.rect.y)
        colliding_bits = player.mask.overlap_mask(block.mask, offset)
        colliding_bits_image = colliding_bits.to_surface(setcolor=(0, 255, 0))

        screen.blit(colliding_bits_image, block.rect)

    clock.tick(144)
    pygame.display.flip()

包含精灵类的代码:

import pygame


class Block(pygame.sprite.Sprite):
    def __init__(self, size):
        self.image = pygame.image.load("flappy_bird.png")
        self.rect = self.image.get_rect()
        self.mask = pygame.mask.from_surface(self.image)

        self.speed = 1

        super().__init__()

    def move(self, screen_rect):
        pressed_keys = pygame.key.get_pressed()

        if pressed_keys[pygame.K_w]:
            self.rect.move_ip(0, -self.speed)
        if pressed_keys[pygame.K_s]:
            self.rect.move_ip(0, self.speed)
        if pressed_keys[pygame.K_a]:
            self.rect.move_ip(-self.speed, 0)
        if pressed_keys[pygame.K_d]:
            self.rect.move_ip(self.speed, 0)

        self.rect.clamp_ip(screen_rect)

I have a program where it fills in the bits of a mask that are overlapped from another mask, but when I blit the mask of the overlapping bits onto the screen, the transparent bits are fully black for some reason? The program works as intended and I've tried converting the surface for the overlapping bits to per pixel alpha but the transparent bits are black

example gif

import pygame
import sprites

SCREEN_HEIGHT, SCREEN_WIDTH = 800, 800
running = True

pygame.init()

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
clock = pygame.time.Clock()

player = sprites.Block((100, 100))
block2 = sprites.Block((100, 100))
blocks = pygame.sprite.Group(block2)

block2.rect.topleft = 150, 150
block2.image.fill((0, 255, 0))

while running:
    events = pygame.event.get()

    screen.fill((100, 100, 100))
    for event in events:
        if event.type == pygame.QUIT:
            running = False

    player.move(screen.get_rect())
    screen.blit(player.image, player.rect)
    blocks.draw(screen)

    for block in blocks:
        offset = (player.rect.x - block.rect.x, player.rect.y - block.rect.y)
        colliding_bits = player.mask.overlap_mask(block.mask, offset)
        colliding_bits_image = colliding_bits.to_surface(setcolor=(0, 255, 0))

        screen.blit(colliding_bits_image, block.rect)

    clock.tick(144)
    pygame.display.flip()

code containing the sprite classes:

import pygame


class Block(pygame.sprite.Sprite):
    def __init__(self, size):
        self.image = pygame.image.load("flappy_bird.png")
        self.rect = self.image.get_rect()
        self.mask = pygame.mask.from_surface(self.image)

        self.speed = 1

        super().__init__()

    def move(self, screen_rect):
        pressed_keys = pygame.key.get_pressed()

        if pressed_keys[pygame.K_w]:
            self.rect.move_ip(0, -self.speed)
        if pressed_keys[pygame.K_s]:
            self.rect.move_ip(0, self.speed)
        if pressed_keys[pygame.K_a]:
            self.rect.move_ip(-self.speed, 0)
        if pressed_keys[pygame.K_d]:
            self.rect.move_ip(self.speed, 0)

        self.rect.clamp_ip(screen_rect)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

筱果果 2025-02-03 16:27:11

我将 unsetColor 属性添加到 to_surface 方法中,然后删除了行 blocks.drawss.draw(screen),并且似乎会产生所需的结果:

from math import fabs
import pygame
import sprites

SCREEN_HEIGHT, SCREEN_WIDTH = 800, 800
running = True

pygame.init()

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
clock = pygame.time.Clock()

player = sprites.Block((100, 100))
block2 = sprites.Block((100, 100))
blocks = pygame.sprite.Group(block2)

block2.rect.topleft = 150, 150
block2.image.fill((0, 255, 0))

while running:
    events = pygame.event.get()

    screen.fill((100, 100, 100))
    for event in events:
        if event.type == pygame.QUIT:
            running = False

    player.move(screen.get_rect())
    screen.blit(player.image, player.rect)

    for block in blocks:
        offset = (player.rect.x - block.rect.x, player.rect.y - block.rect.y)
        colliding_bits = player.mask.overlap_mask(block.mask, offset)
        colliding_bits_image = colliding_bits.to_surface(setcolor=(0, 255, 0, 255), unsetcolor=(0, 0, 0, 0))

        screen.blit(colliding_bits_image, block.rect)

    clock.tick(144)
    pygame.display.flip()

I added the unsetcolor attribute to the to_surface method and removed the line blocks.draw(screen) and it seems to produce the desired result :

from math import fabs
import pygame
import sprites

SCREEN_HEIGHT, SCREEN_WIDTH = 800, 800
running = True

pygame.init()

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
clock = pygame.time.Clock()

player = sprites.Block((100, 100))
block2 = sprites.Block((100, 100))
blocks = pygame.sprite.Group(block2)

block2.rect.topleft = 150, 150
block2.image.fill((0, 255, 0))

while running:
    events = pygame.event.get()

    screen.fill((100, 100, 100))
    for event in events:
        if event.type == pygame.QUIT:
            running = False

    player.move(screen.get_rect())
    screen.blit(player.image, player.rect)

    for block in blocks:
        offset = (player.rect.x - block.rect.x, player.rect.y - block.rect.y)
        colliding_bits = player.mask.overlap_mask(block.mask, offset)
        colliding_bits_image = colliding_bits.to_surface(setcolor=(0, 255, 0, 255), unsetcolor=(0, 0, 0, 0))

        screen.blit(colliding_bits_image, block.rect)

    clock.tick(144)
    pygame.display.flip()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文