Wintermute Engine Forum

Russian forum - Форум на русском => Технический форум => Topic started by: kalumb on June 07, 2013, 06:44:14 AM

Title: С?ылка на ?крипт
Post by: kalumb on June 07, 2013, 06:44:14 AM
Здрав?тв?йте! У меня возникла такая проблема:
При нажатии на объект ? меня выходит меню?ка. Мне н?жно, чтобы к этой меню?ке прикреплял?я ?крипт активного объекта. Как мне ?делать так, чтобы ??ылка на ?крипт объекта в?тавляла?ь автоматиче?ки, то е?ть вот:
Code: WME Script
  1. MenuObject = Game.ActiveObject;
  2. WinMenu.AttachScript("Сюда должна в?тавлять?я ??ылка на ?крипт объекта");
  3.  
Помогите, пожал?й?та.
Title: Re: С?ылка на ?крипт
Post by: 2.0 on June 07, 2013, 06:53:48 AM
Е?ли я правильно понял вопро?, то, похоже, никак. Скрипт тек?щего объекта нигде изначально не пропи?ывает?я, т.е. его нельзя извлечь из какой-то переменной.
Придет?я или ?о?тавлять ?пи?ок ?оответ?твий "объект-?крипт", или прид?мывать ?нивер?альное ре?ение, например, в?е ?крипты таких объектов лежат в одной папке и имеют такое же название, как и имя объекта. Т.е. что-то вроде:

Code: WME Script
  1. MenuObject = Game.ActiveObject;
  2. WinMenu.AttachScript("П?ть к папке" + MenuObject.Name + ".script");
Title: Re: С?ылка на ?крипт
Post by: kalumb on June 07, 2013, 07:03:34 AM
Второй вариант я и ?ам хотел ?делать. У меня такая задача. При нажатии на объект появляет?я меню ? кнопками (?верх? вниз). Примерное название кнопок: О?мотреть, Взять, Принюхать?я, Оторвать. То е?ть дей?твия. При чём ? разных объектов они разные. Когда жмём на одн? из кнопок, выполняет?я это дей?твие. Дей?твия ? меня пропи?аны в ?крипте объекта. Может е?ть др?гой вариант такое реализовать.
Title: Re: С?ылка на ?крипт
Post by: 2.0 on June 07, 2013, 08:09:24 AM
Можно такой вариант попробовать.
В ?крипте каждого объекта назвать каждое дей?твие Action1, Action2 и т.д. Вызывать их или ? помощью методов, или ? помощью ?обытий, неважно.
Н? т.е. Object.Action1() или там Object.ApplyEvent("Action1");

В этом же ?крипте пропи?ать ?оответ?твие межд? дей?твием и его названием.

Code: WME Script
  1. var Actions = new Array("О?мотреть", "Взять", ...);

Соответ?твенно, Action1 делает "О?мотреть", Action2 - "Взять" и т.д.

Затем в меню (окно) передавать ?ам объект

Code: WME Script
  1. WinMenu.Caller = MenuObject;

? в ?крипте окна ?знавать название для кнопок, извлекая их из параметров Caller'а.

Code: WME Script
  1. var Caller = this.Caller;
  2. var Actions = Caller.Actions;
  3.  
  4. for (var i=0; i<Actions.Length; i=i+1)
  5. {
  6.   var Button = this.GetControl("Button"+i); // Е?те?твенно, в?е такие кнопка в окне должны при??т?твовать.
  7.   Button.Text = Actions[i];
  8. }

Кнопки можно ?оздавать и динамиче?ки, или можно делать имеющие?я видимыми/невидимыми - в зави?имо?ти от того, ?колько дей?твий ? объекта. Но это в?е нюан?ы.

Затем в этом же ?крипте

Code: WME Script
  1. on "Button1"
  2. {
  3.   Caller.Action1();
  4. }
  5.  
  6. on "Button2"
  7. {
  8.   Caller.Action2();
  9. }

и т.д.

