Verwirrung bei der Bildtransparenz von Pygame [duplicate]

Lesezeit: 5 Minuten

Verwirrung bei der Bildtransparenz von Pygame duplicate
Brandon Martin

Ich habe die 20 wichtigsten Beiträge zu diesem Thema hier gelesen, viele Beispiele bei Google gelesen und versucht, sie zu verwenden .convert(), .convert_alpha(), versucht mit keinem von beiden, versucht mit .png, .gif, versucht mit den Top 5 verschiedenen Bildern bei Google. Bitte helfen Sie mir, herauszufinden, wie ich die Teile mit einem transparenten Hintergrund anzeigen kann. Hier ist der ganze Code:

import pygame
pygame.init()
print("1")
screen_size = (600, 600)
blue = (100, 225, 225)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption("Chess")


class SpriteSheet:

    def __init__(self, filename):
        """Load the sheet."""
        try:
            self.sheet = pygame.image.load(filename).convert.alpha()
        except pygame.error as e:
            print(f"Unable to load spritesheet image: {filename}")
            raise SystemExit(e)


    def image_at(self, rectangle, colorkey = None):
        """Load a specific image from a specific rectangle."""
        # Loads image from x, y, x+offset, y+offset.
        rect = pygame.Rect(rectangle)
        image = pygame.Surface(rect.size)
        image.blit(self.sheet, (0, 0), rect)
        if colorkey is not None:
            if colorkey == -1:
                colorkey = image.get_at((0,0))
            image.set_colorkey(colorkey, pygame.RLEACCEL)
        return image

    def images_at(self, rects, colorkey = None):
        """Load a whole bunch of images and return them as a list."""
        return [self.image_at(rect, colorkey) for rect in rects]

    def load_strip(self, rect, image_count, colorkey = None):
        """Load a whole strip of images, and return them as a list."""
        tups = [(rect[0]+rect[2]*x, rect[1], rect[2], rect[3])
                for x in range(image_count)]
        return self.images_at(tups, colorkey)
print("2")

class Game:
    def __init__(self):
        self.playing = False
        self.move = 0
        self.player_turn = 1
        self.quit = False

    def quit(self):
        self.quit = True

print("3")
class Piece:
    def __init__(self):
        self.sprite = None
        self.spacial = [0, 0, 0]
        self.temporal = [0, 0]
        self.position = [self.spacial, self.temporal]
        self.color = ""
        self.type = ""

print("4")
chess_image = SpriteSheet('ChessPiecesArray.png')
colors = ["White", "Black"]
types = ["K", "Q", "B", "N", "R", "P"]
rect_piece = (0, 0, 133, 133)

print("5")


class ChessSet:
    def __init__(self):
        self.set = []

    def create_set(self):
        for i in range(2):
            for j in range(6):
                this_piece = Piece()
                this_piece.color = colors[i]
                this_piece.type = types[j]
                rect_set = (133*j, 133*i, 133*(j+1), 133*(i+1))
                this_piece.sprite = SpriteSheet.image_at(chess_image, rect_set)
                self.set.append(this_piece)

print("6")
chess = Game()
set_one = ChessSet()
set_one.create_set()

print("7")
while not chess.quit:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                chess.quit()
    screen.fill(blue)
    screen.blit(set_one.set[0].sprite, (10, 10))

    pygame.display.flip()

Hier sind ein paar Bilder, die ich mit Versuchen verbracht habe:

Verwirrung bei der Bildtransparenz von Pygame duplicate

1642581846 447 Verwirrung bei der Bildtransparenz von Pygame duplicate

1642581847 730 Verwirrung bei der Bildtransparenz von Pygame duplicate

EDIT: Hier ist der Screenshot meiner Fehlermeldung über meinem Code mit der vorgeschlagenen Änderung
Code geändert

  • Ich habe das Bild durch ein Transparenz-Tool laufen lassen und es hat immer noch nicht funktioniert. Ich habe es mit mehreren Bildern und Tools versucht und kann es nicht zum Laufen bringen

    – Brandon Martin

    5. November 20 um 21:30 Uhr

  • Aus irgendeinem Grund wurden die Bildlinks, die ich ursprünglich hatte, nicht angezeigt, aber jetzt sind sie es

    – Brandon Martin

    5. November 20 um 21:57 Uhr

1642581847 52 Verwirrung bei der Bildtransparenz von Pygame duplicate
Rabbid76

Wenn Sie eine transparente kopieren Oberfläche zum anderen Oberfläche das Ziel Oberfläche Transparenz jeweils pro Pixel alpha bereitstellen muss.

Beim Erstellen einer neuen Oberfläche können Sie zusätzliche Funktionen aktivieren. Stellen Sie die ein SRCALPHA -Flag, um eine Oberfläche mit einem Bildformat zu erstellen, das ein Alpha pro Pixel enthält. Der Anfangswert der Pixel ist (0, 0, 0, 0):

my_surface = pygame.Surface((width, height), pygame.SRCALPHA)

Verwenden Sie das folgende Bild

1642581847 730 Verwirrung bei der Bildtransparenz von Pygame duplicate

und die Methode anpassen image_at der Klasse SpriteSheet. Benutzen pygame.SRCALPHA:

class SpriteSheet:
    # [...]

    def image_at(self, rectangle, colorkey = None):
        """Load a specific image from a specific rectangle."""
        # Loads image from x, y, x+offset, y+offset.
        rect = pygame.Rect(rectangle)
        
        image = pygame.Surface(rect.size, pygame.SRCALPHA) # <----
        
        image.blit(self.sheet, (0, 0), rect)
        if colorkey is not None:
            if colorkey == -1:
                colorkey = image.get_at((0,0))
            image.set_colorkey(colorkey, pygame.RLEACCEL)
        return image

Oder verwenden convert_alpha():

class SpriteSheet:
    # [...]

    def image_at(self, rectangle, colorkey = None):
        """Load a specific image from a specific rectangle."""
        # Loads image from x, y, x+offset, y+offset.
        rect = pygame.Rect(rectangle)
        
        image = pygame.Surface(rect.size).convert_alpha() # <----
        image.fill((0, 0, 0, 0))                          # <---
        
        image.blit(self.sheet, (0, 0), rect)
        if colorkey is not None:
            if colorkey == -1:
                colorkey = image.get_at((0,0))
            image.set_colorkey(colorkey, pygame.RLEACCEL)
        return image

Siehe auch:

  • Wie kann ich in Pygame ein Bild mit einem transparenten Hintergrund erstellen?
  • Wie blase ich ein PNG mit etwas Transparenz auf eine Oberfläche in Pygame?

Beachten Sie, dass Schachfiguren auch durch einen Unicode-Text gezeichnet werden können.
Siehe Anzeigen von Unicode-Symbolen mit Pygame

  • Ich habe den Fehler AttributeError: module ‘pygame’ has no attribute ‘SCRALPHA’

    – Brandon Martin

    10. November 20 um 21:22 Uhr


  • Bitte lesen Sie Was soll ich tun, wenn jemand meine Frage beantwortet? und erwägen Sie, die Antwort zu akzeptieren, die Sie am hilfreichsten fanden.

    – Rabbid76

    10. November 20 um 21:23 Uhr

  • Das Problem ist immer noch nicht gelöst. Auch mit importierter und geladener Bibliothek funktioniert die vorgeschlagene Funktion nicht.

    – Brandon Martin

    11. November 20 um 17:00 Uhr

  • @BrandonMartin Es funktioniert gut für mich. Beachten Sie, dass Sie nur eines Ihrer Bilder verwenden können. Nur eines Ihrer Bilder ist transparent. Dein Code funktioniert gut. Alles, was Sie tun müssen, ist hinzuzufügen pygame.SRCALPHA. Ich glaube, du machst nur Witze.

    – Rabbid76

    11. November 20 um 17:01 Uhr


  • Es ist die neueste Version, aber Ihre Problemumgehung hat funktioniert !!! Vielen Dank für Ihre Geduld.

    – Brandon Martin

    13. November 20 um 5:17 Uhr

.

545450cookie-checkVerwirrung bei der Bildtransparenz von Pygame [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy