воскресенье, 31 марта 2013 г.

python, libtcod и русские шрифты

почему то у многих возникают проблемы по подключению русских шрифтов к libtcod, хотя есть статья на вики rlgclub.ru. Ну что же, сейчас пошагово разжуем, как использовать русские шрифты в libtcod на питоне.

Устанавливаем

Для начала, ставим питон, если еще не установлен:
sudo apt-get install python
если еще неустановлена библиотека libsdl, то ставим:
sudo apt-get install libsdl1.2debian
теперь скачиваем и распаковываем libtcod (http://doryen.eptalys.net/libtcod/download/)
wget -c http://doryen.eptalys.net/?file_id=26
tar -xvf ./libtcod-1.5.1-linux.tar.gz

Тест libtcod библиотеки

создаем директорию для нашего проекта и копируем необходимые файлы дистрибутива libtcode
mkdir firstprj
cp ./libtcod-1.5.1/libtcod.so ./libtcod-1.5.1/libtcodpy.py ./libtcod-1.5.1/data/fonts/consolas10x10_gs_tc.png ./firstprj/
cd firtsprj
создадим в директории firstprj тестовый проект, для того чтобы убедиться что libtcod работает
#!/usr/bin/python
 
import libtcodpy as libtcod
 
#размер окна в знакоместах
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 50
 
LIMIT_FPS = 20  #ограничим фпс. максимум 20 кадров в секунду
 
libtcod.console_set_custom_font('consolas10x10_gs_tc.png', libtcod.FONT_TYPE_GREYSCALE | libtcod.FONT_LAYOUT_TCOD)
libtcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/libtcod tutorial', False)
libtcod.sys_set_fps(LIMIT_FPS)
 
while not libtcod.console_is_window_closed():
 
    libtcod.console_set_default_foreground(0, libtcod.white)
    libtcod.console_put_char(0, 1, 1, '@', libtcod.BKGND_NONE)
    libtcod.console_flush()
делаем файл запускаемым
chmod +x ./firtsprj.py
и запускаем его:

Русский шрифт (кодировка windows-1251)

для того чтобы интерпретатор python принимал в исходном файле символы из кодировки windows-1251, добавляем в исходник 2-й строкой, после строки:
#!/usr/bin/python
строку:
# -*- coding: windows-1251 -*-
скачиваем текстуру русского шрифтов с вики rlgclub.ru
wget -c http://rlgclub.ru/wikisite/images/2/2d/Ruterminal_big_12x12_gs_tc.png
меняем строку загрузки шрифта на:
libtcod.console_set_custom_font("Ruterminal_big_12x12_gs_tc.png", libtcod.FONT_LAYOUT_TCOD | libtcod.FONT_TYPE_GREYSCALE, 32, 32)
после нее добавляем команды для маппинга символов:
libtcod.console_map_ascii_codes_to_font('А',32,0,5);
libtcod.console_map_ascii_codes_to_font('а',32,0,6);
для тестирования вывода русского текста изменяем строку:
libtcod.console_put_char(0, 1, 1, '@', libtcod.BKGND_NONE)
на:
libtcod.console_print(0,5,5,"Тест!");
важно: исходный файл сохраняем в кодировке windows-1251
полный исходный код:
#!/usr/bin/python
# -*- coding: windows-1251 -*-
 
import libtcodpy as libtcod
 
#размер окна в знакоместах
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 50
 
LIMIT_FPS = 20  #ограничим фпс. максимум 20 кадров в секунду
 
libtcod.console_set_custom_font("Ruterminal_big_12x12_gs_tc.png", libtcod.FONT_LAYOUT_TCOD | libtcod.FONT_TYPE_GREYSCALE, 32, 32)

libtcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/libtcod tutorial', False)
libtcod.sys_set_fps(LIMIT_FPS)

libtcod.console_map_ascii_codes_to_font('А',32,0,5);
libtcod.console_map_ascii_codes_to_font('а',32,0,6);

while not libtcod.console_is_window_closed():
    libtcod.console_set_default_foreground(0, libtcod.white)
    libtcod.console_print(0,5,5,"Тест!");
    libtcod.console_flush()
результат:

unicode шрифты

в заголовке исходного файла указываем кодировку utf-8
# -*- coding: utf-8 -*-
грузим unicode шрифт:
libtcod.console_set_custom_font("consolas_unicode_16x16.png",libtcod.FONT_LAYOUT_ASCII_INROW | libtcod.FONT_TYPE_GREYSCALE,32,64);
удаляем строки маппинга ascii кодов libtcod.console_map_ascii_codes_to_font(...)
выводим текст следующим образом
libtcod.console_print(0,5,5,u"Привет!");
т.е. перед строкой с текстом добавляем символ "u", который означает что строка в unicode кодировке.
важно:файл должен быть сохранен в кодировке utf-8
полный исходный код:
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import libtcodpy as libtcod
 
#размер окна в знакоместах
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 25
 
LIMIT_FPS = 20  #ограничим фпс. максимум 20 кадров в секунду
 
libtcod.console_set_custom_font("consolas_unicode_16x16.png",libtcod.FONT_LAYOUT_ASCII_INROW | libtcod.FONT_TYPE_GREYSCALE,32,64);
libtcod.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/libtcod tutorial', False)
libtcod.sys_set_fps(LIMIT_FPS)

while not libtcod.console_is_window_closed():
 
    libtcod.console_set_default_foreground(0, libtcod.white)
    libtcod.console_print(0,5,5,u"Привет!");
    libtcod.console_flush()
результат:

2 комментария:

  1. Сергей Градецкий26 марта 2020 г. в 21:42

    Здравствуйте,
    Я новичок в разработке рогаликов, и сейчас сталкиваюсь с проблемой, что на сборке libtcode 1.6.7 и на Python 3 не получается запустить кириллицу, хотя следую точно по инструкции. Пишет:
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
    После строки:
    libtcod.console_print(0,5,5,"Тест!");

    ОтветитьУдалить