forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   FAQ по B3D (http://forum.boolean.name/showthread.php?t=4251)

jimon 15.01.2008 08:49

Ответ: FAQ по B3D
 
NovICE
Код:

If KeyDown(17) Then
действия по анимации
Else
действия чтобы остановить анимацию
End if


avel 15.01.2008 20:29

Ответ: FAQ по B3D
 
да нет jimon, ты не прав... вернее логически-то ты прав, но только средствами блица так не прокатит... там надо немного иначе обрабатывать.

Diplomat 15.01.2008 20:57

Ответ: FAQ по B3D
 
2avel: Средствами Блица так прокатит замечательно.
Хоть бы так, к примеру:
Код:

IF KEYDOWN(17)=1 THEN

 IF AnimFlag=0 THEN
 AnimFlag=1
 Animate Object
 ;...etc...
 ENDIF

ELSE

 IF AnimFlag=1 THEN
 AnimFlag=0
 Animate Object,0
 ;...etc...
 ENDIF
 
ENDIF


avel 15.01.2008 22:59

Ответ: FAQ по B3D
 
Diplomat ладно, признаю. прокатит.
я просто имел ввиду, что если, просто, написать внутри Animate, то толку не будет... Все равно надо вводить переменную-флаг. а jimon этого не указал. Думаешь до новичков дойдет, что там надо ее написать? я думаю, что нет. именно это я и имел ввиду. а то, что это можно реализовать я и сам знаю. и давно уже указал как... просто, некоторые плохо читают темы...
да и все-равно этот вариант как-то через Ж... слишком много условий...
ИМХО мой вариант проще... хотя бы не надо лишней переменной...
для множества моделей в твоем случае прийдется массив задавать для одних только флагов... хотя, конечно, это кому как удобнее. посему я и указал, что вариантов много...
вот, решил все же продублировать...
Цитата:

вопрос: при использовании команды Animate объект начинает двигаться ни тогда, когда нажата клавиша, а когда она отпускается. почему?
ответ: когда ты пишешь в главном цикле if KeyDown(...) Animate ... блиц запускает эту команду постоянно, когда ты нажимаешь клавишу, а надо ее запустить один раз. решение: используй KeyHit()(это мой вариант), либо введи переменну-флаг(это то, что предложил ты). примерно так:

If speed#=0 Then Animate меш,0
If KeyHit(17)=True Or KeyHit(31)=True Then Animate меш,1
вообще принцип везде один...

Diplomat 16.01.2008 01:28

Ответ: FAQ по B3D
 
Такое количество ветвлений необходимо. Более того, логичным решением в сколь-нибудь более серьезной ситуации было бы вынести модуль анимаций в отдельную функцию. Но в условном случае данного простейшего примера это было бы все таки не вполне целесообразно.
А насчет твоего решения... Если представить ситуацию, когда обьект должен иметь несколько различных анимационных последовательностей и не замирать намертво при остановках, а проявлять признаки жизнедеятельности, то оно теряет свою прелесть. А так- для примера конечно может жить. )

avel 16.01.2008 01:49

Ответ: FAQ по B3D
 
Diplomat да я этим примером и не претендую на что-то серьезное... это простейший случай, тупо для разъяснения общего принципа. понятно, что для чего-то серьезного надо писать систему управления анимацией. а вот насчет нескольких анимационных последовательностей, я с тобой не соглашусь, ибо при очень незначительной модификации все отлично работает. собственно, твой вариант, в том виде, как оно есть сейчас, тоже расчитан на одну анимацию. оно и понятно, ведь у тебя, как и у меня это лишь пример, для новичков, в котором убрано все лишнее для большей читабельности и понятливости. думаю, что оба варианта вполне жизнеспособны! главное, чтобы у того, кто их пользует руки были прямые... :)

tormoz 16.01.2008 02:04

Ответ: FAQ по B3D
 
в маленькой аркадке функция управления анимацией занимает 230 строк.
Там сам черт ногу сломит.
:)))

Нужно пользоваться переменными . тогда все просто

Код:

he\a_seq=AnimSeq (he\en)

управление:
If sit_key Or he\pickup

    If up_key Or down_key
        he\mode=1:he\speed=max*1.25:he\seq=roll:he\tran=10
    Else
        If  (he\seq<>roll)Or(he\seq=roll And AnimTime(he\en)>=13)
          he\mode=1:he\speed=.5:he\seq=sit:he\tran=10   
        EndIf 
    EndIf
   
     
Else
    If  (he\seq<>roll)Or(he\seq=roll And AnimTime(he\en)>=13)
    If up_key  Or down_key
        he\mode=1:he\speed=max*1.25:he\seq=run_up:he\tran=10
    EndIf
    EndIf
EndIf
.....

анимация:

If he\seq<>he\a_seq
  Animate he\en,he\mode,he\speed,he\seq,he\tran
EndIf 

какая то пост-обработка:

If he\seq=jump
    If AnimTime# (he\en)>=19
      he\mode=2:he\speed=.15:he\seq=jump_as:he\tran=20
  EndIf
EndIf
If he\seq=jump2
    If AnimTime# (he\en)>=13
      he\mode=2:he\speed=.15:he\seq=jump_as:he\tran=20
  EndIf
EndIf

весь код для примеры вырван из реального проекта. конечно это малые кусочки большой функции.
Главное - понять принцип
Он удобен

Crayzi 16.01.2008 12:16

Re: FAQ по B3D
 
Вопрос: Как пользоватся командами - "таймер1 = CreateTimer("длительность"), WaitTimer("таймер1") , FreeTimer("таймер1") ".
Сколько не эксперементировал, нечего путнего не вышло...

moka 16.01.2008 12:19

Ответ: FAQ по B3D
 
Crayzi, в справке блица, есть примеры для работы с этими функциями.

H@NON 16.01.2008 13:30

Ответ: FAQ по B3D
 
попробуй создай таймер Createtimer(200) и помести команду Waittimer() в цикл перед Renderworld(), сразу поймешь как это работает, а значит и научишься как ими пользоваться. В общем говоря, это таймер который затормаживает работы программы на установленное время ( в миллисекундах ).

HolyDel 16.01.2008 13:33

Ответ: FAQ по B3D
 
хм. имхо одна из бесполезнейших команд.
Delay(200) сделает то же самое. или, имеется ввиду на 200мс с последнего вызова?

Diplomat 16.01.2008 14:29

Ответ: FAQ по B3D
 
Нет, сравнивать таймер с задержкой- нельзя.
Таймер- есть самый простой, наиболее стабильный и наименее затратный по ресурсам из существующих ныне способов стабилизации ФПС в Блице. Можно сказать, что он является одним из лучших способов синхронизации.
Копий на этот счёт сломано немало, но факт остаётся фактом: для маленькой игры таймер предпочтительней любых других методов синхронизации.
Delay методом синхронизации очевидно не является.

Createtimer(200) создавать не стОит. Диапазон оптимальных значений для таймера- 30-40. В крайнем случае- 25-60. Кроме того, для придания эксперименту чистоты логично выключить вертикальную синхронизацию.

HolyDel 16.01.2008 14:35

Ответ: FAQ по B3D
 
Цитата:

или, имеется ввиду на 200мс с последнего вызова?
получается таймер эквивалентен:

while a_time+30>millisecs()
wend
a_time=millisecs()

?

Diplomat 16.01.2008 15:12

Ответ: FAQ по B3D
 
Ну, почти. Во-первых, таймеру указывается желаемый ФПС, а не желаемая задержка; во-вторых, таймер просто останавливает выполнение программы, уменьшая ФПС до нормы, а не глушит систему намертво пустым циклом для этих же целей; и в-третьих... гм.. в нем меньше букафф. ))

Raiter 16.01.2008 15:27

Ответ: FAQ по B3D
 
Да. Таймер полезная функция. У себя в игрушке (небольшая аркада) я им и пользуюсь. Ограничиваю FPS до 60.


Часовой пояс GMT +4, время: 11:01.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot