파이게임의 윈도우에서 텍스트를 편집하는 방법이다. 텍스트 편집쯤이야 대부분의 편집기의 흔한 기능인데도 이것을 파이게임에 구현하려면 품이 좀 든다. 게임내에서는 주된 기능은 아닐 것이므로 빠르게 보고 넘어가도록 한다. (글을 쓰고 싶으면 워드를 사용하지 글을 입력하는 것이 보통 말하는 게임은 아닐 것이다) 폰트 사용에 대한 내용은 지난번 포스트를 참고할 수 있다.

 

text1 = 'Text Editing, 텍스트 편집하기'
font1 = pygame.font.Font('Maplestory Bold.ttf',35)
img1 = font1.render(text1,True,BLACK)

rect1 = img1.get_rect()
rect1.topleft = (40,50)
cursor1 = pygame.Rect(rect1.topright,(3,rect1.height))
print(cursor1)

문자열을 text1에 저장한다. 폰트를 지정해주고 Surface 객체에 렌더링을 한다. 그 다음 단락에서 Rect로 사각형을 텍스트 Surface 와 연결 시킨다. 여기다가 커서로 쓸 사각형을 하나 더 만든다. 커서는 사각형의 오른쪽 끝에 매달려 있을 것이다.

 

 

파이게임 텍스트 편집

이벤트 처리기에서 대부분 처리가 된다. text1 변수의 크기가 0보다 크다는 것은 글자가 들어있다는 것이다. 그런 경우 백스페이스를 눌렀을 때 끝에서 한글자를 지운다 (문자 배열에서 마지막 문자가 제외 되는 것이다.) text1 = text1[:-1] 의 리스트 문법으로 처리된다.

 

문자열 삭제

그 다음에 text1 에는 누른 키 unicode를 대입한다. 나머지 렌더링 과정은 같다. 커서를 잘 보면 커서는 텍스트의 오른쪽 벽에 딱 달라붙게 된다. topright를 topleft 에 붙인 것이 커서인 것이다.

 if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_BACKSPACE:
                if len(text1)> 0:
                    text1 = text1[:-1]
                    print("x")

            #elif event.key == pygame.K_g:
            #    print(chr(12622))
            #    text1 += chr(12622)
            else:
                text1 += event.unicode
                print("o")
            img1 = font1.render(text1,True,BLACK)
            rect1.size = img1.get_size()
            cursor1.topleft = rect1.topright

time.time()이란 메소드를 사용하기 위해서 time을 import 해야한다. 시간을 반환하는 것이다. time.time() %1을 하면 0부터 0.99999.... 까지 리턴하여 시간을 측정할 수 있다. 0.5초보다 많으면 커서를 한번 껌뻑인다.(0.5초마다 한번씩 그린다)

    screen.fill(C1_BLUE)
    screen.blit(img1,rect1)
    if time.time() % 1 > 0.5:
        pygame.draw.rect(screen, RED, cursor1)
    pygame.display.update()

 

아쉽게도 Pygame에서 화면에 한글을 입력하는 방법은 찾지 못했다. 구글 검색을 더 해봤지만 제대로된 답을 찾지 못했다. 분명 입력모드를 영문에서 한글로 변환시켜서 유니코드를 출력하는 방법은 있을 것 같은데 찾지 못했다. 키와 한글코드를 매핑시키면 가능은 할 것 같으나 한글의 특성상 어마어마한 작업이 될 것 같아 엄두를 못냈다. 때로는 IT시대에 우리가 한글을 쓴다는 것의 의미를 생각해 보기도 한다. 내가 영어 사용자나 아니면 다른 알파벳 계열 언어 (독일,프랑스,스페인 등) 를 사용했다면 훨씬 가벼운 문제였을 것이다.

 

한글은 난세의 영웅 세종대왕의 위대한 유산이지만 한글을 이어받은 자들에게 그만큼 책임이 따르는 것은 확실한 것 같다. 어쨋든 방법은 있을테니 나중에 검색하다 찾으면 업데이트 하겠다. (아니면 파이게임에서는 영어만 쓰는걸로 ㅋ)

 

 

* 전체 소스 코드

import pygame
from pyc import *
import time

SIZE = width,height = 640,240

screen = pygame.display.set_mode(SIZE)
screen.fill(C1_BLUE)
pygame.init()

# Text Editing

text1 = 'Text Editing, 텍스트 편집하기'
font1 = pygame.font.Font('Maplestory Bold.ttf',35)
img1 = font1.render(text1,True,BLACK)

rect1 = img1.get_rect()
rect1.topleft = (40,50)
cursor1 = pygame.Rect(rect1.topright,(3,rect1.height))
print(cursor1)

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_BACKSPACE:
                if len(text1)> 0:
                    text1 = text1[:-1]
                    print("x")

            #elif event.key == pygame.K_g:
            #    print(chr(12622))
            #    text1 += chr(12622)
            else:
                text1 += event.unicode
                print("o")
            img1 = font1.render(text1,True,BLACK)
            rect1.size = img1.get_size()
            cursor1.topleft = rect1.topright

    screen.fill(C1_BLUE)
    screen.blit(img1,rect1)
    if time.time() % 1 > 0.5:
        pygame.draw.rect(screen, RED, cursor1)
    pygame.display.update()

pygame.quit()

공유하기

facebook twitter kakaoTalk kakaostory naver band