IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
FontFunction, Функция для загрузки шрифтов из картинок
UnDead_13
сообщение 22.3.2005, 8:51
Сообщение #1


Активный участник
***

Группа: Пользователи
Сообщений: 255
Регистрация: 20.10.2004
Пользователь №: 108



Вот сделал функции для загрузки шрифтов из картинок. Учитывается ширина каждого символа. Недостаток функции - нельзя использовать шрифт другого размера
Код
`========================================= Загружает шрифты из изображения
`FontNum - номер шрифта,FontFile$ - название файла
function LoadImageFont(FontNum,FontFile$)
load image FontFile$,29999
paste image 29999,0,0
StartImage=30000+(FontNum*256)
x=0
y=0
for a=StartImage to StartImage+223
  get image a,x,y,x+32,y+32
  x=x+32
  if x=512 then y=y+32:x=0
next a
cls
delete image 29999
endfunction
`====================================================

`====================================== Создает текст из шрифтов-изображений
`Texture - номер создаваемой текстуры, Text$ - текст, FontNum - номер шрифта, Distance - расстояние между символами
`Center - центрировать текст, XSize,Ysize - размеры создаваемой текстуры
function MakeTFIF(Texture,Text$,FontNum,Distance,Center,XSize,YSize)
StartImage=30000+(FontNum*256)
x=0:y=0
for a=1 to len(Text$)
Symbol=asc(mid$(Text$,a))
if Symbol=32 then Width=8:`
if Symbol=33 then Width=4:`!
if Symbol=34 then Width=10:`"
if Symbol=35 then Width=15:`#
if Symbol=36 then Width=12:`$
if Symbol=37 then Width=22:`%
if Symbol=38 then Width=18:`&
if Symbol=39 then Width=4:`'
if Symbol=40 then Width=7:`(
if Symbol=41 then Width=7:`)
if Symbol=42 then Width=10:`*
if Symbol=43 then Width=14:`+
if Symbol=44 then Width=4:`,
if Symbol=45 then Width=8:`-
if Symbol=46 then Width=4:`.
if Symbol=47 then Width=8:`/
if Symbol=48 then Width=13:`0
if Symbol=49 then Width=9:`1
if Symbol=50 then Width=13:`2
if Symbol=51 then Width=13:`3
if Symbol=52 then Width=14:`4
if Symbol=53 then Width=13:`5
if Symbol=54 then Width=13:`6
if Symbol=55 then Width=13:`7
if Symbol=56 then Width=13:`8
if Symbol=57 then Width=13:`9
if Symbol=58 then Width=4:`:
if Symbol=59 then Width=4:`;
if Symbol=60 then Width=13:`<
if Symbol=61 then Width=14:`=
if Symbol=62 then Width=13:`>
if Symbol=63 then Width=14:`?
if Symbol=64 then Width=25:`@
if Symbol=65 then Width=19:`A
if Symbol=66 then Width=17:`B
if Symbol=67 then Width=18:`C
if Symbol=68 then Width=17:`D
if Symbol=69 then Width=15:`E
if Symbol=70 then Width=14:`F
if Symbol=71 then Width=18:`G
if Symbol=72 then Width=16:`H
if Symbol=73 then Width=4:`I
if Symbol=74 then Width=13:`J
if Symbol=75 then Width=17:`K
if Symbol=76 then Width=14:`L
if Symbol=77 then Width=19:`M
if Symbol=78 then Width=16:`N
if Symbol=79 then Width=19:`O
if Symbol=80 then Width=15:`P
if Symbol=81 then Width=20:`Q
if Symbol=82 then Width=18:`R
if Symbol=83 then Width=16:`S
if Symbol=84 then Width=16:`T
if Symbol=85 then Width=16:`U
if Symbol=86 then Width=17:`V
if Symbol=87 then Width=25:`W
if Symbol=88 then Width=16:`X
if Symbol=89 then Width=18:`Y
if Symbol=90 then Width=16:`Z
if Symbol=91 then Width=7:`[
if Symbol=92 then Width=8:`\
if Symbol=93 then Width=7:`]
if Symbol=94 then Width=12:`^
if Symbol=95 then Width=16:`_
if Symbol=96 then Width=6:``
if Symbol=97 then Width=13:`a
if Symbol=98 then Width=14:`b
if Symbol=99 then Width=13:`c
if Symbol=100 then Width=14:`d
if Symbol=101 then Width=13:`e
if Symbol=102 then Width=9:`f
if Symbol=103 then Width=14:`g
if Symbol=104 then Width=13:`h
if Symbol=105 then Width=4:`i
if Symbol=106 then Width=7:`j
if Symbol=107 then Width=12:`k
if Symbol=108 then Width=4:`l
if Symbol=109 then Width=22:`m
if Symbol=110 then Width=13:`n
if Symbol=111 then Width=15:`o
if Symbol=112 then Width=14:`p
if Symbol=113 then Width=14:`q
if Symbol=114 then Width=9:`r
if Symbol=115 then Width=13:`s
if Symbol=116 then Width=9:`t
if Symbol=117 then Width=13:`u
if Symbol=118 then Width=13:`v
if Symbol=119 then Width=21:`w
if Symbol=120 then Width=13:`x
if Symbol=121 then Width=15:`y
if Symbol=122 then Width=12:`z
if Symbol=123 then Width=9:`{
if Symbol=124 then Width=3:`|
if Symbol=125 then Width=9:`}
if Symbol=126 then Width=14:`~
if Symbol=127 then Width=14:`
if Symbol=128 then Width=23:`Ђ
if Symbol=129 then Width=13:`Ѓ
if Symbol=130 then Width=4:`‚
if Symbol=131 then Width=9:`ѓ
if Symbol=132 then Width=10:`„
if Symbol=133 then Width=22:`…
if Symbol=134 then Width=14:`†
if Symbol=135 then Width=14:`‡
if Symbol=136 then Width=15:`?
if Symbol=137 then Width=28:`‰
if Symbol=138 then Width=29:`Љ
if Symbol=139 then Width=7:`‹
if Symbol=140 then Width=26:`Њ
if Symbol=141 then Width=14:`Ќ
if Symbol=142 then Width=22:`Ћ
if Symbol=143 then Width=16:`Џ
if Symbol=144 then Width=15:`ђ
if Symbol=145 then Width=4:`‘
if Symbol=146 then Width=4:`’
if Symbol=147 then Width=10:`“
if Symbol=148 then Width=10:`”
if Symbol=149 then Width=8:`•
if Symbol=150 then Width=15:`–
if Symbol=151 then Width=27:`—
if Symbol=152 then Width=14:`?
if Symbol=153 then Width=19:`™
if Symbol=154 then Width=25:`љ
if Symbol=155 then Width=7:`›
if Symbol=156 then Width=21:`њ
if Symbol=157 then Width=12:`ќ
if Symbol=158 then Width=15:`ћ
if Symbol=159 then Width=13:`џ
if Symbol=160 then Width=8:` 
if Symbol=161 then Width=17:`Ў
if Symbol=162 then Width=15:`ў
if Symbol=163 then Width=13:`Ј
if Symbol=164 then Width=14:`¤
if Symbol=165 then Width=10:`Ґ
if Symbol=166 then Width=3:`¦
if Symbol=167 then Width=13:`§
if Symbol=168 then Width=15:`Ё
if Symbol=169 then Width=20:`©
if Symbol=170 then Width=17:`Є
if Symbol=171 then Width=13:`«
if Symbol=172 then Width=14:`¬
if Symbol=173 then Width=8:`­
if Symbol=174 then Width=20:`®
if Symbol=175 then Width=9:`Ї
if Symbol=176 then Width=8:`°
if Symbol=177 then Width=14:`±
if Symbol=178 then Width=4:`І
if Symbol=179 then Width=4:`і
if Symbol=180 then Width=9:`ґ
if Symbol=181 then Width=13:`µ
if Symbol=182 then Width=14:`¶
if Symbol=183 then Width=4:`·
if Symbol=184 then Width=13:`ё
if Symbol=185 then Width=27:`№
if Symbol=186 then Width=13:`є
if Symbol=187 then Width=13:`»
if Symbol=188 then Width=7:`ј
if Symbol=189 then Width=16:`Ѕ
if Symbol=190 then Width=13:`ѕ
if Symbol=191 then Width=9:`ї
if Symbol=192 then Width=19:`А
if Symbol=193 then Width=16:`Б
if Symbol=194 then Width=17:`В
if Symbol=195 then Width=13:`Г
if Symbol=196 then Width=18:`Д
if Symbol=197 then Width=15:`Е
if Symbol=198 then Width=24:`Ж
if Symbol=199 then Width=16:`З
if Symbol=200 then Width=15:`И
if Symbol=201 then Width=15:`Й
if Symbol=202 then Width=14:`К
if Symbol=203 then Width=17:`Л
if Symbol=204 then Width=19:`М
if Symbol=205 then Width=16:`Н
if Symbol=206 then Width=19:`О
if Symbol=207 then Width=15:`П
if Symbol=208 then Width=15:`Р
if Symbol=209 then Width=18:`С
if Symbol=210 then Width=16:`Т
if Symbol=211 then Width=17:`У
if Symbol=212 then Width=20:`Ф
if Symbol=213 then Width=16:`Х
if Symbol=214 then Width=17:`Ц
if Symbol=215 then Width=15:`Ч
if Symbol=216 then Width=22:`Ш
if Symbol=217 then Width=24:`Щ
if Symbol=218 then Width=22:`Ъ
if Symbol=219 then Width=22:`Ы
if Symbol=220 then Width=16:`Ь
if Symbol=221 then Width=17:`Э
if Symbol=222 then Width=25:`Ю
if Symbol=223 then Width=17:`Я
if Symbol=224 then Width=13:`а
if Symbol=225 then Width=15:`б
if Symbol=226 then Width=14:`в
if Symbol=227 then Width=9:`г
if Symbol=228 then Width=16:`д
if Symbol=229 then Width=13:`е
if Symbol=230 then Width=20:`ж
if Symbol=231 then Width=12:`з
if Symbol=232 then Width=13:`и
if Symbol=233 then Width=13:`й
if Symbol=234 then Width=12:`к
if Symbol=235 then Width=15:`л
if Symbol=236 then Width=17:`м
if Symbol=237 then Width=12:`н
if Symbol=238 then Width=15:`о
if Symbol=239 then Width=12:`п
if Symbol=240 then Width=14:`р
if Symbol=241 then Width=13:`с
if Symbol=242 then Width=12:`т
if Symbol=243 then Width=15:`у
if Symbol=244 then Width=22:`ф
if Symbol=245 then Width=13:`х
if Symbol=246 then Width=14:`ц
if Symbol=247 then Width=12:`ч
if Symbol=248 then Width=18:`ш
if Symbol=249 then Width=20:`щ
if Symbol=250 then Width=17:`ъ
if Symbol=251 then Width=19:`ы
if Symbol=252 then Width=14:`ь
if Symbol=253 then Width=13:`э
if Symbol=254 then Width=20:`ю
if Symbol=255 then Width=14:`я
Image=StartImage+Symbol-32
paste image Image,x,0,1
x=x+Width+Distance
next a
x=x-Distance
get image Texture,0,0,x,32
cls
if center=1 then x=(XSize-x)/2 else x=0
paste image Texture,x,(YSize/2)-16
get image Texture,0,0,XSize,YSize
cls
endfunction
`====================================================

