es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Borrando un Píxel de una Superficie en Pygame

Estoy tratando de crear un programa de pixel-art utilizando pygame (sí, sé que hay mejores paquetes para usar). La forma en que estoy dibujando los píxeles es mediante surface.set_at(). Necesito saber cómo borrar completamente un píxel de una superficie de pygame, para poder tener una herramienta de borrador. No quiero llenar el píxel con el color de fondo de la ventana, porque eso seguiría apareciendo al usar pygame.image.save() para obtener un archivo de imagen del dibujo. ¿Alguien puede ayudarme por favor? Aquí está mi código:

import pygame
import sys
import math

pygame.init()
clock = pygame.time.Clock()

pygame.display.set_caption("Pixel Studio v1.1")
screen = pygame.display.set_mode((960, 720), pygame.RESIZABLE)

scroll_speed = 5
canvas_size = (32, 16)
color = (255, 255, 255)

canvas_surf = pygame.Surface(canvas_size, pygame.SRCALPHA)

zoom = 12
mouse_down = False

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.image.save(canvas_surf, "canvas.png")
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == pygame.BUTTON_LEFT:
                mouse_down = True
            if event.button == pygame.BUTTON_WHEELUP:
                if zoom > 2:
                    zoom -= scroll_speed
            if event.button == pygame.BUTTON_WHEELDOWN:
                    zoom += scroll_speed
        if event.type == pygame.MOUSEBUTTONUP:
            if event.button == pygame.BUTTON_LEFT:
                mouse_down = False

    if zoom < 2:
        zoom = 2

    screen.fill((50, 50, 50))

    canvas_surf_scaled = pygame.transform.scale(canvas_surf, (canvas_surf.get_width() * zoom, canvas_surf.get_height() * zoom))
    canvas_rect = canvas_surf_scaled.get_rect(center=(screen.get_width()/2, screen.get_height()/2))

    mouse_pos = pygame.mouse.get_pos()

    if mouse_down:
        canvas_surf.set_at((math.floor((mouse_pos[0] - canvas_rect.x) / zoom), math.floor((mouse_pos[1] - canvas_rect.y) / zoom)), color)

    pygame.draw.rect(screen, (75, 75, 75), canvas_rect, 1)
    screen.blit(canvas_surf_scaled, canvas_rect)

    pygame.display.flip()
    clock.tick(60)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar un píxel de una superficie de pygame usando surface.set_at(), necesitarás establecer el color del píxel como transparente. Puedes hacer esto estableciendo el color del píxel como (0,0,0,0). Esto establece los valores de RGB en 0 y el valor de alfa en 0, haciendo que el píxel sea completamente transparente.

    Aquí tienes un ejemplo de cómo puedes modificar tu código para agregar una herramienta de borrador que establece el color del píxel como transparente:

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.image.save(canvas_surf, "canvas.png")
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == pygame.BUTTON_LEFT:
                    mouse_down = True
                if event.button == pygame.BUTTON_WHEELUP:
                    if zoom > 2:
                        zoom -= scroll_speed
                if event.button == pygame.BUTTON_WHEELDOWN:
                        zoom += scroll_speed
            if event.type == pygame.MOUSEBUTTONUP:
                if event.button == pygame.BUTTON_LEFT:
                    mouse_down = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_e:
                    # Herramienta de borrador: establecer los valores de RGB en 0 y el valor de alfa en 0
                    color = (0, 0, 0, 0)
                elif event.key == pygame.K_c:
                    # Herramienta de selección de color: permite al usuario seleccionar un color de la superficie
                    mouse_pos = pygame.mouse.get_pos()
                    color = canvas_surf.get_at((math.floor((mouse_pos[0] - canvas_rect.x) / zoom), math.floor((mouse_pos[1] - canvas_rect.y) / zoom)))
    
        if zoom < 2:
            zoom = 2
    
        screen.fill((50, 50, 50))
    
        canvas_surf_scaled = pygame.transform.scale(canvas_surf,(canvas_surf.get_width() * zoom, canvas_surf.get_height() * zoom))
        canvas_rect = canvas_surf_scaled.get_rect(center=(screen.get_width()/2, screen.get_height()/2))
    
        mouse_pos = pygame.mouse.get_pos()
    
        if mouse_down:
            canvas_surf.set_at((math.floor((mouse_pos[0] - canvas_rect.x) / zoom), math.floor((mouse_pos[1] - canvas_rect.y) / zoom)), color)
    
        pygame.draw.rect(screen, ( 75, 75, 75), canvas_rect, 1,)
        screen.blit(canvas_surf_scaled, canvas_rect)
    
        pygame.display.flip()
        clock.tick(60)
    

    En este código modificado, hemos agregado dos nuevas herramientas: la herramienta de borrador y la herramienta de selección de color. Cuando presionas la tecla ‘e’, se activa la herramienta de borrador y el color se establece como transparente. Cuando haces clic en el lienzo con el botón izquierdo del mouse, el color del píxel seleccionado se establece como transparente usando canvas_surf.set_at(). Esto eliminará completamente el píxel de la superficie. Cuando sueltas el botón izquierdo del mouse, la herramienta dejará de estar activa y podrás continuar dibujando con el color actual.

    Ten en cuenta que el código también incluye una herramienta de selección de color que te permite seleccionar un color de la superficie al presionar la tecla ‘c’. Cuando la herramienta está activa, hacer clic en un píxel en el lienzo establecerá el color actual como el color de ese píxel.

Comments are closed.