web-dev-qa-db-ja.com

pygameで複数行のテキストをレンダリングする

私はゲームを作ろうとしていて、たくさんのテキストをレンダリングしようとしています。テキストがレンダリングされると、残りのテキストは画面から消えます。テキストをpygameウィンドウの次の行に移動させる簡単な方法はありますか?

helpT = sys_font.render \
                ("This game is a combination of all of the trends\n of 2016. When you press 'Start Game,' a menu will pop up. In order to beat the game, you must get a perfect score on every single one of these games.",0,(hecolor))
        screen.blit(helpT,(0, 0))
11
Daniel Maslia

コメントで言ったように;各Wordを個別にレンダリングし、テキストの幅が表面(または画面)の幅を拡張するかどうかを計算する必要があります。次に例を示します。

import pygame
pygame.init()


SIZE = WIDTH, HEIGHT = (1024, 720)
FPS = 30
screen = pygame.display.set_mode(SIZE, pygame.RESIZABLE)
clock = pygame.time.Clock()


def blit_text(surface, text, pos, font, color=pygame.Color('black')):
    words = [Word.split(' ') for Word in text.splitlines()]  # 2D array where each row is a list of words.
    space = font.size(' ')[0]  # The width of a space.
    max_width, max_height = surface.get_size()
    x, y = pos
    for line in words:
        for Word in line:
            Word_surface = font.render(Word, 0, color)
            Word_width, Word_height = Word_surface.get_size()
            if x + Word_width >= max_width:
                x = pos[0]  # Reset the x.
                y += Word_height  # Start on new row.
            surface.blit(Word_surface, (x, y))
            x += Word_width + space
        x = pos[0]  # Reset the x.
        y += Word_height  # Start on new row.


text = "This is a really long sentence with a couple of breaks.\nSometimes it will break even if there isn't a break " \
       "in the sentence, but that's because the text is too long to fit the screen.\nIt can look strange sometimes.\n" \
       "This function doesn't check if the text is too high to fit on the height of the surface though, so sometimes " \
       "text will disappear underneath the surface"
font = pygame.font.SysFont('Arial', 64)

while True:

    dt = clock.tick(FPS) / 1000

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

    screen.fill(pygame.Color('white'))
    blit_text(screen, text, (20, 20), font)
    pygame.display.update()

結果

enter image description here

9

Pygameで複数行にテキストをレンダリングする簡単な方法はありませんが、このヘルパー関数はいくつかの用途を提供する可能性があります。テキスト(改行付き)、x、y、およびフォントサイズを渡すだけです。

def render_multi_line(text, x, y, fsize)
        lines = text.splitlines()
        for i, l in enumerate(lines):
            screen.blit(sys_font.render(l, 0, hecolor), (x, y + fsize*i))
2
justincai

.jsonファイルを使用して各行をロードできます。

.jsonファイル(first.jsonと呼ばれる):

["Hello!", "How's it going?"]

そしてそれをファイルにロードします:

sys_font = pygame.font.SysFont(("Arial"),30)

def message_box(text):
    pos = 560 # depends on message box location
    pygame.draw.rect(root, (0,0,0), (100, 550, 800, 200)) #rectangle position varies
    for x in range(len(text)):
        rendered = sys_font.render(text[x], 0, (255,255,255))
        root.blit(rendered, ( 110, pos))
        pos += 30 # moves the following line down 30 pixels

with open('first.json') as text:
    message_box(json.load(text))

import jsonを忘れずに

結果: enter image description here

お役に立てれば!

0
Lewis

できることの1つは、等幅フォントを使用することです。すべてのキャラクターで同じサイズなので、プログラマーに愛されています。これは、高さ/幅の問題を処理するための私の解決策になります。

0
BluePsion

改行(_\n_)文字を認識できる ptext ライブラリをお勧めします。 ptext.draw(text, position)を呼び出すだけです。

_import pygame as pg
import ptext


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue')
# Triple quoted strings contain newline characters.
text = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum."""

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    screen.fill(BG_COLOR)
    ptext.draw(text, (10, 10), color=BLUE)  # Recognizes newline characters.
    pg.display.flip()
    clock.tick(60)

pg.quit()
_

pygame multiline text

0
skrx

これは私がやった方法です

amfolyt_beskrivelse_text = ['en amfolyt er et stof som både kan være en base, eller syre','så som']
    for x in amfolyt_beskrivelse_text:
        descriptioncounter += 1
        screen.blit((pygame.font.SysFont('constantia',12).render(x, True, BLACK)),(300,10*descriptioncounter))
    descriptioncounter = 0

もちろん、それができるのは、テキストが画面の上部から行間隔で始まるためです。画面のさらに下から始めれば、

(300,12+12*descriptioncounter)
0
bobby7