`==================================================== Удалить шрифт
`FontNum - Номер шрифта
function DeleteImageFont(FontNum)
StartImage=30000+(FontNum*256)
for a=StartImage to StartImage+223
delete image a
next a
endfunction
`====================================================


Функция с примером: FontFunction.exe (168 Кб).
Перейти в начало страницы
 
+Цитировать сообщение
Sha/|/|an
сообщение 22.3.2005, 16:18
Сообщение #2


Digital Mystery
***

Группа: Пользователи
Сообщений: 1887
Регистрация: 1.9.2004
Пользователь №: 8



Прикольно, вроде, но вот только фиксированный размер шрифта врядли кого-то устроит. Зато ты мне подал клевую идею.. Когда я буду юзать в меню фиксированные надписи, то я буду создавать их при загрузке игры, и поэтому размер игры уменьшится.

Но у твоей функции естьи недостаток. У тебя раз 200 происходит условие. А это - тормоза. Ведь каждый раз компу его нужно просчитать. Гораздо умнее (да и шрифт тогда будет разных размеров) сделать файл и в него занести все эти значения. Затем их прочитать в массив и юзать из него по индексу. Тогда твои 200 строк заменятся одной.


--------------------
exclusive reality for you...
Перейти в начало страницы
 
+Цитировать сообщение
CAXAP
сообщение 23.3.2005, 11:51
Сообщение #3


Активный участник
***

Группа: Пользователи
Сообщений: 107
Регистрация: 11.11.2004
Из: Элиста
Пользователь №: 127



Цитата(UnDead_13 @ Mar 22 2005, 09:51 AM)
Вот сделал функции для загрузки шрифтов из картинок. Учитывается ширина каждого символа. Недостаток функции - нельзя использовать шрифт другого размера


Не фига себе. Ты это сколько писал? По Инету давно бродят исходники, которые символы определяют автоматически. Как-нибудь на сайт выложу.


--------------------
Не спорь! Сахар белый!
ﻄﻀﺼﺽﺸﺹﺶﺳﺷﻑﻉﻙﻖﻖﻏﺱﺶﺻﺺﺽﻆﻡﻩ
Перейти в начало страницы
 
+Цитировать сообщение
UnDead_13
сообщение 23.3.2005, 12:24
Сообщение #4


Активный участник
***

Группа: Пользователи
Сообщений: 255
Регистрация: 20.10.2004
Пользователь №: 108



Цитата
Не фига себе. Ты это сколько писал?

Вначале я сделал функцию с картинкой, потом измерил и записал в блокнот ширину каждого символа, потом сделал прогу, которая добавляет в конце и в начале строки нужные команды (типа строка в формате if Symbol=<n> then Width=<строка с шириной>:`<символ ASCII>). Все это я сделал примерно за 2,5 часа.
Цитата
По Инету давно бродят исходники, которые символы определяют автоматически. Как-нибудь на сайт выложу.

