XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Помогите доработать код
Сделал шумаштуку, желаю чтоб имитировала текст рукописный, а она не слушается. Основные три проблемы:
1. После запуска, текст пишется медленней, курсор мигает, а спустя 20-25 символов, начинает работать как положено. Как можно откорректировать?
2. Функция не умеет выводить несколько текстов одновременно, а хотелось бы…
3. Пытался сделать своего рода титры: чтобы, после 50 символов, написанный текст перемещался на одну строчку вверх, при это целостность слов не должна нарушаться.
Давайте подумаем вместе.
» раскрыть
Код:
globals
    trigger TMS = CreateTrigger()
endglobals

library TMS initializer Initialization

globals
    private code tms_function
    private timer tms_timer = CreateTimer()
    private integer count = 0
    private constant string cursor = "_"
    private tms array ms
endglobals

struct tms
    private player p
    private string s
    private real x
    private real y
    private real d
    private real v
    private integer i
    private integer n
    private integer k

    static method CreateText takes player id, real x, real y, real duration, real period, string message returns nothing
        local tms this = tms.create()
        set .p = id
        set .s = message
        set .x = x
        set .y = y
        set .d = duration
        set .v = period
        set .n = 1
        set .k = StringLength(.s)
        call .AddObject()
    endmethod

    method PrintText takes nothing returns nothing
        if (.n < .k) then
            if (.p == GetLocalPlayer()) then
                call ClearTextMessages()
            endif
            call DisplayTimedTextToPlayer(.p, .x, .y, .d, SubString(.s, 0, .n + 1) + cursor)
            set .n = .n + 1
        else
            call .DeleteObject()
            call .destroy()
        endif
    endmethod

    private method AddObject takes nothing returns nothing
        if (count == 0) then
            call TimerStart(tms_timer, .v, true, tms_function)
        endif
        set ms[count] = this
        set .i = count
        set count = count + 1
    endmethod

    private method DeleteObject takes nothing returns nothing
        set count = count - 1
        set ms[.i] = ms[count]
        set ms[.i].i = .i
        if (count == 0) then
            call PauseTimer(tms_timer)
        endif
    endmethod

endstruct

private function Timer takes nothing returns nothing
    local integer i = count - 1
    loop
        call ms[i].PrintText()
        exitwhen i == 0
        set i = i - 1
    endloop
endfunction

private function Initialization takes nothing returns nothing
    set tms_function = function Timer
endfunction

function DisplayPrintTextForPlayer takes player id, real x, real y, real duration, real period, string message returns nothing
    call tms.CreateText(id, x, y, duration, period, message)
endfunction

endlibrary
Старый 01.06.2009, 16:51
J
expert
offline
Опыт: 48,447
Активность:
» поправка
Код:
method PrintText takes nothing returns nothing
        if (.n <= .k) then
            if (.p == GetLocalPlayer()) then
                call ClearTextMessages()
            endif
            call DisplayTimedTextToPlayer(.p, .x, .y, .d, SubString(.s, 0, .n) + cursor)
            set .n = .n + 1
        else
            call .DeleteObject()
            call .destroy()
        endif
    endmethod

и какойто не очень удачный алгоритм для этого, ща тебе напишу получше, сек...

J добавил:
» code
Код:
globals
    trigger TMS = CreateTrigger()
endglobals

library TMS initializer Initialization

struct Text
    static constant integer maxlengthstring = 256
    string array PartStr[.maxlengthstring]
    integer Length

    static method CreateText takes string message returns Text
        local Text this
        local integer i
        local integer len = StringLength(message)
        if (len > .maxlengthstring) then
            return 0
        endif
        set this = Text.create()
        set .Length = len
        set i = len
        loop
            set .PartStr[i - 1] = SubString(message, 0, i)
            exitwhen i  == 1
            set i  = i  - 1
        endloop
        return this
    endmethod
endstruct


globals
    private code tms_function
    private timer tms_timer = CreateTimer()
    private integer count = 0
    private constant real periodtimer = 0.1
    private constant string cursor = "_"
    private PrintText array alltps
