Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 15.01.2008, 08:49   #91
jimon
 
Сообщений: n/a
Ответ: FAQ по B3D

NovICE
If KeyDown(17) Then
действия по анимации
Else
действия чтобы остановить анимацию
End if
 
Ответить с цитированием
Старый 15.01.2008, 20:29   #92
avel
Бывалый
 
Аватар для avel
 
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений
(для 452 пользователей)
Ответ: FAQ по B3D

да нет jimon, ты не прав... вернее логически-то ты прав, но только средствами блица так не прокатит... там надо немного иначе обрабатывать.
(Offline)
 
Ответить с цитированием
Старый 15.01.2008, 20:57   #93
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
Ответ: 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

Последний раз редактировалось Diplomat, 15.01.2008 в 21:04.
(Offline)
 
Ответить с цитированием
Старый 15.01.2008, 22:59   #94
avel
Бывалый
 
Аватар для avel
 
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений
(для 452 пользователей)
Ответ: 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
вообще принцип везде один...

Последний раз редактировалось avel, 15.01.2008 в 23:12.
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 01:28   #95
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
Ответ: FAQ по B3D

Такое количество ветвлений необходимо. Более того, логичным решением в сколь-нибудь более серьезной ситуации было бы вынести модуль анимаций в отдельную функцию. Но в условном случае данного простейшего примера это было бы все таки не вполне целесообразно.
А насчет твоего решения... Если представить ситуацию, когда обьект должен иметь несколько различных анимационных последовательностей и не замирать намертво при остановках, а проявлять признаки жизнедеятельности, то оно теряет свою прелесть. А так- для примера конечно может жить. )
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 01:49   #96
avel
Бывалый
 
Аватар для avel
 
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений
(для 452 пользователей)
Ответ: FAQ по B3D

Diplomat да я этим примером и не претендую на что-то серьезное... это простейший случай, тупо для разъяснения общего принципа. понятно, что для чего-то серьезного надо писать систему управления анимацией. а вот насчет нескольких анимационных последовательностей, я с тобой не соглашусь, ибо при очень незначительной модификации все отлично работает. собственно, твой вариант, в том виде, как оно есть сейчас, тоже расчитан на одну анимацию. оно и понятно, ведь у тебя, как и у меня это лишь пример, для новичков, в котором убрано все лишнее для большей читабельности и понятливости. думаю, что оба варианта вполне жизнеспособны! главное, чтобы у того, кто их пользует руки были прямые...
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 02:04   #97
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: 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
весь код для примеры вырван из реального проекта. конечно это малые кусочки большой функции.
Главное - понять принцип
Он удобен
__________________
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 12:16   #98
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Re: FAQ по B3D

Вопрос: Как пользоватся командами - "таймер1 = CreateTimer("длительность"), WaitTimer("таймер1") , FreeTimer("таймер1") ".
Сколько не эксперементировал, нечего путнего не вышло...
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 12:19   #99
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: FAQ по B3D

Crayzi, в справке блица, есть примеры для работы с этими функциями.
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 13:30   #100
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: FAQ по B3D

попробуй создай таймер Createtimer(200) и помести команду Waittimer() в цикл перед Renderworld(), сразу поймешь как это работает, а значит и научишься как ими пользоваться. В общем говоря, это таймер который затормаживает работы программы на установленное время ( в миллисекундах ).
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Crayzi (17.01.2008)
Старый 16.01.2008, 13:33   #101
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: FAQ по B3D

хм. имхо одна из бесполезнейших команд.
Delay(200) сделает то же самое. или, имеется ввиду на 200мс с последнего вызова?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Crayzi (17.01.2008)
Старый 16.01.2008, 14:29   #102
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
Ответ: FAQ по B3D

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

Createtimer(200) создавать не стОит. Диапазон оптимальных значений для таймера- 30-40. В крайнем случае- 25-60. Кроме того, для придания эксперименту чистоты логично выключить вертикальную синхронизацию.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Crayzi (17.01.2008)
Старый 16.01.2008, 14:35   #103
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: FAQ по B3D

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

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

?
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 15:12   #104
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
Ответ: FAQ по B3D

Ну, почти. Во-первых, таймеру указывается желаемый ФПС, а не желаемая задержка; во-вторых, таймер просто останавливает выполнение программы, уменьшая ФПС до нормы, а не глушит систему намертво пустым циклом для этих же целей; и в-третьих... гм.. в нем меньше букафф. ))
(Offline)
 
Ответить с цитированием
Старый 16.01.2008, 15:27   #105
Raiter
Гигант индустрии
 
Регистрация: 04.08.2006
Сообщений: 2,642
Написано 53 полезных сообщений
(для 92 пользователей)
Ответ: FAQ по B3D

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


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com