Круто. Выложи, пожалуйста, поскорее smile.gif
Перейти в начало страницы
 
+Цитировать сообщение
CAXAP
сообщение 25.3.2005, 14:22
Сообщение #5


Активный участник
***

Группа: Пользователи
Сообщений: 107
Регистрация: 11.11.2004
Из: Элиста
Пользователь №: 127



df_fontset

Есть крутая команда под названием DarkForge. Вот она и сделала этот исходник:

Код
`    ------------------------------------------------------------------------
`    Sprite ScoreBoard                             DarkForge FAQ (22/12/2000)
`    ------------------------------------------------------------------------
`    Shows how to use sprites to display a score instead of using text.
`    Sine-wave bounces the sprites just for fun;-)

hide mouse
sync rate 0
sync on

`    Load our 32x27 font which we'll chop-up into images

load bitmap "df_fontset.bmp",1

for a = 1 to 60

    get image a,x,y,x+29,y+26

    inc x,32

    if x=320
 x=0
 inc y,27
    endif

next a

set current bitmap 0

`    This means our numbers range from image 17 to image 26
`    Also image 34 = A and image 59 = Z. Image 60 = a space

`    Now we've got the images we can use them for sprites as needed
`    We know the score will never use more than 10 sprites, so we'll reserve
`    sprites 100 - 110 for this purpose.

for a = 100 to 110

    sprite a,0,0,60
    set sprite a,0,1
    hide sprite a

next a

`    Here is an example score

score = 24687450

`    Work out how many sprites we need to use here

ts = len(str$(score))

dim score(ts)
dim spritey(ts)

for a = 1 to ts

    v = asc(mid$(str$(score),a))

    if v>=48 and v<=57
 score(a) = v-31
 spritey(a) = a*2
 sprite 99+a,-32,0,v-31
 show sprite 99+a
    endif

next a

step=3 : sx=0

`    The main loop is here

do

    cls 0

    for a = 1 to ts

 sprite 99+a,160+(32*a),200+sin(spritey(a)+a*step)*50,score(a)

 ty=spritey(a)
 inc ty,2
 spritey(a)=ty

    next a

    sync

loop


--------------------
Не спорь! Сахар белый!
ﻄﻀﺼﺽﺸﺹﺶﺳﺷﻑﻉﻙﻖﻖﻏﺱﺶﺻﺺﺽﻆﻡﻩ
Перейти в начало страницы
 
+Цитировать сообщение
UnDead_13
сообщение 25.3.2005, 21:01
Сообщение #6


Активный участник
***

Группа: Пользователи
Сообщений: 255
Регистрация: 20.10.2004
Пользователь №: 108



И где сдесь автоматическое определение ширины unsure.gif ? Как я понял все буквы должны быть одного размера, чтобы шрифт отображался нормально.
Перейти в начало страницы
 
