IPB

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

 
Ответить в данную темуНачать новую тему
Спрайтовый текст-кнопки, буквы из спрайтов
versus
сообщение 9.11.2004, 23:28
Сообщение #1


Digital Mystery
***

Группа: Пользователи
Сообщений: 802
Регистрация: 1.9.2004
Из: Санкт-Петербург
Пользователь №: 9



Функции для создания и работы с спрайтовым текстом-кнопкой. Думаю будут очень полезными. Может кто их улучшит или выскажит более рациональный метод. biggrin.gif
Короче сначала создаём кучу изображений (можно нарезать из одного файла, можно грузить по очереди). Я создаю 80 изображений, где первые 40 - сиволы с одним цветом, 41-80 с другим (алфавит, цифры, спецсимволы). Ещё, спрайт 1001 - это курсор мыши.
А это надо вставить в начало, тобишь перед do
Код
Type ButtonEntry
stretch#
coll
ghost
hide
alpha
stretch_x
stretch_y
Endtype
dim button(120) as ButtonEntry
dim spr(120,16)
dim spn(120,16)

Причём перед вызовом функции нужно указать stretch#, которая определяет размер. (например, button(n).stretch#=new_(40,1)) При hide=1 кнопка не будет "сталкиваться"... blink.gif
А вот и сами функции. Первая функция вызывается до начала цикла.
Код
`Функция создания текста, где text$ - надпись,x,y - верхний левый угол,
`nom - номер кнопки
Function alfavit_spr(text$,x,y,nom)
`Анализ текста
kol=len(text$)
For n=1 to kol
spr(nom,n)=bukva(mid$(text$,n))
next n
`Поиск свободного спрайта
n=1:dn=-1
repeat
dn=dn+1
until sprite exist(n+dn)=0
`Создание надписи из спрайтов, где число 102 - ширина одного символа
repeat
dx#=102*(button(nom).stretch#/100)
sprite n+dn,x+n*dx#,y,spr(nom,n)
stretch sprite n+dn,new_(button(nom).stretch#,1),new_(button(nom).stretch#,2)
spn(nom,n)=n+dn
n=n+1
until spr(nom,n)=0 or n=16
endfunction

Функция, которая определяет столкновение и возвращает номер нажатой кнопки-спрайта.
Код
function button_click()
spr=sprite collision (1001,0)
`число 120 - количество кнопок-спрайтов
`число 16 - максимальное количество символов в одной кнопке
for n=1 to 120
for nspr=1 to 16
if spn(n,nspr)=spr and button(n).coll=1 and button(n).ghost=0 and button(n).hide=0 then menu=n
 if menu<>n
  if spn(n,nspr)>0 then SET SPRITE IMAGE spn(n,nspr),spr(n,nspr)
 endif
 if button(n).coll=0 and button(n).ghost=0
  if spn(n,nspr)>0 then offset sprite spn(n,nspr),1000,1000
 else
  if spn(n,nspr)>0 then offset sprite spn(n,nspr),0,0
 endif
next nspr
next n
if menu>0 and button(menu).coll=1
for n=1 to 16
if spn(menu,n)>0
 image=spr(menu,n)+40: if image>81 then image=81
 SET SPRITE IMAGE spn(menu,n),image
 endif
next n
endif
endfunction menu

А эта функция для того, чтобы кнопки одинаково смотрелись при всех режимах разрешения монитора, где c# - координата, а при x_y=1 вычисляется новая ширина, а при x_y=2, новая высота. Расположение самой кнопки тоже нужно задавать с помощью этой функции.
Код
function new_(c#,x_y)
if x_y=1 then new_c#=(c#/1024)*display_x(0)
if x_y=2 then new_c#=(c#/768)*display_y(0)
endfunction new_c#

Функция для замены символов в уже существующей кнопке (чтоб слишком много спрайтов не использовать) dry.gif
Код
function replace_spr(text$,nom)
kol=len(text$)
for n=1 to kol
spr(nom,n)=bukva(mid$(text$,n))
if spr(nom,n)>0 then SET SPRITE IMAGE spn(nom,n),spr(nom,n)
next n
endfunction

А про это даже и не спрашивайте... ;-)
Код
function bukva(bukva$)
if bukva$="a" then sprn=1
if bukva$="b" then sprn=2
if bukva$="c" then sprn=3
if bukva$="d" then sprn=4
if bukva$="e" then sprn=5
if bukva$="f" then sprn=6
if bukva$="g" then sprn=7
if bukva$="h" then sprn=8
if bukva$="i" then sprn=9
if bukva$="j" then sprn=10
if bukva$="k" then sprn=11
if bukva$="l" then sprn=12
if bukva$="m" then sprn=13
if bukva$="n" then sprn=14
if bukva$="o" then sprn=15
if bukva$="p" then sprn=16
if bukva$="q" then sprn=17
if bukva$="r" then sprn=18
if bukva$="s" then sprn=19
if bukva$="t" then sprn=20
if bukva$="u" then sprn=21
if bukva$="v" then sprn=22
if bukva$="w" then sprn=23
if bukva$="x" then sprn=24
if bukva$="y" then sprn=25
if bukva$="z" then sprn=26
if bukva$="1" then sprn=27
if bukva$="2" then sprn=28
if bukva$="3" then sprn=29
if bukva$="4" then sprn=30
if bukva$="5" then sprn=31
if bukva$="6" then sprn=32
if bukva$="7" then sprn=33
if bukva$="8" then sprn=34
if bukva$="9" then sprn=35
if bukva$="0" then sprn=36
if bukva$=":" then sprn=37
if bukva$="*" then sprn=38
if bukva$="!" then sprn=39
if bukva$="-" then sprn=40
if bukva$=" " then sprn=81
endfunction sprn

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


--------------------
:: exclusive reality for you ::

фрОМ раШа виЗ пАнк
Перейти в начало страницы
 
+Цитировать сообщение
versus
сообщение 10.11.2004, 0:02
Сообщение #2


Digital Mystery
***

Группа: Пользователи
Сообщений: 802
Регистрация: 1.9.2004
Из: Санкт-Петербург
Пользователь №: 9



Забыл сказать, display_x(0) и display_y(0) - текущее разрешение.
Ну а вот некоторые эффеты. При ghost=1 кнопка будет исчезать, ghost=2 - растягиваться, при ghost=3 - появляться!!! wink.gif
В цыкле ставим gosub button_effects
Это ставим после loop
Код
button_effects:
for b=1 to 120
if button(b).ghost=1 or button(b).ghost=2
button(b).alpha=button(b).alpha+10
if button(b).alpha>255 then button(b).ghost=0:button(b).alpha=0:button(b).coll=0:button(b).stretch_x=0:button(b).stretch_y=0
for n=1 to 16
if spn(b,n)>0
 if button(b).ghost=0 then hide sprite spn(b,n)
 if  button(b).ghost<>0 then set sprite alpha spn(b,n),255-button(b).alpha
 stretch sprite spn(b,n),button(b).stretch#-button(b).stretch_x,button(b).stretch#+button(b).stretch_y
 offset sprite spn(b,n),button(b).stretch_x,button(b).stretch_y/5
endif
next n
endif
if button(b).ghost=2 then button(b).stretch_y=button(b).stretch_y+10
if button(b).ghost=3
button(b).alpha=button(b).alpha+10
if button(b).alpha>255 then button(b).ghost=0:button(b).alpha=0:button(b).coll=1
for n=1 to 16
if spn(b,n)>0
 show sprite spn(b,n)
 if  button(b).ghost<>0 then set sprite alpha spn(b,n),button(b).alpha
 stretch sprite spn(b,n),button(b).stretch#,button(b).stretch#
endif
next n
endif
next b
return


--------------------
:: exclusive reality for you ::

фрОМ раШа виЗ пАнк
Перейти в начало страницы
 
+Цитировать сообщение
Tolking
сообщение 10.11.2004, 12:32
Сообщение #3


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

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



Я что-то не понял. Ты каждый раз в цикле выводишь надпись отдельными буковками? А нельзя из отдельных буковок собрать надпись и работать только с одним спрайтом?


--------------------
Что наша жизнь?
Перейти в начало страницы
 
+Цитировать сообщение
versus
сообщение 10.11.2004, 15:13
Сообщение #4


Digital Mystery
***

Группа: Пользователи
Сообщений: 802
Регистрация: 1.9.2004
Из: Санкт-Петербург
Пользователь №: 9



Цитата(Tolking @ Nov 10 2004, 01:32 PM)
Я что-то не понял. Ты каждый раз в цикле выводишь надпись отдельными буковками?
*

Нет, надпись выводится один раз до начала цикла...
Цитата(Tolking @ Nov 10 2004, 01:32 PM)
А нельзя из отдельных буковок собрать надпись и работать только с одним спрайтом?
*

Можно, но так удобнее всякие эффекты делать, или просто надпись менять..


--------------------
:: exclusive reality for you ::

фрОМ раШа виЗ пАнк
Перейти в начало страницы
 
+Цитировать сообщение
Sha/|/|an
сообщение 10.11.2004, 15:42
Сообщение #5


Digital Mystery
***

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



Versus! Ты не в тему это сообщение расположил! ДБклассик никак не потянет спрайтовых надписей! Поэтому надо было создавать в ДБПро!! smile.gif


--------------------
exclusive reality for you...
Перейти в начало страницы
 
+Цитировать сообщение
Tolking
сообщение 10.11.2004, 16:26
Сообщение #6


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

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



Надпись ты выводишь каждый раз подобным образом? (В начале цикла smile.gif)

for n=1 to 16
if spn(b,n)>0
if button(cool.gif.ghost=0 then hide sprite spn(b,n)
if button(cool.gif.ghost<>0 then set sprite alpha spn(b,n),255-button(cool.gif.alpha
stretch sprite spn(b,n),button(cool.gif.stretch#-button(cool.gif.stretch_x,button(cool.gif.stretch#+button(cool.gif.stretch_y
offset sprite spn(b,n),button(cool.gif.stretch_x,button(cool.gif.stretch_y/5
endif
next n

Если да, то нарисовав надпись один раз и запомнив ее как новый спрайт ты ускоришь свой алгоритм в 16 раз... И эффекты останутся на месте. Если ты не делаешь эффект скачущих букв, но и здесь выгоднее запомнить 3-4 спрайта с готовыми надписями чем каждый раз выводить 16 спрайтов по очереди...


--------------------
Что наша жизнь?
Перейти в начало страницы
 
+Цитировать сообщение
versus
сообщение 10.11.2004, 16:33
Сообщение #7


Digital Mystery
***

Группа: Пользователи
Сообщений: 802
Регистрация: 1.9.2004
Из: Санкт-Петербург
Пользователь №: 9



Цитата(Sha/|/|an @ Nov 10 2004, 04:42 PM)
Versus! Ты не в тему это сообщение расположил! ДБклассик никак не потянет спрайтовых надписей! Поэтому надо было создавать в ДБПро!!  smile.gif
*

Да, малость ступил. sad.gif Я даже и не обратил внимание, в какие функции писал... Да на классик пахать и не будет.


--------------------
:: exclusive reality for you ::

фрОМ раШа виЗ пАнк
Перейти в начало страницы
 
+Цитировать сообщение

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

 



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

2. 15 Defense. Underwater Battle

3. GlaZ в Steam Greenlight