PDA

Просмотр полной версии : Makromedia Direktor


ELEKTRIC
31.03.2006, 15:53
Кто мне мог бы обяснить некоторые аспекты связаные со скриптами.
Меня интересует один скрипт, мне надо что бы мне обьяснили непонятные строки в нем.

Mike
31.03.2006, 20:34
Если я не путаю Macromedia Director, это только редактор, а на чем скрипты?
кинь в личку...

ELEKTRIC
31.03.2006, 20:47
Майк, скрипты на внутреннем языке, но очень похожем на С++, а я не втом не в другом не понимаю, хотя в общем програмировании да.

Могу вывесить здесь этот скрипт.

Mike
01.04.2006, 20:51
я тоже в C мало что смыслю, но ты вывеси, если он не очень здоровый, думаю кто-нибудь поможет...

TYSON
01.04.2006, 20:53
Майк, помоему ты путаешь насчет редактора. Это скорее всего среда разработки (типа Флеша) со встроенным языком сценариев...

Macromedia Director is the proven multimedia authoring tool for professionals. Director combines broad media support for media types, ease of use, high-performance, and an infinitely extendible development environment to deliver rich content and applications for CDs, DVDs, kiosks, and the Internet. Director MX 2004 offers powerful new features, including two scripting languages, DVD-Video support, cross-platform publishing, and Flash MX 2004 integration.

ELEKTRIC
01.04.2006, 21:02
global SysBlock_Flag, CPU_Flag, xq, VideoPlata_Flag, Monitor_Flag, EnterFrame_Flag, yq, CpuCool_Flag, CD_Cover_Flag, Pow_Button_Flag, CD_Play_Flag, SoundPlata, Kolonki_Flag, musicS

on beginSprite me

member("Comp").resetWorld()

member("Comp").model("CpuCool").addChild(member("Comp").model("CpuVentilator"))

Kolonki_Flag = 1
SoundPlata = 1
CD_Play_Flag = 1
Pow_Button_Flag = 1
CD_Cover_Flag = 1
CpuCool_Flag = 1
SysBlock_Flag = 1
CPU_Flag = 1
VideoPlata_Flag = 1
Monitor_Flag = 1
EnterFrame_Flag = 1
yq = 0 -- просто счетчик
xq = member("Comp").camera("DefaultView").fieldOfView

-- Ставим на паузу анимацию объектов.
-- К тем объектам которые анимированы костями добавляем
-- модификатор bonesPlayer иначе анимацией будет невозможно управлять.
member("Comp").model("VideoPlata").keyframePlayer.pause()
member("Comp").model("CPU").keyframePlayer.pause()
member("Comp").model("CpuCool").keyframePlayer.pause()
member("Comp").model("Power_Button").keyframePlayer.pause()
member("Comp").model("MonProvod").addModifier(#bonesPlayer)
member("Comp").model("MonProvod").bonesPlayer.pause()
member("Comp").model("CD_Disk").keyframePlayer.pause()
member("Comp").model("SoundPlata").keyframePlayer.pause()
member("Comp").model("SoundProvod").addModifier(#bonesPlayer)
member("Comp").model("SoundProvod").bonesPlayer.pause()
member("Comp").model("CpuVentilator").keyframePlayer.pause()

end

on mouseUp
mouseTarget = the mouseLoc - point(sprite(2).left, sprite(2).top)

if sprite(2).camera.modelUnderLoc(mouseTarget) = member("Comp").model("SysBlock_Cover") then
-- открываем и закрываем корпус включая анимацию с нужного нам кадра
if SysBlock_Flag =1 then
member("Comp").model("SysBlock_Cover").keyframePlayer.play("SysBlock_Cover-Key",0,0,333,1)
SysBlock_Flag = 2
else
put "close"
member("Comp").model("SysBlock_Cover").keyframePlayer.play("SysBlock_Cover-Key",0,333,666,1)
SysBlock_Flag =1
end if
end if

-- myKeyPress
end

on enterFrame me
myKeyPress
end

on myKeyPress
--поворот слева
if keyPressed("z") then
member("Comp").model("CamDummy").rotate(0,0,2)
end if
--поворот справа
if keyPressed("c") then
member("Comp").model("CamDummy").rotate(0,0,-2)
end if
-- наезд камерой
if keyPressed("d") then
if xq>10 then
xq=xq-1
member("Comp").camera("DefaultView").fieldOfView = xq
end if
end if
-- отъезд камерой
if keyPressed("x") then
if xq<50 then
xq=xq+1
member("Comp").camera("DefaultView").fieldOfView = xq
end if
end if
-- ресет камеры
if keyPressed("r") then
xq=45
member("Comp").camera("DefaultView").fieldOfView = xq
end if
if keyPressed("p") then
go to 0
end if
updateStage()
end

ELEKTRIC
01.04.2006, 21:03
Что то он большой получился....... :(

Ну вот вообщем то.... ассобенно то что выделено красным!

Mike
03.04.2006, 00:10
я так опнимаю это для написания скриптовых оболочек типа Demo Shield, по поводу скрипта, выделенной части, не вникая в детали, могу попробовать немного пояснить...
...если анализируя очень поверхностно, то в том что помеченно красным выполняется условие и присваиваний информации к семейству объектов.

Условие построено на основе переключения. И при его выполнении инвертирует содержимое флага.
т.е. если содержимое переменной SysBlock_Flag = 1 выполняется первое условие (if SysBlock_Flag =1 then), происходит присванивание к семейству объектов member("Comp"), ключу "SysBlock_Cover-Key" значение "0,0,333,1"
а затем происходит переключение SysBlock_Flag в значение 2, и выход из условия,

при следующем проходе этого условия, условие не совпадет, и тогда выполнятся комманды, стоящие пеосле оператора else, и так же перейдет переключение во SysBlock_Flag = 1 (т.е. то самое инвертирование о котором я говорил).

TYSON
03.04.2006, 00:58
А я думал ты в ОО программировании шаришь...

Условие построено на основе переключения. И при его выполнении инвертирует содержимое флага.
т.е. если содержимое переменной SysBlock_Flag = 1 выполняется первое условие (if SysBlock_Flag =1 then), происходит присванивание к семейству объектов member("Comp"), ключу "SysBlock_Cover-Key" значение "0,0,333,1"

Бред, извиняюсь, голимый ...


Итак, исходная строка:
member("Comp").model("SysBlock_Cover").keyframePlayer.play("SysBlock_Cover-Key",0,0,333,1)

здесь вызывается метод play объекта member("Comp").model("SysBlock_Cover").keyframePlayer которому передаются параметры "SysBlock_Cover-Key",0,0,333,1 (целых 5 штук, один стринговый и четыре числовых)

А вообще в комментах там написано, что там в реале происходит:
-- открываем и закрываем корпус включая анимацию с нужного нам кадра

Условие построено на основе переключения.

В условии есть алгоритм инвертирования флага и не более. Основано оно (условие) на сравнении

TYSON
03.04.2006, 02:10
скрипты на внутреннем языке, но очень похожем на С++,


Славка, этот язык по синтаксису вообще не похож на С++.
Скорее больше на VB.

Di_Moon
03.04.2006, 09:39
Скажу даже больше, красным цветом выделена банальная проверка состояний. Причем так делают только начинающие кодеры (т.к. это самый тривиальный способ) и законченые профессионалы (только все отличие у них - они использут для флагов состояния true и false).

По правильному былобы проверять состояние объекта и после этого решать что с ним делать. (Вариант с флагами плох тем, что со временем он может разростись, при этом будет кушаться до фига памяти.... :) )

Общий смысл выделенного куска - когда дверь закрыта, то при наведении мышки мы ее откроем, а когда закрыта - то наоборот.

Анализируя дальше скажу, что проигрывание открытия идет с 0 по 333 кадр сцены этой двери (которая судя по всему зовется SysBlock_Cover-Key), а закрытие с 333 по 666.

Осталось выяснить только зачем нужны параметры 2 и 5 функции play. 8)

ELEKTRIC
03.04.2006, 12:44
Блиииин Люди да вы просто гениииииии!!!!!!!!!!!!!!!!!!!

Ни фигасе!!! По коду узнать что там происходит!!!!! Вот это да! (упал ниц, перед вами и начал молиться) :D :D


Вообщем:
Это сцена сделаная в 3д максе, в ней стол на нем комп с монитором, рядом лежат проц, кулер, вентилятор, звукавуха, видюха, СД диск, колонки со шнуром.
Каждый предмет анимирован, тоесть бонально встает в системный блок.

Эта сцена сохранена в Shockwave 3D scene (W3D) и импортирована в Директор.

Я её взял за основу к своему проекту, но для того чтобы мне понять что и как, мне надо знать почему здесь именно так а не иначе (надобыло в универе учить програмирование)

Например у меня вопрос:
global SysBlock_Flag, CPU_Flag, xq, VideoPlata_Flag, Monitor_Flag, EnterFrame_Flag, yq, CpuCool_Flag, CD_Cover_Flag, Pow_Button_Flag, CD_Play_Flag, SoundPlata, Kolonki_Flag, musicS
Зачем всем обьектам присвоено глобальная...... что? Переменная?


Вот здесь все понятно:
---поворот слева
if keyPressed("z")then ---- если нажать "z" то
member("Comp").model("CamDummy").rotate(0,0,2) --- сцена "сomp" и модель "CamDummy" будет поворачиваться на 2 градуса по оси Z
end if ---- конец иначе

А вот здесь еще используется счетчик для чего?

-- наезд камерой
if keyPressed("d") then
if xq>10 then
xq=xq-1
member("Comp").camera("DefaultView").fieldOfView = xq
end if
end if

ELEKTRIC
03.04.2006, 12:49
скрипты на внутреннем языке, но очень похожем на С++,


Славка, этот язык по синтаксису вообще не похож на С++.
Скорее больше на VB.



Я просто скачал учебник по Директору, думал что там про скриптинг подробно будет, а там так очень поверхостно!
Ну и там сказано что он очень похож на С++ и тем кто на С++ умеет , изучить внутренний язык Директора не составит труда!

Di_Moon
03.04.2006, 12:56
Например у меня вопрос:
global SysBlock_Flag, CPU_Flag, xq, VideoPlata_Flag, Monitor_Flag, EnterFrame_Flag, yq, CpuCool_Flag, CD_Cover_Flag, Pow_Button_Flag, CD_Play_Flag, SoundPlata, Kolonki_Flag, musicS
Зачем всем обьектам присвоено глобальная...... что? Переменная?
Не совсем.... Все что имеет в своем названии flag просто напрасто является флагами состояний (как с дверцой, например. Ну и плюс так рекомендует венгерская нотация :)) в global они определены чтобы у них было одно и тоже значение во всем коде (например чтоб эти флаги не передевать в качестве параметров к функциям, и не яб...ся потом с их сменой....)


