XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Расстояние от героя, до края карты
В общем надо его определить,чтобы двигать даммика до края карты, можно было бы использовать, функции не дающие вылететь даммику за карту, но у меня спелл летит на всю карту, и нужно удалять когда он долетит до края и убить даммика, т.е точно знать когда убить, ибо давать всегда одно и тоже время жизни, не вариант, расстояние от героя до края карты, то всегда разное.
Жду советов умнее чем, "сделать область, чуть меньше игровой зоны и при выходе из неё убивать."
Старый 25.10.2012, 09:59
DimanTOoBS

offline
Опыт: 5,791
Активность:
16GB, не делать область, а использовать уже имеющуюся игровую зону xDDD
вот условие
(Playable map area) contains Unit не равно "Да"
вот пример
Прикрепленные файлы
Тип файла: w3x Explosive Arrow.w3x (19.2 Кбайт, 4 просмотров )
Старый 25.10.2012, 10:15
Sidhe
Unity3D engine
offline
Опыт: 7,721
Активность:
задать границы карты вручную и сравнивать текущее положение юнита относительно границ
Старый 25.10.2012, 10:15
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
16GB, у каждой карты есть макс координата X, и Y, так же самая меньшая, ну дак вот проверяем что текущие координаты и максимальные с минимальными перед тем как двигать даммика, если меньше, максимальных и больше минимальных то двигаем, иначе килл дамик...
Старый 25.10.2012, 12:03
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
» м?
library SafeMoving
{

    private float MinX = - 8000.
    private float MaxX = 23200.
    private float MinY = -31700.
    private float MaxY = -500.

    #define
    {
        SetUnitX=SetUnitXEx
        SetUnitY=SetUnitYEx
        SetUnitPosition=SetUnitPositionEx
    }

    private float CheckX(float x)
    {
        if x>MaxX
        {
            return MaxX
        }
        elseif x<MinX
        {
            return MinX
        }
        return x
    }

    private float CheckY(float y)
    {
        if y>MaxY
        {
            return MaxY
        }
        elseif y<MinY
        {
            return MinY
        }
        return y
    }

    void SetUnitXEx(unit u, float x)
    {
        SetUnit##X(u,CheckX(x))
    }

    void SetUnitYEx(unit u, float y)
    {
        SetUnit##Y(u,CheckY(y))
    }

    void SetUnitPositionEx(unit u, float x, float y)
    {
        SetUnit##Position(u,CheckX(x),CheckY(y))
    }

    void SetUnitXY(unit u, float x, float y)
    {
        SetUnitX(u,x)
        SetUnitY(u,y)
    }
}
Старый 25.10.2012, 12:38
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
есть код вида
local real X = GetSpellTargetX()
local real Y = GetSpellTargetY()
local real x = GetUnitX(c)
local real y = GetUnitY(c)
local real r = Atan2(Y-y,X-x)
set x = x+1000.*Cos(r)
set y = y+1000.*Sin(r)
потом я сохраняю х,у и двигаю до тех пор пока до них не долетим, я и так использую специальные функции чтобы не дать даммику за карту улететь
вопрос не в этом
мне нужна функция чтобы подставить её в место 1000., что она вернула расстояние от героя до конца карты в указанном направлении
как-то так
set x = x+DistToEnd(c,r)*Cos(r)
проверять нахождение юнита в области и т.д и я так знаю как делать, но меня интересует именно такая реализация, и поэтому я создал тему.
Старый 25.10.2012, 16:53
влад10011

offline
Опыт: 2,337
Активность:
16GB, Работает если карта квадратная
Код:
globals
real minx,maxx,miny,maxy,minx2,maxx2,miny2,maxy2
endglobals

function DistToEnd takes unit c,real r returns real
real x=GetUnitX(c),y=GetUnitY(c),dist=0.00,x2=x,y2=y
real d1=SquareRoot((minx-x)*(minx-x)+(miny-y)*(miny-y))
real d2=SquareRoot((maxx-x)*(maxx-x)+(maxy-y)*(maxy-y))
real d3=SquareRoot((minx2-x)*(minx2-x)+(miny2-y)*(miny2-y))
real d4=SquareRoot((maxx2-x)*(maxx2-x)+(maxy2-y)*(maxy2-y))
integer i=0
if d1<d2 and d1<d3 and d1<d4 {
   dist=d1
}elseif d2<d1 and d2<d3 and d2<d4 {
   dist=d2
}elseif d3<d1 and d3<d2 and d3<d4 {
   dist=d3
}elseif d4<d1 and d4<d2 and d4<d3 {
   dist=d4
}

loop {
i++
   x=x+5.00*r
   y=y+5.00*r
   
   if(x2<minx){i=R2I(dist)}elseif(x2>maxx){i=R2I(dist)}
   if(y2<miny){i=R2I(dist)}elseif(y2>maxy){i=R2I(dist)}
exitwhen i>=R2I(dist) 
}
   x=x+5.00*(180.00+r)
   y=y+5.00*(180.00+r)
return SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))
endfunction

function F takes unit c returns nothing
local real X = GetSpellTargetX()
local real Y = GetSpellTargetY()
local real x = GetUnitX(c)
local real y = GetUnitY(c)
local real r = Atan2(Y-y,X-x)
set x=x+DistToEnd(c,r)*Cos(r)
set y=y+DistToEnd(c,r)*Sin(r)
endfunction