Второй вариант я и ?ам хотел ?делать. У меня такая задача. При нажатии на объект появляет?я меню ? кнопками (?верх? вниз). Примерное название кнопок: О?мотреть, Взять, Принюхать?я, Оторвать. То е?ть дей?твия. При чём ? разных объектов они разные. Когда жмём на одн? из кнопок, выполняет?я это дей?твие. Дей?твия ? меня пропи?аны в ?крипте объекта. Может е?ть др?гой вариант такое реализовать.
Title: Re: С?ылка на ?крипт
Post by: kalumb on June 07, 2013, 06:39:54 PM
Так же хотел ?делать вывод ? циклом. Только ? меня в ?крипте ? объектом было вот это:
Code: WME Script
  1. global MenuObjectV;
  2. MenuObjectV[0] = "osmotr";
  3. MenuObjectV[1] = "sest";
  4.  
  5. on "Osmotr"
  6. {
  7. actor.Talk("Реплика...");
  8. }
  9.  
  10. on "sest"
  11. {
  12. actor.Talk("Реплика...");
  13. }
? ве?ь о?тальной код в game.script.
Вы можете мне немного поподробней ра?пи?ать к?да какой код впи?ывать. Например, вывод кнопок я и ?ам ?делаю. Вот только к?да это в?ё в?тавлять. У меня это окно выходит при нажатии на ЛКМ. ? ещё, е?ли я ?оздаю динамиче?кие кнопки, мне их надо ?далять по?ле закрытия меню? ?ли они ?ами ?ходят?
Title: Re: С?ылка на ?крипт
Post by: 2.0 on June 08, 2013, 02:40:18 AM
Е?ли ты пробовал разобрать?я в моем примере, и в?тавил в?е к?да надо (как ниже опи?ано), и оно не заработало - это из-за о?ибки, ?м. ниже.
Ч?ть доработал о?тальной код.

В ?крипте объекта:

Code: WME Script
  1. // В предыд?щем ?ообщении неверно определил переменн?ю - через var. ? н?жно так как зде?ь, чтобы о?тальной код работал
  2. this.Actions = new Array("О?мотреть", "Взять");
  3.  
  4. method Action1()
  5. {
  6.   // Зде?ь код выполнения первого эк?ена, "О?мотреть"
  7. }
  8.  
  9. method Action2()
  10. {
  11.   // Зде?ь код выполнения второго эк?ена, "Взять"
  12. }

В game.script:

Code: WME Script
  1. global MenuObject;
  2.  
  3. on "LeftClick"
  4. {
  5.   // В?тавить в ?оответ?тв?ющем ме?те обработчика
  6.   MenuObject = Game.ActiveObject; // Предполагает?я, что кликн?ли по этом? объект? и открыли окно [b]WinMenu[/b], так?
  7. }

В ?крипте окна WinMenu:

Code: WME Script
  1.     global MenuObject;
  2.     var Actions = MenuObject.Actions;
  3.      
  4.     for (var i=0; i<Actions.Length; i=i+1)
  5.     {
  6.       var Button = this.GetControl("Button"+i); // Е?те?твенно, в?е такие кнопки в окне должны при??т?твовать.
  7.       Button.Text = Actions[i];
  8.     }
  9.    
  10.     on "Button1"
  11.     {
  12.       MenuObject.Action1();
  13.     }
  14.      
  15.     on "Button2"
  16.     {
  17.       MenuObject.Action2();
  18.     }

Вроде так.