А вот здесь еще используется счетчик для чего?

-- наезд камерой
if keyPressed("d") then
if xq>10 then
xq=xq-1
member("Comp").camera("DefaultView").fieldOfView = xq
end if
end if

Ну тоже все просто... в xq 99% хранится текущее растояние от объекта до камеры. И данным счетчиком получается плавный наезд и камера должная остановится хогда xq будет равно 10. (т.е. блокируют чтоб камера в объект не въехала)

ELEKTRIC
03.04.2006, 13:16
Про наезд все понятно!!!!!!!!! Спасибо!!!! Блин как все просто.....

А про флаги:
Там флаг меняется на 2 и используется else для того что бы его закрыть. Тоже понятно, по тому что вот сдесь:
-- устанавливаем видеоплату
if sprite(2).camera.modelUnderLoc(mouseTarget) = member("Comp").model("VideoPlata") then
if SysBlock_Flag = 2 then
member("Comp").model("VideoPlata").keyframePlayer.play()
VideoPlata_Flag = 2
end if
end if

Нету строки с использованием еlse и значит видюху больше не вынуть!!!!

ELEKTRIC
03.04.2006, 13:18
А вот это что за строка?
on mouseUp
mouseTarget = the mouseLoc - point(sprite(2).left, sprite(2).top) я так понял что это захват мышкой, а что такое sprite?

if sprite(2).camera.modelUnderLoc(mouseTarget) = member("Comp").model("SysBlock_Cover") then

Di_Moon
03.04.2006, 13:30
А про флаги:
Там флаг меняется на 2 и используется else для того что бы его закрыть. Тоже понятно, по тому что вот сдесь:
-- устанавливаем видеоплату
if sprite(2).camera.modelUnderLoc(mouseTarget) = member("Comp").model("VideoPlata") then
if SysBlock_Flag = 2 then
member("Comp").model("VideoPlata").keyframePlayer.play()
VideoPlata_Flag = 2
end if
end if

Нету строки с использованием еlse и значит видюху больше не вынуть!!!!

А тут немного другое...
Посмотри на код выше что ты давал. Здесь идет обработка следующего характера: Если системник открыт (SysBlock_Flag) то анимируем видяху, и естанавливаем флаг VideoPlata_Flag в состояние, что видяха воткнута. Соответсвенно где-то дальше должна быть обратная хреновина :)

А вот это что за строка?
on mouseUp
mouseTarget = the mouseLoc - point(sprite(2).left, sprite(2).top) я так понял что это захват мышкой, а что такое sprite?

if sprite(2).camera.modelUnderLoc(mouseTarget) = member("Comp").model("SysBlock_Cover") then

sprite скорее всего какой-то общий объект, - надо справку смотреть ;)
Работу алгоритмаов рассказать я могу, а вот чтоб сказать что каждай объект значит - надо в маны лезть смотреть.....

А тут делается следующее - обрабатывается событие на движение мыши, и смотрится, в данном случае, если курсор на оболочкой системника то будем делать......

ELEKTRIC
03.04.2006, 13:39
Соответсвенно где-то дальше должна быть обратная хреновина :)


нет нету, да видно и не нужно ему было. Но главное понятно!!!!

А тут делается следующее - обрабатывается событие на движение мыши, и смотрится, в данном случае, если курсор на оболочкой системника то будем делать......


Ага! Понял тоесть из обьекта какбы вынута зона в которой действует курсор мыши!!!! Понял! А я то думаю..... ну теперь все понятно!

Димун могу прислать исходники.... ну так для интересу.... если хочешь!

Спасибо! Если что еще обраащусь к вам!

TYSON
03.04.2006, 13:50
Во, ДИмун все проанализировал уже и раскатал. Респект!
С флагами конечно не совсем так все обстоит, но это не важно ;)

Mike
03.04.2006, 20:23
Димуныч рулит, когда не ленится,
Так что обращайтесь, Вячеслав :)

artem
27.04.2006, 17:54
Димо МОЗГ тока я все равно нифига не понел)) потому что
даже никасался,а вот читал с интересом весь топ