Нужно передать кортежи в подкласс, чтобы нарисовать треугольник - PullRequest
0 голосов
/ 19 октября 2019

Я хочу нарисовать треугольник из класса, поэтому я вызываю функцию

pygame.draw.polygon()

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

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

self.first_point = (int, int)
self.second_point = (int, int)
self.third_point = (int, int)

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

Затемпройти три балла, как это

self.position = [self.first_point, self.second_point, self.third_point]

Но по какой-то причине это не работает.

Это ошибка, которую я получаю

File "C:/Users/oricc/PycharmProjects/designAChessboardChallange/display.py", line 178, in <module>
    white_archer_3 = Archer(white, [(100, 100), (200, 200), (300, 300)])
[(100, 100), (200, 200), (300, 300)]
  File "C:/Users/oricc/PycharmProjects/designAChessboardChallange/display.py", line 132, in __init__
    self.triangle = pygame.draw.polygon(game_window, colour, self.position)
TypeError: points must be number pairs

По количествупар, документация Pygame дает в качестве примера

например [(x1, y1), (x2, y2), (x3, y3)]

Фактически,когда я печатаю позицию, которую я прохожу, я получаю, как вы можете видеть из ошибки выше

[(100, 100), (200, 200), (300, 300)]

Кто-нибудь может помочь с этим? Есть ли другой способ вычислить центр, не обращаясь к таким символам xs и ys?

Полный код здесь

import pygame
import sys
from coordinator import coordinator

# set 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)


# declare letters and numbers
letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
numbers = ['1', '2', '3', '4', '5', '6', '7', '8']

# create coordinates
coordinates = []
for item_letter in letters:
    letter = item_letter
    for item_number in numbers:
        number = item_number
        coordinates.append(letter + number)

# create coordinates values components
x_values = []
for number in range(0, 800, 100):
    x = number
    x_values.append(x)

y_values = []
for number in range(0, 800, 100):
    y = number
    y_values.append(y)

# create coordinate values
coordinate_values = []
for x in x_values:
    for y in y_values:
        coordinate_values.append((x, y))

# assign values to coordinates
squares_coordinates = dict(zip(coordinates, coordinate_values))


# Background for units
class CircleSurface:
    def __init__(self):
        self.circle_surface = pygame.Surface((100, 100), flags=pygame.SRCALPHA)
        pygame.draw.circle(self.circle_surface, (255, 0, 0), (50, 50), 45)


# define colours
black = (0, 0, 0)
white = (255, 255, 255)
gold = (153, 153, 0)


class Unit:
    def __init__(self, colour, position):

        # define Unit colour
        self.colour = colour

        # define Unit position
        self.position = position


class Knight(Unit):
    def __init__(self, colour, position):

        # draw circle, inline, and outline
        super().__init__(colour, position)
        self.center_x = position[0]
        self.center_y = position[1]
        self.colour = colour
        self.position = position
        circle_radius = 40
        self.circle = pygame.draw.circle(game_window, colour, self.position, circle_radius)
        self.circle_outline = pygame.draw.circle(game_window, gold, self.position, circle_radius, 5)
        self.circle_inline = pygame.draw.circle(game_window, gold, self.position, (circle_radius - 10), 5)

        # draw letter
        pygame.font.init()
        my_font_size = 50
        my_font = pygame.font.SysFont('Time New Roman', my_font_size)
        text_surface = my_font.render('K', 1, gold)
        center_text = text_surface.get_rect(center=(self.center_x, self.center_y))
        game_window.blit(text_surface, center_text)


class Archer(Unit):
    def __init__(self, colour, position):
        super().__init__(colour, position)
        self.first_point = (int, int)
        self.second_point = (int, int)
        self.third_point = (int, int)
        self.position = [self.first_point, self.second_point, self.third_point]
        print(position)
        self.triangle = pygame.draw.polygon(game_window, colour, self.position)
        self.triangle_outline = pygame.draw.polygon(game_window, gold, self.position, 5)
        self.triangle_inline = pygame.draw.polygon(game_window, gold, self.position, 5)

        # draw letter
        # pygame.font.init()
        # my_font_size = 50
        # my_font = pygame.font.SysFont('Time New Roman', my_font_size)
        # text_surface = my_font.render('A', 1, gold)
        # center_text = text_surface.get_rect(center=(self.center_x, self.center_y))
        # game_window.blit(text_surface, center_text)





# 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()
cs = CircleSurface()

# Event loop (outer)
while 1:

    # Event loop (inner)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    # Draws the chessboard
    cb.draw()

    # Draws white pieces in their initial position
    white_knight_1 = Knight(white, (150, 650))
    white_knight_2 = Knight(white, (650, 650))
    white_archer_3 = Archer(white, [(100, 100), (200, 200), (300, 300)])

    pygame.display.update()

Спасибо

1 Ответ

0 голосов
/ 20 октября 2019

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

class Archer(Unit):
    def __init__(self, colour, first_point, second_point, third_point):
        self.first_point = first_point
        self.second_point = second_point
        self.third_point = third_point
        position = [self.first_point, self.second_point, self.third_point]
        super().__init__(colour, position)

        print(self.position)
        self.triangle = pygame.draw.polygon(game_window, colour, self.position)
        self.triangle_outline = pygame.draw.polygon(game_window, gold, self.position, 5)
        self.triangle_inline = pygame.draw.polygon(game_window, gold, self.position, 5)

По сути, я должен объявить три переменные точки самостоятельно, а также положение перед суперфункцией, чтобы я мог затем передать их как «положение» в инициализатор родительского класса. Это было действительно полезно !!

Спасибо обоим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...