Menu
CoddyTech

Tuiles de bordure

Fait partie de la section Les mondes du Journey Pygame de Coddy. Leçon 8 sur 35.

Une plateforme semble terminée lorsque ses extrémités sont arrondies. Le pack contient grass_left.png et grass_right.png pour les deux extrémités d’une surface herbeuse.

Maintenant, chaque tuile examine trois voisines : au-dessus, à gauche et à droite. Certaines d’entre elles se trouvent hors de la carte, aux bords. Une fonction auxiliaire donne la réponse pour n’importe quelle position, à l’intérieur ou non :

def solid(row, col):
    if row < 0 or row >= len(LEVEL) or col < 0 or col >= len(LEVEL[0]):
        return False
    return LEVEL[row][col] == "#"

Tout ce qui se trouve hors de la carte est considéré comme vide. Avec la fonction auxiliaire, le choix suit la règle :

if solid(row - 1, col):
    image = dirt_img
elif not solid(row, col - 1) and solid(row, col + 1):
    image = grass_left_img
elif solid(row, col - 1) and not solid(row, col + 1):
    image = grass_right_img
else:
    image = grass_img
tiles.append((image, pygame.Rect(x, y, TILE, TILE)))

Une tuile avec du sol des deux côtés, ou d’aucun côté, conserve l’herbe ordinaire. Au bord gauche de la carte, dans la colonne 0, la tuile située à gauche est hors de la carte ; elle est donc considérée comme vide, et le sol à cet endroit commence par grass_left_img.

challenge icon

Défi

Moyen

Le code de départ charge grass_left.png dans grass_left_img et grass_right.png dans grass_right_img.

  1. Écrivez une fonction solid(row, col) qui renvoie False en dehors de la carte et LEVEL[row][col] == "#" à l’intérieur.
  2. Pour chaque # : dirt_img lorsque la case au-dessus est solide ; sinon grass_left_img lorsque seule la case voisine de droite est solide ; sinon grass_right_img lorsque seule la case voisine de gauche est solide ; sinon grass_img.

Essayez vous-même

import pygame

TILE = 36

LEVEL = [
    "###.............",
    "###.............",
    "..........C.....",
    ".........####...",
    "..C.............",
    ".####......C....",
    "..........###...",
    "#....C.........#",
    "###..##...###.##",
    "######..########",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Tiles")
clock = pygame.time.Clock()

grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
grass_left_img = pygame.image.load("assets/images/grass_left.png").convert_alpha()
grass_right_img = pygame.image.load("assets/images/grass_right.png").convert_alpha()
dirt_img = pygame.image.load("assets/images/dirt.png").convert_alpha()
coin_img = pygame.image.load("assets/images/coin.png").convert_alpha()

tiles = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        x, y = col * TILE, row * TILE
        if char == "#":
            if row == 0 or LEVEL[row - 1][col] != "#":
                image = grass_img
            else:
                image = dirt_img
            tiles.append((image, pygame.Rect(x, y, TILE, TILE)))
        elif char == "C":
            tiles.append((coin_img, pygame.Rect(x, y, TILE, TILE)))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((140, 200, 240))
    for image, rect in tiles:
        screen.blit(image, rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Les mondes

Entraînez-vous par vous-même : Playground Pygame