Blit белые квадраты на шахматной доске, передавая координаты - PullRequest
2 голосов
/ 12 октября 2019

Моя проблема в том, что я не могу правильно blit несколько квадратов в правильном положении.

Я написал некоторый код для отображения шахматной доски. Квадраты - это не спрайты, а объекты pygame.Surface.

В данный момент мой проект содержит два файла .py:

  • display.py
  • ordinator.py

Координатор - это функция, которая возвращает список, содержащий два списка кортежей, один для четного столбца и один для нечетных. Кортежи - это фактические координаты, которые я передаю методу blit.

На данном этапе я имею дело только с белыми квадратами.

Файл display.py является фактическим отображением и намомент содержит также классы квадрата и класс шахматной доски.

Вот мой координатор.py:

# Returns a list containing two lists of tuples, one for even columns (white squares), and
# one for odd columns (white squares).

# Needs to be implemented to achieve the same for black squares.

def coordinator():
    odd_columns = white_odd_columns()
    even_columns = white_even_columns()
    columns = [odd_columns, even_columns]
    # print(columns)
    return columns
    # print('odd_columns: ' + str(odd_columns))
    # print('even_columns: ' + str(even_columns))

# Returns a list with coordinates
# for white squares in odd columns
def white_odd_columns():
    odd_coordinates = []
    for x in range(0, 800, 200):
        y = 0
        for first_column in range(0, 5):
            odd_coordinates.append((x, y))
            y += 200
    # print('This should be the complete list of odd coordinates' + str(odd_coordinates))
    return odd_coordinates

# Returns a list with coordinates
# for white squares in even columns
def white_even_columns():
    even_coordinates = []
    for x in range(100, 800, 200):
        y = 100
        for first_column in range(0, 4):
            even_coordinates.append((x, y))
            y += 200
    # print('This should be the complete list of even coordinates' + str(even_coordinates))
    return even_coordinates

# white_even_columns()
# white_odd_columns()
coordinator()

А вот мой дисплей.py:

import pygame
import sys
from coordinator import coordinator

# Sets up the display

pygame.init()
window_size = (800, 800)
game_window = pygame.display.set_mode(size=window_size)
pygame.display.set_caption('My Game')

# Event loop (outer)
while 1:

    white_columns = coordinator()
    # print(white_columns)
    odd_white_columns = white_columns[0]
    # print(odd_white_columns)
    even_white_columns = white_columns[1]
    # print(even_white_columns)
    l = len(even_white_columns)
    # print(l)
    n = 0
    for n in range(l + 1):
        x = odd_white_columns[n]
        print(x)

    # Event loop (inner)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    class WhiteSquare:
        height = int(window_size[0] / 8)
        width = int(window_size[1] / 8)
        a = height
        b = width
        white_square = pygame.Surface((a, b))
        white_square.fill((255, 255, 255), )

    ws = WhiteSquare()

    class BlackSquare:
        height = int(window_size[0] / 8)
        width = int(window_size[1] / 8)
        a = height
        b = width
        black_square = pygame.Surface((a, b))
        black_square.fill((0, 0, 255), )

    bs = BlackSquare()

    class ChessBoard:
        game_window.blit(ws.white_square, x)  # test
        game_window.blit(bs.black_square, (0, 100))  # test

    cb = ChessBoard()
    pygame.display.update()

Пожалуйста, не принимайте во внимание следующее:

game_window.blit(bs.black_square, (0, 100))

Это просто для того, чтобы убедиться, что я могу на самом деле blit квадратов, когда я передаю некоторые координаты.

меня беспокоит, этов строке 61:

game_window.blit(ws.white_square, x)

Фактически я пытаюсь получить доступ к каждому кортежу, возвращенному координатором, с помощью следующего кода, начинающегося со строки 21:

l = len(even_white_columns)
# print(l)
n = 0
for n in range(l + 1):
    x = odd_white_columns[n]
    print(x)

Я печатаю кортежи только для того, чтобы убедиться, что они правильные и что они все они. Ну, с ними все в порядке.

Чего я не понимаю, так это того, почему при запуске кода отображается только белый квадрат (200, 600).

Я чувствуюМне нравится это как-то делать с хранением кортежей или обновлением дисплея, но в данный момент это выходит за рамки моей лиги.

Может кто-нибудь объяснить мне, что я делаю неправильно? Я мог бы также делать что-то не так, фактически повторяя этот путь и пытаясь передать координаты.

Или, может быть, мне пришлось использовать блиты вместо блитов, чтобы я мог передать последовательность блитов,Если это так, я не могу понять, как использовать этот метод, так как в примерах по переполнению стека он показан просто как функция.

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 12 октября 2019

Рекомендую прочитать о понятии Объекты экземпляра и Объекты метода .

В любом случае, добавить конструктор в классы BlackSquare и WhiteSquareи переместить его до основного игрового цикла. Например:

class BlackSquare:
    def __init__(self):
        self.height = int(window_size[0] / 8)
        self.width = int(window_size[1] / 8)
        self.black_square = pygame.Surface((self.width, self.height))
        self.black_square.fill((0, 0, 255))

class WhiteSquare:
    def __init__(self):
        self.height = int(window_size[0] / 8)
        self.width = int(window_size[1] / 8)
        self.white_square = pygame.Surface((self.width, self.height))
        self.white_square.fill((255, 255, 255))

Переместите класс ChessBoard перед основным игровым циклом и добавьте конструктор с параметрами для белого квадрата, черного квадрата и белых столбцов (позже вы должны добавить черныйстолбцы тоже).
Добавьте Метод (draw), который может рисовать белые квадраты (self.ws) в позициях, сохраненных в self.white_columns в 2 вложенных циклах. Например:

class ChessBoard:
      def __init__(self, ws, bs, white_columns):
          self.ws = ws
          self.bs = bs
          self.white_columns = white_columns

      def draw(self):
          for colums in self.white_columns:
              for p in colums: 
                  game_window.blit(self.ws.white_square, p)

Создайте объект перед игровым циклом и нарисуйте шахматную доску в цикле, вызвав cb.draw(). например:

pygame.init()
window_size = (800, 800)
game_window = pygame.display.set_mode(window_size)
pygame.display.set_caption('My Game')

white_columns = coordinator()
# print(white_columns)
odd_white_columns = white_columns[0]
# print(odd_white_columns)
even_white_columns = white_columns[1]

ws = WhiteSquare()
bs = BlackSquare()
cb = ChessBoard(ws, bs, white_columns)

# Event loop (outer)
while 1:

    # Event loop (inner)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    game_window.fill(0)
    cb.draw()
    pygame.display.update()
...