Динамиче?кие кнопки "и?чезн?т" по?ле ?даления окна. При этом Close() не ?даляет окно, про?то делает его невидимым, т.е. то же ?амое, что и SomeWindow.Visible = false. Зде?ь таит?я хоро?ий и?точник для memory leak - е?ли закрыть окно через Close() и повторно открывать его через Game.LoadWindow(), то каждый раз б?дет ?оздавать?я новый экземпляр окна без ?даления ?тарого. Так что е?ли окно по?ле ?воего закрытия ничего не делает (т.е. ?крипт окна не работает в "невидимом" режиме), л?ч?е окно закрывать через Game.UnloadObject().
При ?лед?ющей загр?зке окна динамиче?ких кнопок не б?дет, их потреб?ет?я ?оздать заново. Но окно б?дет каждый раз гр?зить?я (ч?ть доль?е открывать?я), на ?лабых ма?инах это может быть заметно (а может и не быть, зави?ит от окна и количе?тва объектов в нем). Е?ли закрыть окно через Close() и открыть через ??тановк? параметра Visible в true, ?озданные динамиче?кие кнопки о?тан?т?я на ме?те.
Title: Re: С?ылка на ?крипт
Post by: kalumb on June 08, 2013, 12:40:23 PM
Когда я пробовал ва? первый вариант ? меня ничего не выдавало, но и ничего не работало, а может и работало. У меня про?то не было кнопок в окне.
Теперь про второй вариант. Там кнопки должны начитать?я ? Button0, т.к. ма??ив ведёт от?чёт ? н?ля. Но это не ?амое главное. У меня в?ё работает, только я никак не мог? разобрать?я в game.script.
Вот, например, возьмём ?тандартный ?крипт game, который появляет?я при начале нового проекта. Там е?ть такая ?трочка объявления переменной:
Code: WME Script
  1. global MenuObject = null;
При этом меню выбора дей?твий объявляет?я вы?е. ? когда я в?тавил ва? код в ?крипт окна (меню движка и моё меню находят?я в одном окне => появляют?я одновременно) он ? меня не работал. В ?крипте окна по?ле объявления переменной MenuObject я напи?ал
Code: WME Script
  1. Game.LOG(MenuObject);
в лог напи?али null. Поэтом хотел ?про?ить, как работают ?обытия LookAt, Talk и т.д. е?ли в MenuObject ?тоит null?
Мне при?ло?ь
Code: WME Script
  1. global WinMenu = Game.LoadWindow("interface\menu\menu.window");
  2. WinMenu.Visible = false;
перено?ить в RightClick. ? т?т появил?я новый вопро?. Почем? кнопки не ?охраняют?я? Вы же пи?али, что для ?даления кнопок н?жно закрыть окно, а оно ? меня закрывает?я так:
Code: WME Script
  1. WinMenu.Visible = false;
Title: Re: С?ылка на ?крипт
Post by: 2.0 on June 09, 2013, 10:15:46 AM
Вот, например, возьмём ?тандартный ?крипт game, который появляет?я при начале нового проекта. Там е?ть такая ?трочка объявления переменной:
Code: WME Script
  1. global MenuObject = null;

Это начальная инициализация при объявлении переменной. В?е о?тальные телодвижения ? переменной надо делать ниже.

Quote
Мне при?ло?ь
Code: WME Script
  1. global WinMenu = Game.LoadWindow("interface\menu\menu.window");
  2. WinMenu.Visible = false;
перено?ить в RightClick. ? т?т появил?я новый вопро?. Почем? кнопки не ?охраняют?я? Вы же пи?али, что для ?даления кнопок н?жно закрыть окно, а оно ? меня закрывает?я так:
Code: WME Script
  1. WinMenu.Visible = false;

Потом? что, как я понял, каждый раз окно открывает?я вот так:

Code: WME Script
  1. global WinMenu = Game.LoadWindow("interface\menu\menu.window");

Т.е. каждый раз ?оздает?я новый экземпляр окна вме?то про?того включения имеющего?я ? помощью

Code: WME Script
  1. WinMenu.Visible = true;

Вот как этого избежать:

Code: WME Script
  1. global WinMenu;
  2. if (WinMenu == null)
  3.   WinMenu = Game.LoadWindow("interface\menu\menu.window");
  4. else
  5.   WinMenu.Visible = true;
Title: Re: С?ылка на ?крипт
Post by: kalumb on June 10, 2013, 06:02:48 PM
Я про?то разме?тил кнопк? на ве?ь экран и завал её Close. В ?крипте ?казал, что при нажатии окно должно выгр?жать?я.
Спа?ибо вам боль?ое за помощь!