Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 21.01.2011, 13:42   #1
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию координаты

вопрос о5же к адвансед мемберам. Вот такая ситуация-
имеем координаты начальные и конечные плюс скорость. У меня чет лажа выходит.
Вычисляю расстояние. Затем t : speed * dist.
Время получаетса в секундах.
Пытаюсь привескти к мс t: t*1000.
Запоминаю время прихода мувтулокейшн

Добавлено через 3 минуты
пытаюсь узнать текущую коорд при беге. Узнаю текущее время в мс. Вычисляю коэфицент от начального времени и им интерполирую координаты начала и конца. Получаетса дикая погрешность
__________________
читернуть бы ништяг

Последний раз редактировалось mira, 21.01.2011 в 13:42. Причина: Добавлено сообщение
mira вне форума   Ответить с цитированием
Старый 21.01.2011, 15:06   #2
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

vx=(dx / dist) / 1000 - вектор по х движения в 1 мс
vy=(dy / dist) / 1000 - вектор по y движения в 1 мс
дальше узнаешь сколько времени прошло, dt=time_now-time_start (в мс),
и... start_x+(dt*vx), start_y+(dt*vy)
PS вполне возможно что ничерта не будет работать
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 21.01.2011, 16:33   #3
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

хм. А где тут учет скорости бега?
__________________
читернуть бы ништяг
mira вне форума   Ответить с цитированием
Старый 21.01.2011, 16:39   #4
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

ах да, точна..
vx=(dx / (dist / speed)) / 1000
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 21.01.2011, 18:18   #5
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

mira, ты наверно не учитываешь что скорость это не только параметр speed из пакета с описание чара или нпц, speed надо ещё умножить на speedmultipler из того же пакета)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 22.01.2011, 02:29   #6
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

Цитата:
Сообщение от xkor Посмотреть сообщение
mira, ты наверно не учитываешь что скорость это не только параметр speed из пакета с описание чара или нпц, speed надо ещё умножить на speedmultipler из того же пакета)
ясен пень что спид у меня это спид из пакета умноженый на мультиплер)

Добавлено через 21 минуту
Цитата:
Сообщение от supernewbie Посмотреть сообщение
ах да, точна..
vx=(dx / (dist / speed)) / 1000
щас попробую этот метод расчета

Добавлено через 17 минут
болт. тоже самое тока + еще твинк мечетса
щас у меня так:
Код:
procedure L2GetNewPos(pobj:PL2CreatureData;var v: TL2Vector);
var
 sdiff:SINGLE;
 ticks:DWORD;
begin
 ticks:=GetTickCount; // текущее время
// если текущее время больше время заврежения бега то считаем
// что мы дошли и возвращаем конечную координату
 if pobj.endmovetime<=ticks then begin 
  pobj.inMovef:=false;
  v:=pobj.endpoint;
  exit;
 end;
//вычисляем коэффицент из того время что отведено и того что прошло
 sdiff:=abs((pobj.endmovetime-ticks)/pobj.movetime);
//на всяк смотрим чтоб оно не вышло за пределы
 if sdiff>1.0 then sdiff:=1.0;
//вычисляем координату интерполируя конечную и начальную точки
 L2VectorInterpolate(pobj.startpos,pobj.endpoint,sdiff,v);
end;
Добавлено через 7 часов 4 минуты
Код:
procedure L2VectorInterpolate(const v1,v2: TL2Vector; v:single; var vout:TL2Vector);
 begin
  vout.x:=trunc((v*(v1.x-v2.x)) + v2.x);
  vout.y:=trunc((v*(v1.y-v2.y)) + v2.y);
  vout.z:=trunc((v*(v1.z-v2.z)) + v2.z);
 end;
Добавлено через 22 минуты
следование
Код:
function TL2Controller.fsTraceObjectNew(var v: variant): variant;
var
 v1,v2:TL2Vector;
 targetID : integer;
 dist:integer;
 tvnew : TL2Vector;
 tmypoint : TD3DVector;
 x2,y2,z2:integer;
 mX,mY,mZ:integer;
 sina,cosa : single;
 mdist : integer;
begin
 result:=boolean(false);
 if WaitForSingleObject(TL2C.hevent,200)<>WAIT_TIMEOUT then exit;
 if assigned(nhandler.mychar)then if nhandler.mychar.isDead then exit;
 if isInBadEffect then exit;
 if nhandler.mychar=nil then begin
  //IDirect3DDevice9H(idev_).StrWrite('current char not accessible');
  exit;
 end;
 targetID:=v[0];
 if targetID=0 then begin
   IDirect3DDevice9H(idev_).StrWrite('Empty trace target',$FF5555);
   exit;
 end;

 if not nhandler.GetObjectPos(v1,targetID)then begin
  IDirect3DDevice9H(idev_).StrWrite('trace target not accessible',$FF5555);
   exit;
 end;

 if L2IsInMove(nhandler.mychar)and not(boolean(v[1])) then begin
  v1.z:=0;
  if L2VectorDist(v1,PrevTraceCoord)<50 then exit; // NEWKE
  //nhandler.unlock;  // none pos update
  //exit;
 end;

 if not nhandler.GetObjectPos(v2,nhandler.GetMyID)then begin
  IDirect3DDevice9H(idev_).StrWrite('mychar not accessible',$FF5555);
   exit;
 end;

 x2:=(v1.x-v2.x);
 y2:=(v1.y-v2.y);
 Z2:=(v1.Z-v2.Z);

 mX:=1;mY:=1;mZ:=1;
 if (x2<0) then begin mX:=-1; x2:=x2*(-1);end;
 if (y2<0) then begin mY:=-1; y2:=y2*(-1);end;
 if (z2<0) then begin mZ:=-1; z2:=z2*(-1);end;

 dist:=trunc(L2VectorDist(v1,v2));

 if dist<v[2] then begin // distantion is small
  exit;
 end;

 cosa:=(x2)/dist;
 sina:=(y2)/dist; 
 mdist:= dist-100;
 //if dist<100 then mdist:=1;
 tvnew.x:=trunc(mdist*cosa);
 tvnew.y:=trunc(mdist*sina);
 tvnew.x:=v2.x+(tvnew.x * mX);
 tvnew.y:=v2.y+(tvnew.y * mY);
 tvnew.z:=v2.z;

 //tvnew.x:=tvnew.x+(Random(20)-10);
 // tvnew.y:=tvnew.y+(Random(20)-10);
 dist:=trunc(L2VectorDist(v1,tvnew));
 if dist<100 then exit;

 nhandler.MoveBackwardToLocation(tvnew.x,tvnew.y,tvnew.z);
 PrevTraceCoord.x:=v1.x;
 PrevTraceCoord.y:=v1.y;
 PrevTraceCoord.z:=0;
 //IDirect3DDevice9H(idev_).StrWrite('trace by dist : '+inttostr(dist));
 result:=boolean(true);
end;
__________________
читернуть бы ништяг

Последний раз редактировалось mira, 22.01.2011 в 02:29. Причина: Добавлено сообщение
mira вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 05:35.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!