Форум » Скрипты (Script) » Пазлы » Ответить

Пазлы

victor89: Здраствуйте. Разрабатываю мини игру пазлы. Есть картинка порезаная на пазлы 30 шт. В редакторе сцены сделал 30 Entity у каждого имя состоит из "pN" где N число. Склал их в картинку и сделал неактивными. При инициализации сцены програмно создаю еще 30 Entity с картинками пазлов, формат имени следующий "ppN", на каждый елемент пазла "ppN"вешаеться скрипт, в котором реализован drag&drop и скрипт проверки: global IsLeftDown; on "LeftClick" { IsLeftDown = true; var x0=Game.MouseX-this.X; var y0=Game.MouseY-this.Y; while(IsLeftDown==true) { this.X = Game.MouseX-x0; this.Y = Game.MouseY-y0; Sleep(20); } } on "LeftRelease" { IsLeftDown = false; set_puzzle(this.X,this.Y,this.Name); } function set_puzzle(x,y,name) { var tx1,tx2,ty1,ty2,tname,px1,px2,py1,py2,pname; tname=name; pname="Null"; tx1=x+20; tx2=x+75; ty1=y+50; ty2=y+65; for (var i=1;i<=30;i=i+1) { var tmp=Scene.GetNode("p"+i); px1=tmp.X; px2=tmp.X+75; py1=tmp.Y; py2=tmp.Y+65; var str=new String(tname); var ttname=str.Substr(1); if ((tx1>=px1)&&(ty1>=py1)&&(ttname==tmp.Name)) { pname=tmp.Name; Game.Msg(ttname); } } if (pname!="Null") { tmp=Scene.GetNode(pname); tmp.Active=true; Game.DeleteEntity(tname); pname="Null"; } } Задумовалось как проверить все неактивные пазлы и если найдеться пазл у которого в "гарячей" зоне лежат координаты активного пазла, отключит активный и включить активный. Горячая зона центральный квадратик в пазле. размером 60на50 Но пока что не сумел довести до ума. Большая просьба помочь реализовать скрипт пазла.

Ответов - 3

victor89: Хе хе, чуток работы и все готово. Ух мне везет не успивают народные умельцы отписаться сам нахожу выход. Выкладываю скрипт пазла). Сначала режим картинку на н частей. Далее в сцене слажуем из этих частей картинку. отключаем видимость кусочков пазла. scene_init.script #include "scripts\base.inc" global needpazle=30;//количество пазлов. actor.Active = false; global IsLeftDown = false; global pazlayer=Scene.AddLayer("paz");//слой для пазлов. for (var i=1;i<=30;i=i+1) { pazlayer.AddEntity("pp"+i); var tmp=pazlayer.GetNode("pp"+i); tmp.AttachScript("scenes\puzzle\scr\puzzle_core.script"); tmp.SetSprite("scenes\puzzle\p"+i+".png"); var r=Random(1,4); switch (r) { case 1: tmp.X=200; tmp.Y=Random(10,580); break; case 2: tmp.X=Random(200,810); tmp.Y=10; break; case 3: tmp.X=Random(200,810); tmp.Y=645; break; case 4: tmp.X=810; tmp.Y=Random(10,580); break; } } puzzle_core.script global IsLeftDown; global pazlayer; global needpazle; on "LeftClick" { IsLeftDown = true; var x0=Game.MouseX-this.X; var y0=Game.MouseY-this.Y; while(IsLeftDown==true) { this.X = Game.MouseX-x0; this.Y = Game.MouseY-y0; Sleep(20); } } on "LeftRelease" { IsLeftDown = false; this.X=this.X; this.Y=this.Y; set_puzzle(this.X,this.Y,this.Name); } function set_puzzle(x,y,name) { var tx1,ty1,tname,px1,px2,py1,py2,pname; tname=name; pname="Null"; tx1=x; ty1=y; for (var i=1;i<=30;i=i+1) { var tmp=Scene.GetNode("p"+i); px1=tmp.X-20; px2=tmp.X+70; py1=tmp.Y-20; py2=tmp.Y+75; var str=new String(tname); var ttname=str.Substr(1); if ((tx1>px1)&&(tx1<px2)&&(ty1>py1)&&(ty1<py2)&&(ttname==tmp.Name)) { pname=tmp.Name; } } if (pname!="Null") { tmp=Scene.GetNode(pname); tmp.Active=true; pname="Null"; needpazle=needpazle-1; Game.Msg(needpazle); if (needpazle==0) { this.Active=false; var LevelMenu = Game.LoadWindow("interface\level_complete.window"); LevelMenu.Center(); LevelMenu.GoExclusive(); Game.UnloadObject(LevelMenu); } pazlayer.DeleteNode(this); } }

Dionysius:

DK: Доброго времени суток, уважаемые! Сами мы не местные Пока что учусь разбираться с этим движком, так что не судите строго. Буду благодарен, если поможете в моей беде. Решил попробовать вставить сей скрипт. Поделил картинку на 30 равных кусочков, создал на слое main 30 entity и расставил как положено для цельной картинки. Сделал эти entity невидимыми. Далее вставил этот скрипт. Вроде как все отображается, паззлы двигаются, но похоже что проверяться на "правильность установки" не хотят.




полная версия страницы