извлекать данные из базы данных SQL и рендерить на экран с помощью pygame - PullRequest
0 голосов
/ 11 апреля 2019

я внедряю систему лидеров; Я подошел к нему с помощью sqlite3, где я извлекаю все записи из базы данных, а затем «распутываю» их из массива и сбрасываю на поверхность. У меня возникли проблемы с их уничтожением, я не знаю, как заставить их всех отображаться на экране, как в таблице лидеров. код:

def lbButton(self, action='leaderboard'):
    self.leaderboardMenu = True
    if self.x + self.buttonWidth > self.mousePos[0] > self.x and self.y + self.buttonHeight > self.mousePos[1] > self.y:
        if self.mouseClick[0] == 1:
            if action == 'leaderboard':
                image = pg.image.load('leaderboardImg.jpg')
                while self.leaderboardMenu:
                    for event in pg.event.get():
                        if event.type == QUIT:
                            self.quitButton()
                        if event.type == KEYDOWN:
                            if event.key == pg.K_SPACE:
                                self.leaderboardMenu = False

                    self.surface.blit(image, (0, 0))
                    #tempName = ''
                    #tempScore = ''
                    getData = c.execute("SELECT * FROM names where name = name ORDER BY score DESC")  # get so highest score is first
                    getData = getData.fetchall()  # fetch all
                    for _ in getData:
                        getData = [_ for y in getData for y in _]  # fetchall returns data in form: [(name, score), (name, score)],
                        # so using this loop 'untangles' that array and makes it so i can get the name and score individually
                        names = getData[0][0]
                        scores = str(getData[0][1])
                        print(names)

                    namesFont = pg.font.SysFont('comicsansms', 20)
                    namesText = namesFont.render(names, 1, COLOUR_RED)
                    self.surface.blit(namesText, (400,400))
                    scoresFont = pg.font.SysFont('comicsansms', 20)
                    scoresText = scoresFont.render(scores, 1, COLOUR_RED)
                    self.surface.blit(scoresText, (400, 400))
                    pg.display.update()

как выглядит таблица лидеров atm: https://i.imgur.com/hcmCVQP.png результат, если я печатаю «имена» (вместе с записями в базе данных): https://i.imgur.com/TEqyFJj.png (имена печатаются бесконечно) любая помощь будет оценена. Спасибо (остальная часть кода работает, проблема заключается в простом перетаскивании записей на экран.)

1 Ответ

0 голосов
/ 12 апреля 2019

Таким образом, вы копируете строки текста друг на друга, они всегда рисуются по координатам (400, 400).

self.surface.blit(scoresText, (400, 400))

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

def getFontHeight( test_font ):
    text_height = 0
    test_bitmap = test_font.render( "WQ|^yg!`_", True, (0,0,0) )
    text_height = test_bitmap.get_height()
    return text_height

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

Когда в коде есть представление о том, сколько вертикального пространства выделено для каждой строки, довольно просто расположить строки текста на экране:

names_font  = pg.font.SysFont( 'comicsansms', 20 )
scores_font = pg.font.SysFont( 'comicsansms', 20 )

...

def renderLeaderboard( screen, leaderboard, position, name_font, scores_font, column2at=400, spacer=5 ):
    names_font_height  = getFontHeight( name_font )
    scores_font_height = getFontHeight( scores_font )
    line_height        = max( names_font_height, scores_font_height )

    name_column  = position[0]
    row          = position[1]
    score_column = name_column + column2at

    for name, score in leaderboard:
        name_text = name_font.render( name, True, NAME_COLOUR )
        score_text= score_font.render( score, True, SCORE_COLOUR )
        screen.blit( name_text, ( name_column, row ) )
        screen.blit( score_text, ( score_column, row ) )
        row += line_height + spacer

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

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