//Функцию ниже вызывать только после инициализации
function Init takes nothing returns nothing
real x=0.00
real y=0.00
real d=0.00
    minx=GetRectMinX(bj_mapInitialPlayableArea)
    maxx=GetRectMaxX(bj_mapInitialPlayableArea)
    miny=GetRectMinY(bj_mapInitialPlayableArea)
    maxy=GetRectMaxY(bj_mapInitialPlayableArea)
   d=SquareRoot((minx-maxx)*(minx-maxx)+(miny-maxy)*(miny-maxy))/1.5
   minx2=minx+d*Cos(90.00*bj_DEGTORAD)
   miny2=miny+d*Sin(90.00*bj_DEGTORAD)
   maxx2=maxx+d*Cos(270.00*bj_DEGTORAD)
   maxy2=maxy+d*Sin(270.00*bj_DEGTORAD)
endfunction

Отредактировано влад10011, 26.10.2012 в 16:43.
Старый 25.10.2012, 17:50
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ты ослеп?
я описал что мне нужно
то что кинул совершенно не то
меня интересует конкретно, то что я указал
не знаешь ответа не пиши
Старый 25.10.2012, 19:29
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
16GB, Представим игровую карту в виде квадрата(прямоугольника), у этой фигуры мы знаем координаты максимума и минимума. Т.е. по сути мы знаем об этой фигуре все. Далее у нас есть вектор, мы знаем его направление и координаты. Т.е. мы можем узнать его положение относительно фигуры. Все просчитывается простой формулой(1 курс вышмата) , которую над просто помнить, я к сожалению уже не помню. Ну или можно заюзать геометрию за 9 класс, у нас получается треугольник, у которого известно 3 угла и 1 сторона.
В общем гугли либо учебник геометрии, либо достань тетради за 1 курс по математике. мне лень самому вспоминать, честно :)
Старый 25.10.2012, 20:08
J64_

offline
Опыт: 4,724
Активность:
Берём расстояние большее и равное диагонали карты. Высчитываем по твоей формуле и получится то что конечная точка всегда окажется за пределами карты. Далее пользуемся функциями описанными Faion'ом . И высчитываем расстояние до него. Можно ещё тривиальнее сделать, но мне думать лень :-)
Старый 26.10.2012, 11:25
DemoN2099
annihilator
offline
Опыт: 4,418
Активность:
нужно удалять когда он долетит до края и убить даммика
Жду советов умнее чем, "сделать область, чуть меньше игровой зоны и при выходе из неё убивать."
Эм... Поставить 4 области по краям карты и при входе в них убивать дамми?..
DemoN2099 добавил:
Чем тебе этот вариант не нравится?
Старый 27.10.2012, 05:55
DioD

offline
Опыт: 45,134
Активность:
а что мешает запустить 4 "рейкаста" по прямой в каждую сторону от юнита и выбрать меньшие значения?
то что описано выше ниачёмный блот рассчитанный непонятно на что, карта всегда КВАДРАТ, вычесть границы из корд юнитов и выбрать меньшую пару...
Старый 27.10.2012, 08:15
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
DioD:
вычесть границы из корд юнитов и выбрать меньшую пару...
границы это будет
set x = GetUnitX(c)-GetRectMaxX(bj_mapInitialPlayableArea)
set y = GetUnitY(c)-GetRectMaxY(bj_mapInitialPlayableArea)
set a = GetUnitX(c)-GetRectMinX(bj_mapInitialPlayableArea)
set b = GetUnitY(c)-GetRectMinY(bj_mapInitialPlayableArea)
и что нам это даёт?
Старый 27.10.2012, 09:06
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
DioD:
карта всегда КВАДРАТ
*Прямоугольник. Но того что можно посчитать расстояние до границ карты и выбрать меньшее это не меняет.
Старый 27.10.2012, 09:08
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Master_chan:
посчитать расстояние до границ карты и выбрать меньшее это не меняет.
мне нужно в определённом направлении, причём тут меньшее?
Старый 27.10.2012, 09:13
DemoN2099
annihilator
offline
Опыт: 4,418
Активность:
16GB:
Жду советов умнее чем, "сделать область, чуть меньше игровой зоны и при выходе из неё убивать."
Чем тебе этот вариант не нравится?
Старый 27.10.2012, 09:51
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
смотрите пост № 6
Старый 27.10.2012, 14:33
DioD

offline
Опыт: 45,134
Активность:
пост номер 6 ненужный блот, нам достаточно проверить не выходит ли любая их координат юнита за границу мира И ВСЁ.
неужели вы настолько тупы что не можете понять, что считать расстояние в данном случае не требуется, мы выбераем подходящую пару и сверяем корды напрямую.
if mod(getunitx()) >= GetRectMaxX(bj_mapInitialPlayableArea) УБИТЬ
работает для любой квадратной карты безупречно
вычитать надо для той же самой проверки, в случае прямоугольной карты, так как надо сверять 2 пары координат
Старый 27.10.2012, 14:42
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
мне нужно, узнать именно расстояние, а не то что он вышел за границы карты, это так сложно понять?
а почему именно так я описал в посте 6, не нужно мне предлагать других методов понятно не?
Старый 27.10.2012, 15:16
DemoN2099
annihilator
offline
Опыт: 4,418
Активность:
16GB, ну так сделай ещё одного дамми, двигай его до границы циклом с проверкой, в карте ли он и считай расстояние.
Старый 27.10.2012, 15:18
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 09:03.