Как отобразить текст внутри класса - PullRequest
2 голосов
/ 16 октября 2019

Я пытаюсь пометить 'P' как текст на шахматной доске. Даже после предыдущей справки о том, как блицать квадраты, я не могу сделать это с текстом.

В эту разновидность шахматной игры играют с пикинером, лучниками и рыцарями. 'P' обозначает pikeman.

В будущем я покажу спрайт, но на данный момент я хотел бы отобразить буквы (также, потому что это может быть полезно для графического интерфейса)

class Unit:
    def __init__(self):
        self.surface = pygame.Surface((100, 100))
        self.my_font = pygame.font.SysFont('Time New Roman', 18)
        self.img = self.my_font.render('P', 1, (255, 0, 0))
        self.surface.blit(self.img, (100, 100))

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

Здесь и далее полный код дисплея:

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




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 columns in self.white_columns:
            game_window.blit(self.ws.white_square, columns)

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


class Unit:
    def __init__(self):
        self.surface = pygame.Surface((100, 100))
        self.my_font = pygame.font.SysFont('Time New Roman', 18)
        self.img = self.my_font.render('P', 1, (255, 0, 0))
        self.surface.blit(self.img, (100, 100))


coordinator = coordinator()
black_columns = coordinator[2], coordinator[3]
white_columns = coordinator[0] + coordinator[1]

#print('coordinator' + str(coordinator))
#print('w_columns' + str(w_columns))


ws = WhiteSquare()
bs = BlackSquare()
cb = ChessBoard()
u = Unit()



# Event loop (outer)
while 1:

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

    cb.draw()

    pygame.display.update()

Надеюсь, это имеет смысл.

Спасибо

Ответы [ 2 ]

1 голос
/ 16 октября 2019

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

def draw(self):
    game_window.blit(self.img, (100, 100))

Завершить класс юнитов:

class Unit:
def __init__(self):
    self.surface = pygame.Surface((100, 100))
    self.my_font = pygame.font.SysFont('Time New Roman', 18)
    self.img = self.my_font.render('P', 1, (255, 0, 0))

def draw(self):
    game_window.blit(self.img, (100, 100))

, а затем использовать u.draw () внутри основного цикла

1 голос
/ 16 октября 2019

Создайте self.imag в конструкторе Unit. Но blit это draw метод. Метод экземпляра draw имеет параметр, который является Surface, где текст должен быть blit on:

class Unit:
    def __init__(self):
        self.surface = pygame.Surface((100, 100))
        self.my_font = pygame.font.SysFont('Time New Roman', 18)
        self.img = self.my_font.render('P', 1, (255, 0, 0))

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

Создать экземпляр (например, u) класса Unit,Звоните u.draw в основном цикле. Параметром метода draw является Поверхность, которая связана с дисплеем (game_window), поэтому текст отображается на дисплее. например:

u = Unit()
while 1:

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

    # draw the scene
    cb.draw()
    u.draw(game_window)

    # update the display
    pygame.display.update()
...