В движке WME ВСЁ, с чем нам приходится иметь дело, является объектами. Вспоминая ООП, у каждого объекта есть методы. Чтобы прописать новый метод для объекта (или просто его реагирование на какое-либо действие), нужно создать скрипт и присоединить его к объекту. Такова логика WME, это всё прекрасно подходит для персов, сцен, спрайтов итд. Но, блин, для слоёв (layer) почему-то функции аттача нету! Или я просто её не нашёл?
Подскажите, как быть, если нужно прицепить к слою скрипт?
Добавлено (31.07.2011, 06:29) --------------------------------------------- Разобрался =) Если кому надо работать со слоями - могу выложить, что получилось. А никто не знает, как заставить движок выполнять команды параллельно?
И это лучшее не свете колдовство, Ликует солнце на лезвии гребня, И это все, и больше нету ничего - Есть только небо, вечное небо.
БЛОГ МОЕЙ ИГРЫ: http://dragon-3.blogspot.com/
Сообщение отредактировал P1LL0TT - Четверг, 28.07.2011, 19:38
получается, что сначала двигается слой1, ПОТОМ слой 2, а ЗАТЕМ слой 3. А мне надо, чтобы они одновременно ехали, т.е. команды выполнялись не последовательно, а параллельно. ----------------------------------------------------------------- Разобрался уже =) ----------------------------------------------------------------- Molier, собственно, я написал новый метод для объекта layer. Метод упакован в скрипт "layer.script" (класть в папку scripts):
Code
#include "scripts\base.inc" global Time; method Scroll(var x, var y, var v) { this.x=x; this.y=y; this.v=v; this.ApplyEvent ("start_moving"); }
on "start_moving" {
var h=10; var b=this.NumNodes; if (b!=0) { var d; d.x=(this.x*h)/this.v; d.y=(this.y*h)/this.v; var c=true; var i; var t1; var curNode=this.GetNode(0); curNode.X1=curNode.X; curNode.Y1=curNode.Y; curNode.X2=curNode.X+this.x; curNode.Y2=curNode.Y+this.y; while (c) { t1=Time; for (var j=0; j<b ;j=j+1) { curNode=this.GetNode(j); curNode.X1=curNode.X1+d.x; curNode.Y1=curNode.Y1+d.y; curNode.SkipTo(curNode.X1,curNode.Y1+d.y); } if (this.x>0 && ((curNode.X-curNode.X2)>0)) c=false; if (this.x<0 && ((curNode.X-curNode.X2)<0)) c=false; if (this.y>0 && ((curNode.Y-curNode.Y2)>0)) c=false; if (this.y<0 && ((curNode.Y-curNode.Y2)<0)) c=false; i=i+1; Sleep (t1+h-Time); } for (var k1=0; k1<b ;k1=k1+1) { curNode=this.GetNode(k1); curNode.SkipTo(curNode.X2,curNode.Y2); } } }
Чтобы его привязать к слою надо в скрипте сцены:
Code
var layer1=Scene.GetLayer("имя слоя"); //связываем переменную со слоем layer1.AttachScript("scripts\layer.script"); //привязываем к слою скрипт
После этого можно с чистой совестью использовать новый метод:
Code
layer1.Scroll (1066,0,1000); //передвинуть слой1 НА 1066 по Х, 0 по У. В конечной точке он будет через 1сек.
А, ещё надо в game_loop.script добавить:
Code
global Time;
и там же в саму петлю while(true):
Code
Time=Game.CurrentTime;
Всё =)
Юху!! Таки довёл до ума эту штуку. Теперь функций 2 - для последовательного и параллельного скролла, всё стало плавнее и чётче)) + не надо ничего редактировать, скопировал, прицепил - пользуйся. Хотя мало кто воспользуется, если вообще будут такие) Но вдруг кому пригодится... Выложил тут, в каталоге файлов с подробным, надеюсь, описанием. Никто не возражает? =) И это лучшее не свете колдовство, Ликует солнце на лезвии гребня, И это все, и больше нету ничего - Есть только небо, вечное небо.
БЛОГ МОЕЙ ИГРЫ: http://dragon-3.blogspot.com/
Сообщение отредактировал P1LL0TT - Пятница, 19.08.2011, 01:18