Нарисуйте круг не отображается - PullRequest
1 голос
/ 17 октября 2019

Мне нужно нарисовать круг за каким-то текстом.

На шахматной доске мне удалось отобразить три буквы: «P» для пикинера, «K» для рыцаря и «A»'для лучника.

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

Буквыкрасного цвета только для целей тестирования, но в будущем они будут либо черными, либо белыми. Поэтому круг необходим для того, чтобы я мог видеть черные буквы на черных квадратах.

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

Unit - родительский класс, а Pikeman, Archer и Knight - подклассы. Я предпочел, чтобы круг был нарисован из класса Unit, так как это «переменная» (если мы хотим), которая объединяет три подкласса.

Я попытался создать поверхность в классе Unit, а затемнарисуйте круг оттуда. не могу заставить его работать.

Я попытался создать поверхность внутри класса Unit и нарисовать ее из подкласса. не может заставить его работать.

Итак, я решил создать класс CircleSurface, создать экземпляр этого класса и передать его в метод draw. Нет, не работает!

Как я уже сказал, я скорее нарисовал круг из класса Unit и не должен создавать класс CircleSurface.

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')


# Defines classes and related methods
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.height, self.width))
        self.white_square.fill((255, 255, 255))


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.height, self.width))
        self.black_square.fill((0, 0, 0))


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

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

        for b_columns in self.black_columns:
            game_window.blit(self.bs.black_square, b_columns)


# class SquareNames:
#     letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
#     numbers = ['1', '2', '3', '4', '5', '6', '7', '8']
#     square_names = []
#     for letter in letters:
#         for number in numbers:
#             square_name = letter + number
#             square_names.append(square_name)
#     print((square_names))
#     # for coordinate in
#     # coordinates = (square_name : coordinate)

class CircleSurface:
    def __init__(self):
        self.circle_surface = pygame.Surface((100, 100))
        self.circle_surface.fill((0, 0, 255))


class Unit:
    def __init__(self):
        self.surface = pygame.Surface((100, 100))
        self.my_font = pygame.font.SysFont('Time New Roman', 100)
        self.cs = cs

    def draw_circle(self):
        pygame.draw.circle(self.cs.circle_surface, (0, 255, 0), (200, 200), 50)


class Pikeman(Unit):
    unit_type = 'P'
    destination = (125, 125)

    def __init__(self):
        super().__init__()
        self.img = self.my_font.render(self.unit_type, 1, (255, 0, 0))

    def draw(self, surface):
        surface.blit(self.img, self.destination)


class Archer(Unit):
    unit_type = 'A'
    destination = (525, 525)

    def __init__(self):
        super().__init__()
        self.img = self.my_font.render(self.unit_type, 1, (255, 0, 0))

    def draw(self, surface):
        surface.blit(self.img, self.destination)


class Knight(Unit):
    unit_type = 'K'
    destination = (325, 525)

    def __init__(self):
        super().__init__()
        self.img = self.my_font.render(self.unit_type, 1, (255, 0, 0))

    def draw(self, surface):
        surface.blit(self.img, self.destination)


# Sets and gets the coordinates for black and white squares
coordinator = coordinator()
black_columns = coordinator[2] + coordinator[3]
white_columns = coordinator[0] + coordinator[1]

# Creates needed objects
ws = WhiteSquare()
bs = BlackSquare()
cb = ChessBoard()
p = Pikeman()
a = Archer()
k = Knight()
cs = CircleSurface()


# Event loop (outer)
while 1:

    # Event loop (inner)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    # Draws needed objects and updates display
    cb.draw()
    p.draw(game_window)
    p.draw_circle()
    k.draw(game_window)
    a.draw(game_window)
    pygame.display.update()

Отображаемая ошибкаследующее:

Traceback (most recent call last):
  File "C:/Users/oricc/PycharmProjects/designAChessboardChallange/display.py", line 117, in <module>
    p = Pikeman()
  File "C:/Users/oricc/PycharmProjects/designAChessboardChallange/display.py", line 77, in __init__
    super().__init__()
  File "C:/Users/oricc/PycharmProjects/designAChessboardChallange/display.py", line 66, in __init__
    self.cs = cs
NameError: name 'cs' is not defined

1 Ответ

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

Объект cs не определен, когда создается экземпляр Pikeman, Archer и Knight.

Просто создайте экземпляр CircleSurface до того, как решить проблему. Например:

cs = CircleSurface()
p = Pikeman()
a = Archer()
k = Knight()

Но я рекомендую передать объект CircleSurface в качестве аргумента:

class Unit:
    def __init__(self, cs):
        self.surface = pygame.Surface((100, 100))
        self.my_font = pygame.font.SysFont('Time New Roman', 100)
        self.cs = cs

    def draw_circle(self):
        pygame.draw.circle(self.cs.circle_surface, (0, 255, 0), (200, 200), 50)

class Pikeman(Unit):
    unit_type = 'P'
    destination = (125, 125)

    def __init__(self, cs):
        super().__init__(cs)
        self.img = self.my_font.render(self.unit_type, 1, (255, 0, 0))

    def draw(self, surface):
        surface.blit(self.img, self.destination)
cs = CircleSurface()
p = Pikeman(cs)

Сделайте то же самое для Archer и Knight.


Кроме того, вы гарантируете, что пиксельный формат поверхности круга будет включать в себя альфа-пиксель на пиксель, и вы будете рисовать круг на поверхности круга:

class CircleSurface:
    def __init__(self):
        self.circle_surface = pygame.Surface((100, 100), flags=pygame.SRCALPHA)
        self.circle_surface.fill((0, 0, 0, 0))
        pygame.draw.circle(self.circle_surface, (0, 255, 0), (50, 50), 50)

blit поверхность круга к поверхности окна

class Unit:
    # [...]

    def draw_circle(self, surface):
        surface.blit(self.cs.circle_surface, (200, 200))
p.draw_circle(game_window)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...