+Цитировать сообщение
dosyncloop
сообщение 26.3.2005, 3:37
Сообщение #7


Активный участник
***

Группа: Пользователи
Сообщений: 39
Регистрация: 18.2.2005
Пользователь №: 213



Ха, я щас напишу функцию создания картинок со шрифта и загрузку картиночного шрифта
Перейти в начало страницы
 
+Цитировать сообщение
dosyncloop
сообщение 26.3.2005, 5:31
Сообщение #8


Активный участник
***

Группа: Пользователи
Сообщений: 39
Регистрация: 18.2.2005
Пользователь №: 213



Прога почти получилась
В DB есть Text width(). Если посмотреть ширину каждого символа можно сделать графический шрифт. и для него файл с описаниями ширины символов
Примерно Так

Сначала нужно запустить maker, а потом reader.
Еще немного нужно отрегулировать параметры ширины символа но в целом работает
Перейти в начало страницы
 
+Цитировать сообщение
UnDead_13
сообщение 26.3.2005, 10:54
Сообщение #9


Активный участник
***

Группа: Пользователи
Сообщений: 255
Регистрация: 20.10.2004
Пользователь №: 108



Вот дам несколько рекомендации, что нужно добавить и изменить:
- Сделай поддержку кириллицы (а то при создании шрифта вместо русских букв - закорючки):
set text font "Arial",204
- Сделай функции создания шрифта, загрузки шрифта и создание текста из загруженного шрифта (так удобнее)
- Сделай перенос букв в создаваемой картинке
Перейти в начало страницы
 
+Цитировать сообщение
dosyncloop
сообщение 26.3.2005, 11:53
Сообщение #10


Активный участник
***

Группа: Пользователи
Сообщений: 39
Регистрация: 18.2.2005
Пользователь №: 213



Переделанная версия работает на 100% в DBclassic
Запихивает установленный в системе шрифт нужного размера в BMP.А вторая часть затем с легкостью загружает графический шрифт и файл конфиг, разбивает его на картинки с номерами как ASCII. Очень рекомендую
FontFix
Перейти в начало страницы
 
+Цитировать сообщение
Sha/|/|an
сообщение 27.3.2005, 2:47
Сообщение #11


Digital Mystery
***

Группа: Пользователи
Сообщений: 1887
Регистрация: 1.9.2004
Пользователь №: 8



Цитата
Переделанная версия работает на 100% в DBclassic
Запихивает установленный в системе шрифт нужного размера в BMP.А вторая часть затем с легкостью загружает графический шрифт и файл конфиг, разбивает его на картинки с номерами как ASCII. Очень рекомендую

Молодец. Только этот шрифт подойдет только для создания надписей меню (как одной картинка) или отображения очков, фпс.. А так, им даже четверть экрана не заполнишь - будут тормоза. Поэтому, если нжуен дейсвительно текст (брифинги например), то лучше сделать свой шрифт (не из картинок!).


--------------------
exclusive reality for you...
Перейти в начало страницы
 
+Цитировать сообщение
dosyncloop
сообщение 27.3.2005, 5:34
Сообщение #12


Активный участник
***

Группа: Пользователи
Сообщений: 39
Регистрация: 18.2.2005
Пользователь №: 213



