python study/import pygame

python)pygame, font(+개행문자 문제 해결 방법) 텍스트 띄우기(2)

mhe1239 2024. 12. 27. 00:08

번외1) font.size()

주어진 문자열이 특정 폰트로 렌더링될 때 차지하는 두 변수인 가로와 세로 크기를 반환한다.

width, height = font.size(String)

width: 텍스트의 가로 길이 (픽셀 단위)
height: 텍스트의 세로 길이 (픽셀 단위)

만약 세로 크기 변수만 쓰고 가로 크기 변수를 안쓴다면 _, height = font.size(String) 이런식으로 _를 써서변수가 사용되지 않을 것을 보여주자.

번외2) pygame은 개행문자가 적용이 안된다?

pygame에서 font의 특징이 매우 큰 하나 있는데 개행문자(\n)가 적용이 안된다는 점이다. 즉, 줄바꿈이 안된다.

이는 이전 글에서 '안녕, pygame\n'을 출력했는데도 ▯가 나오는 것을 통해 알 수 있다.

(이는 pygame.font.SysFont이든 pygame.font.Font이든 안된다.)


 
text="""
string1
string2
"""
와 같은 형식도 줄바꿈이 되지 않으며, """을 인식하지 않는 것이 아닌 ▯으로 인식하는 것을 알 수 있다.

따라서 다른 방법을 사용해야한다.

 

첫번째 방법은 원하는 크기의 가로 세로를 계산해 특정 가로의 길이를 넘으면 x좌표는 이전 글의 처음 좌표부터, y좌표는 줄바꿈 크기만큼 증가시키는 방법이다.

import pygame,sys
WHITE=(255,255,255);LIGHT_GRAY=(200,200,200)
screenw,screenh,FPS=500,300,80
text="이 코드는 pygame에서 텍스트 줄바꿈을 테스트,이 코드는 특정 가로 폭을 초과하면 텍스트를 줄바꿈한다."
x,y=50,50#시작점
max_width=400#가로 최대치
def draw_text(screen,text,font,color,x,y,max_width):
    words=text.split(' ');lines=[];current_line=''
    for word in words:
        test_line=current_line+(''if current_line==''else' ')+word
        test_width,test_height=font.size(test_line)#텍스트의 가로 길이, 세로 길이
        if test_width>max_width:
            lines.append(current_line);current_line=word
        else:current_line=test_line
    lines.append(current_line)
    for i,line in enumerate(lines):
        line_screen=font.render(line,True,color)
        screen.blit(line_screen,(x,y+i*(test_height+10)))
    """
    바로 윗 코드(18번째 줄)에서 test_height+10 이 부분이 줄바꿈 크기만큼 줄넘김,
    값을 증가시키면 txt와 txt 사이의 거리가 멀어짐을 알 수 있다.
    """

def main():
    pygame.init();screen=pygame.display.set_mode((screenw,screenh))
    pygame.display.set_caption("text_wrapping")
    font=pygame.font.SysFont('hy견고딕',30,False,True);clock=pygame.time.Clock()
    while True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                sys.exit()
        screen.fill(LIGHT_GRAY)
        draw_text(screen,text,font,WHITE,x,y,max_width)
        pygame.display.update()
        clock.tick(FPS)

if __name__=="__main__":
    main()

 

왼쪽이 코드를 실행시 나타나는 창이다.
max_width로 텍스트의 가로 길이를 설정하고 y+i*(test_height+10)에서 test_height+10으로 텍스트의 개행문자 길이를 설정할 수 있다.
위의 이미지를 보면 \n를 텍스트에 넣어도 ▯만 표시되고 줄넘김도 안되는걸 알 수 있다.

 

두 번째 방법은 text에 개행문자를 넣으면 개행문자를 감지해 개행문자를 기준으로 텍스트를 나누어 출력하는 방식이다.

import pygame,sys
LIGHT_GRAY=(200,200,200)
screenw,screenh,FPS=400,300,80
text="Hello, World!\nThis is multiline text.\nPygame handles it manually."
x_pos,y_pos=50,50
WHITE=(255,255,255)
def draw_text(screen,text,font,x,y,color):
    #lines=['Hello, World!', 'This is multiline text.', 'Pygame handles it manually.']
    lines=text.split('\n')#개행문자를 기준으로 텍스트를 여러 줄로 분리
    for line in lines:
        #개행문자를 대신하기 위한 폰트의 세로 길이 얻어오기
        _,test_height=font.size(line)
        rendered_text=font.render(line,True,color)
        screen.blit(rendered_text,(x, y))#텍스트 화면에 출력
        y+=test_height+10#줄 간격 조정(15번째 줄)

def main():
    pygame.init()
    screen=pygame.display.set_mode((screenw, screenh))
    pygame.display.set_caption("text_wrapping2")
    font=pygame.font.SysFont('arial',30,True,True)
    clock=pygame.time.Clock()
    while True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                sys.exit()
        screen.fill(LIGHT_GRAY)
        draw_text(screen,text,font,x_pos,y_pos,WHITE)
        pygame.display.update()
        clock.tick(FPS)

if __name__ == "__main__":
    main()

 

왼쪽이 코드를 실행시 나타나는 창이다.
코드는 \n을 감지하여 이를 기준으로 문자열을 나누고
15번째 줄의 test_height+10으로 텍스트의 개행문자 길이를 설정할 수 있다.
test_height+30 이런식으로 하면 텍스트 간의 간격이 늘어나는 것을 볼 수 있다.

 

첫 번째 방법의 경우 어느 채팅 프레임을 만들고 그 안에 텍스트를 넣어야한다면 이용하는 것이 좋을 것이라 생각되고

두 번째 방법의 경우 간단하게 텍스트를 띄울때에 쓰는 용도로 사용하면 될 것이라 생각한다.

 

첫 번째 방법 사용 예시