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.

¿Cómo generar ruido de Perlin en pygame?

Estoy intentando crear un juego de supervivencia y tengo un problema con el ruido de Perlin. Mi programa me da esto:

enter image description here

Pero quiero algo como islas o ríos.

Aquí está mi código:

# Configuración
import pygame, sys, random
pygame.init()
win = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Isom')
x = 0
y = 0
s = 0
tilel = list()
random.seed(5843)
MAP = [random.randint(0, 1) for _ in range(192)]

# Tiles
class tile():
    grass = pygame.image.load('Sprites/Images/Grass.png')
    water = pygame.image.load('Sprites/Images/Water.png')

# Bucle principal
while True:
    for key in pygame.event.get():
        if key.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # Mundo
    for a in range(12):
        for b in range(16):
            if MAP[s] == 0:
                win.blit((tile.grass), (x, y))
            elif MAP[s] == 1:
                win.blit((tile.water), (x, y))
            x += 50
            s += 1
        x = 0
        y += 50
    x = 0
    y = 0
    s = 0
    # Actualización
    pygame.display.update()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la salida actual es que el algoritmo de ruido de Perlin no está siendo utilizado en el código proporcionado. La lista MAP simplemente es una distribución aleatoria de 1s y 0s, es por eso que la salida se ve como un tablero de ajedrez. Para generar terreno utilizando el ruido de Perlin, se necesitan hacer algunas modificaciones al código.

    Primero, se debe importar la librería PerlinNoise, la cual se puede instalar fácilmente utilizando pip. Luego, se necesita crear un objeto PerlinNoise con un valor adecuado de persistencia, lo que determina la aspereza del terreno. Una vez que este objeto ha sido creado, se puede llamar a la función de ruido en cada tile para generar un valor de ruido, que luego se puede usar para determinar si el tile debe ser agua o tierra.

    Aquí hay un ejemplo de código que demuestra cómo se puede utilizar el ruido de Perlin para generar terreno en pygame:

    import pygame
    import random
    from perlin_noise import PerlinNoise
    
    pygame.init()
    
    # Crear ventana
    win = pygame.display.set_mode((800, 600))
    pygame.display.set_caption('Isom')
    
    # Crear clase tile con imágenes
    class Tile:
        grass = pygame.image.load('Sprites/Images/Grass.png')
        water = pygame.image.load('Sprites/Images/Water.png')
    
    # Crear objeto PerlinNoise
    noise = PerlinNoise(octaves=3, persistence=0.5)
    
    # Bucle para generar tiles de terreno
    for x in range(0, 800, 50):
        for y in range(0, 600, 50):
            # Generar valor de ruido en posición actual
            noise_val = noise([x/800, y/600])
            # Determinar tipo de tile basado en valor de ruido
            if noise_val > 0.4:
                win.blit(Tile.grass, (x, y))
            else:
                win.blit(Tile.water, (x, y))
    
    # Actualizar ventana
    pygame.display.update()
    
    # Bucle principal del juego
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
    

    En este código modificado, se crea un objeto PerlinNoise con 3 octavas y una persistencia de 0.5. Esto significa que el terreno tendrá un nivel moderado de aspereza. El bucle utilizado para generar los tiles de terreno ahora llama a la función de ruido en cada posición, la cual devuelve un valor entre -1 y 1. El valor de ruido se utiliza para determinar si el tile debe ser tierra o agua. En este caso, si el valor de ruido es superior a 0.4, el tile será pasto. De lo contrario, será agua. El código se puede modificar aún más para generar diferentes tipos de terreno basados en el valor de ruido, como montañas o bosques.

Comments are closed.