Если кто не понял, что этот шрифт универсален - объясняю.
Создаешь bitmap <любой кроме 0>, делаешь его текущим. вставляешь на него текст из такого шрифта и копируешь весь Bitmap . Получается одна картинка которой можно заполнить хоть весь экран и которая будет давать мало тормозоф. А если затекстурить плашку такой текстурой с картиночным текстом(ну с прозрачностью), то ваще руль будет.
Могу демку написать, кто не верит.
И вообще щас функцию забабахаю

Сообщение отредактировал dosyncloop - 27.3.2005, 5:37
Перейти в начало страницы
 
+Цитировать сообщение
CAXAP
сообщение 27.3.2005, 13:37
Сообщение #13


Активный участник
***

Группа: Пользователи
Сообщений: 107
Регистрация: 11.11.2004
Из: Элиста
Пользователь №: 127



Ну, извиняйте, что не то закачал. Наверное я тему немного не понял


--------------------
Не спорь! Сахар белый!
ﻄﻀﺼﺽﺸﺹﺶﺳﺷﻑﻉﻙﻖﻖﻏﺱﺶﺻﺺﺽﻆﻡﻩ
Перейти в начало страницы
 
+Цитировать сообщение
Sha/|/|an
сообщение 28.3.2005, 0:45
Сообщение #14


Digital Mystery
***

Группа: Пользователи
Сообщений: 1887
Регистрация: 1.9.2004
Пользователь №: 8



Цитата
Создаешь bitmap <любой кроме 0>, делаешь его текущим. вставляешь на него текст из такого шрифта и копируешь весь Bitmap . Получается одна картинка которой можно заполнить хоть весь экран и которая будет давать мало тормозоф. А если затекстурить плашку такой текстурой с картиночным текстом(ну с прозрачностью), то ваще руль будет.

Ну это понятно, а если мне надо отображать много изменяющейся инфы на экране? Напрмер очки, время, скорость и т.д..


--------------------
exclusive reality for you...
Перейти в начало страницы
 
+Цитировать сообщение
dosyncloop
сообщение 28.3.2005, 18:50
Сообщение #15


Активный участник
***

Группа: Пользователи
Сообщений: 39
Регистрация: 18.2.2005
Пользователь №: 213



Сделал-таки функцию, которая считывает текст из файла и распихивает его по картикам этим самым шрифтом

Полный Readme в архиве
FontFunction.zip


Цитата
а если мне надо отображать много изменяющейся инфы на экране? Напрмер очки, время, скорость и т.д..


Я как-то делал такую потеху.Зафиксировал четыре плашки на экране, находил высоту над матрицей, число это переводил в строку, ну потом каждую цифру в номер текстуры и текстурил плашки. И представляешь - работала без проблем. Функцию для этих целей можно написать без проблем.
Правда с очками, временем, скоростью не пробовал, но мне так кажется - должно получиться.
Перейти в начало страницы
 
+Цитировать сообщение
SNIPER
сообщение 6.12.2005, 17:28
Сообщение #16


Активный участник
***

Группа: Пользователи
Сообщений: 367
Регистрация: 29.4.2005
Из: сВЙСДСЙ
Пользователь №: 276



Я тоже столкнулся с этой проблемой, т. е. грузить шрифт из картинки.
Но нехватало фантазии для букв.

Решил использовать TTF шрифты.
Пробовал копировать файл шрифта в папку fonts. Не получалось, даже после перезагрузки компа.

Стал писать функцию на сях.

#include <windows.h>
extern "C" _declspec(dllexport) font_add(char *font_name);
extern "C" _declspec(dllexport) font_delete(char *font_name);

extern "C" _declspec(dllexport) font_add(char *font_name);
{
BOOL result=AddFontResource(font_name);
// if(!result)
//
}
extern "C" _declspec(dllexport) font_delete(char *font_name);
{
BOOL result=DeleteFontResource(font_name);
}
/////////////////////////////////////////////////////

Потом в ДБ:
load dll "sas.dll",1
call dll 1,"font_add","sas.ttf"
set text font "sas_FontName",204

Тоже вариант...

А за исходники - спасибо!
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 20.11.2017, 14:34
 X 
Ссылки на работы форумчан:
1. Cайт по использованию 3D технологий
в образовании

2. 15 Defense. Underwater Battle

3. GlaZ в Steam Greenlight