endglobals

struct PrintText
    private player p
    private real x
    private real y
    private real d
    private integer i
    private integer n
    private Text tex

    private method AddObject takes nothing returns nothing
        if (count == 0) then
            call TimerStart(tms_timer, periodtimer, true, tms_function)
        endif
        set alltps[count] = this
        set .i = count
        set count = count + 1
    endmethod

    private method DeleteObject takes nothing returns nothing
        set count = count - 1
        set alltps[.i] = alltps[count]
        set alltps[.i].i = .i
        if (count == 0) then
            call PauseTimer(tms_timer)
        endif
    endmethod
    
    method Print_Timer takes nothing returns nothing
        if (.n < .tex.Length) then
            if (.p == GetLocalPlayer()) then
                call ClearTextMessages()
            endif
            call DisplayTimedTextToPlayer(.p, .x, .y, .d, .tex.PartStr[.n] + cursor)
            set .n = .n + 1
        else
            call .DeleteObject()
            call .destroy()
        endif
    endmethod
    
    static method Print takes player id, real x, real y, real duration, Text tex returns nothing
        local PrintText this = PrintText.create()
        set .p = id
        set .x = x
        set .y = y
        set .d = duration
        set .n = 1
        set .tex = tex
        call .AddObject()
    endmethod

endstruct

private function Timer takes nothing returns nothing
    local integer i = count - 1
    loop
        call alltps[i].Print_Timer()
        exitwhen i == 0
        set i = i - 1
    endloop
endfunction

private function Initialization takes nothing returns nothing
    set tms_function = function Timer
endfunction

endlibrary

используется таг:
причем текст может быть создан когда угодно, хоть в начале игры, но текстов может в один момент времени быть е больше 32-ух, много строчность делается через симовл '\n'
Код:
local Text t = Text.CreateText("1jass 2jass 3jass 4jass 5jass 6jass\n7jass 8jass 9jass 10jass 11jass 12jass")
call PrintText.Print(Player(0), 0, 0, 20, t)
call t.destroy()

Отредактировано J, 01.06.2009 в 18:37.
Старый 01.06.2009, 18:31
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Спасибо за помощь Jon. Пойду изучать.
Тему пожалуйста не закрывайте, на случай, если появятся еще вопросы, или кто-нибудь что-нибудь захочет добавить.
Старый 02.06.2009, 13:44
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Толком просмотреть код времени пока нет. Хочу уточнить.
  1. Чем обусловлена максимальная длинна строки в 256 символов?
  2. Количество одновременно показанных текстов не должно превышать 32 поскольку 256*32=8192? Если так, какая связь?
  3. Возможно это сбой JNGP. Тестировал четыре раза, один раз вообще ничего не показал, в остальных случаях выводил один (первый) текст, остальные игнорировал.
Старый 04.06.2009, 15:35
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
Чем обусловлена максимальная длинна строки в 256 символов?

Переменная типа "Строка"(String)
Старый 04.06.2009, 16:13
J
expert
offline
Опыт: 48,447
Активность:
Линкольн одновременно выводить несколько тестов нельзя, они будут работать но будут мелькать, само заменяясь, вот для разных игроков можно одновременно выводить разный текст
величина строка в 256 обусловлена маленькой размерность массива в варе, ты можешь поменять длину, измени переменную
Код:
static constant integer maxlengthstring = 256
на любое другое чило и все будет работать, однако тогда количество возможных текстов которые может быть созданы( не отображены а именно просто созданы ) будет 8192/maxlengthstring, сейчас при длине 256 это 32 текста
создание текта это заполнение указного в нем массива строк указной строкой каждый раз наращивая символ, т.е. это оптимально потому что когда будет выводится текст, не будет использоваться субстринг, они просто будут выводится из массива по порядку...
Старый 04.06.2009, 16:14
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Благодарю товарищи. Вопросов больше не имею. Тему можно закрывать.
Старый 05.06.2009, 09:11
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:02.