Наличие Спрайта Следуйте за Линейкой Цветовой Pygame Specifi c - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь создать версию pacman, в которой он и призраки могут двигаться только по дорогам с карты Google. Я понимаю концепцию использования сеток в качестве границ, но это работает только для квадратных игровых площадок. Поэтому я ищу несколько советов о том, как заставить спрайт перемещаться только по предварительно нарисованной строке определенного цвета c.

Возможная карта, которую я мог бы использовать в качестве игровой доски, могла бы быть эта . На этой карте вы можете видеть, что используются только два цвета: серый и черный, плюс изображение имеет некоторые кривые. Буду признателен за любой совет, как сделать эту работу, спасибо всем!

1 Ответ

0 голосов
/ 01 марта 2020

В pygame.image есть функция tostring(), которая возвращает объект bytes, представляющий изображение. Подробнее об этом здесь: https://www.pygame.org/docs/ref/image.html#pygame .image.tostring

Вы можете получить цвет каждого пикселя, если правильно рассчитаете его положение. В любом случае, это казалось забавным, поэтому я написал небольшую программу, используя изображение, на которое вы ссылались. Этот код немного глючит и может быть определенно улучшен, и игрок идет на самый темный квадрат, который он может найти, не обязательно черный, но это просто для того, чтобы дать общее представление:

import pygame


def draw_player(pos):
    # Draw a red square as the player
    pygame.display.update(pygame.draw.rect(screen, (255, 0, 0), (pos[0], pos[1], 10, 10)))


def pos_rgb_sum(pos):
    str_pos = 3 * (pos[1] * bg_size[0] + pos[0])  # The position of current pixel in bg_str. Remember every pixel has 3 values
    return sum(bg_str[str_pos: str_pos + 3])


def darkest_neighbor(pos):
    # Return the darkest neighbor for the position on the board
    darkest_pos, darkest_val = None, 255 * 3 + 1  # So that every value is darker than starting value
    for x in range(pos[0] - 1, pos[0] + 2):
        for y in range(pos[1] - 1, pos[1] + 2):
            if (x, y) == pos:
                continue
            curr_darkness = pos_rgb_sum((x, y))
            if curr_darkness <= darkest_val and (x, y) not in visited:  # Try to create movement
                darkest_val = curr_darkness
                darkest_pos = (x, y)

    return darkest_pos


pygame.init()
# Load image and get its string representation
background = pygame.transform.smoothscale(pygame.image.load("wzcPy.png"), (500, 500))
bg_str = pygame.image.tostring(background, "RGB")
bg_size = background.get_size()
screen = pygame.display.set_mode(bg_size)
screen.blit(background, (0, 0))
pygame.display.update()

# A set that will contain positions visited by player
visited = set()

player_pos = None
for x in range(background.get_width()):  # Find a black square to position player
    for y in range(background.get_height()):
        if pos_rgb_sum((x, y)) == 0:
            player_pos = (x, y)
            break
    if player_pos is not None:
        break

while pygame.event.wait().type != pygame.QUIT:
    visited.add(player_pos)
    draw_player(player_pos)
    player_pos = darkest_neighbor(player_pos)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...