DizzyAge по-русски
http://dizzyage.flybb.ru/

движение по прямой под произвольным углом
http://dizzyage.flybb.ru/topic98.html
Страница 1 из 1

Автор:  osa [ 28 ноя 2012, 00:11 ]
Заголовок сообщения:  движение по прямой под произвольным углом

Стандартный алгоритм передвижения предметов AIUpdateTrain работает уж очень топорно, создал свой скрипт передвижения, который позволяет передвигаться между точками по кратчайшему расстоянию под произвольным углом. Добавляем в ai.gs
Код:
func AIUpdateCart( idx )
{
   if(idx==-1) return;
   if(ObjGet(idx,O_DISABLE)) return;
   if(!IsUpdate(ObjGet(idx,O_DELAY))) return;
   if(ObjGet(idx,O_STATUS)!=1) return;
   id2 = ObjGet(idx,O_TARGET);
   if(id2==0) return;
   idx2 = ObjFind(id2);
   if(idx2==-1) return;
   speed = ObjGet(idx2,O_WAYPOINTSPEED); //скорость по Вектору(гипотенуза)
   flip = ObjGet(idx2,O_WAYPOINTFLIP);
   x2 = ObjGet(idx2,O_X); //координата X места назначения
   y2 = ObjGet(idx2,O_Y); // координата Y
   x = ObjGet(idx,O_X); //координата X места отправления
   y = ObjGet(idx,O_Y); // Y
   ObjSet(idx,O_FLIP,flip);
   dx = (float)x2 - (float)x ; // длина по X
   dy = (float)y2 - (float)y ; // длина по Y
   dx2 = dx*dx;
   dy2 = dy*dy;
   dsum=(float)dx2+(float)dy2;
   dz =gs_sqrt((float)dsum);
   cosinusa = dx/dz;
   sinusa = dy/dz;
   speedx = (float)cosinusa*(float)speed;
   speedx = gs_round(speedx);
   speedy = (float)sinusa*(float)speed;
   speedy = gs_round(speedy);
   flip = ObjGet(idx2,O_WAYPOINTFLIP);
   x2 = ObjGet(idx2,O_X); //координата X места назначения
   y2 = ObjGet(idx2,O_Y); // координата Y
   x = ObjGet(idx,O_X); //координата X места отправления
   y = ObjGet(idx,O_Y); // Y
   ObjSet(idx,O_FLIP,flip);   
   
   if(x<x2) { x+=((int)speedx); if(x>x2) x=x2; }
   if(x>x2) { x+=((int)speedx); if(x<x2) x=x2; }
   if(y<y2) { y+=((int)speedy); if(y>y2) y=y2; }
   if(y>y2) { y+=((int)speedy); if(y<y2) y=y2; }
   if(x==x2 && y==y2) // reached waypoint, change target
   {      
      target = ObjGet(idx2,O_TARGET);
      ObjSet(idx,O_TARGET,target);      
   }
   ObjSet(idx,O_X,x);
   ObjSet(idx,O_Y,y);
}

Автор:  osa [ 28 ноя 2012, 00:14 ]
Заголовок сообщения:  Re: движение по прямой под произвольным углом

Сравнение стандартного алгоритма(зеленый) с моим (красный)
http://sderni.ru/156442

Страница 1 из 1 Часовой пояс: UTC + 4 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/