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

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

Закрытая тема
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
SetHeight with Zterrain
Подскажите как правильно сравнивать высоты террейна для формулы параболы.
То-есть при передвижении по параболе происходил игнор клифов, для плавного движения.
Пс на полярках
Как реализовать для прямолинейного движения знаю:
  • запомнить высоту текущую + высоту рельефа = z
  • передвинуть юнита
  • сетхейт(юнит, z - текущая высота рельефа )
А как тут приаттачить, я хз =\
function ParabolaZ takes real h, real d, real x returns real
  return (4 * h / d) * (d - x) * (x / d)
endfunction
» crazy_jump
static timer t = CreateTimer()
static int c = 0
static Jump array j
int id
real ang
real mrng
real crng
real height

static void Timer() {
    int i = 0
    real x = 0.
    real y = 0.
    real z = 0.
    whilenot(i>=.c) {
        if .j[i].crng <= .j[i].mrng {
            .j[i].crng+=Speed
            x = GetUnitX(Unit[.j[i].id])
            y = GetUnitY(Unit[.j[i].id])
            MoveLocation(Loc, x, y)
            z = (4.*.j[i].height/.j[i].mrng)*(.j[i].mrng-.j[i].crng)*(.j[i].crng/.j[i].mrng) + GetLocationZ(Loc)
            x+=Speed*Cos(.j[i].ang)
            y+=Speed*Sin(.j[i].ang)
            if (GetRectMinX(bjm)<=x)&&(x<=GetRectMaxX(bjm))&&(GetRectMinY(bjm)<=y)&&am​p;(y<=GetRectMaxY(bjm)) {
                SetUnitX(Unit[.j[i].id], x)
                SetUnitY(Unit[.j[i].id], y)
                DestroyEffect(AddSpecialEffectTarget(Effect,Unit[.j[i].id],"origin"))
                MoveLocation(Loc, x, y)
                SetUnitFlyHeight(Unit[.j[i].id], z-GetLocationZ(Loc), 0.0)
                } else { KillUnit(Unit[.j[i].id]) }
        } else {
            if GetWidgetLife(Unit[.j[i].id]) >.405 {
                x = GetUnitX(Unit[.j[i].id])
                y = GetUnitY(Unit[.j[i].id])
                PauseUnit(Unit[.j[i].id],false)
                if GetTerrainCliffLevel(x,y)<3 { KillUnit(Unit[.j[i].id]) }
            }
            .j[i].destroy()
            .c--
            .j[i] = .j[.c]
            i--
            if .c<=0 { PauseTimer(.t) }
        }
    i++ }}

static void On(int i, real rng) {
    Jump J = Jump.create()
    J.id = i
    J.ang = GetUnitFacing(Unit[i])*0.0174
    J.crng = .0
    J.mrng = rng
    J.height = rng/2.
    IssueImmediateOrder(Unit[i],"stop")
    PauseUnit(Unit[i], true)
    if .c<=0 { TimerStart(.t,0.035,true,function Jump.Timer) }
    .j[.c] = J
    c++ }
Помогите =)

Отредактировано AlexKARASb, 04.10.2010 в 22:25.
Старый 04.10.2010, 22:19
H_A_PK
Тёмные времена
offline
Опыт: 665
Активность:
Я предложу свой способ. Но не думаю , что ты данную методику поймёшь. Постараюсь:
Миниатюры
Кликните на картинку для увеличения
Название:  z x y.jpg
Просмотров: 90
Размер:  52.5 Кбайт  
Старый 05.10.2010, 05:49
Arty3ooo
...
offline
Опыт: 3,125
Активность:
2Napp lil noob
...очередные кляузы умнегов и как всегда нет ничего по делу...
Ищи в базе... там была наработка... правда с учетом кучи ненужной сери - массы юнита, трения и тд..
Старый 05.10.2010, 08:47
ZregerZ
Мы - лёд!
offline
Опыт: 7,029
Активность:
AlexKARASb, точно также как и при движении по прямой (естественно при этом менять высоту для полета по пораболе надо)
Старый 05.10.2010, 09:53
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
По нормальному надо вычитать высоту рельефа, а не прибавлять ее:
z = <вычисление высоты> - GetLocationZ(Loc)
то есть что-то вроде:
  MoveLocation(Loc, x, y)
  z = <вычисление высоты> - GetLocationZ(Loc)
  SetUnitFlyHeight(Unit[.j[i].id], z, 0.0)
Кстати, добавил в Библиотеку функций еще одну функцию параболы, может будет полезна.
Старый 05.10.2010, 10:01
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Получилось так:
  • задавая макс. высоту при прыжке добавил к макс. высоте высоту рельефа текущего
hmax = hmax + GetLocationZ(Loc)
  • при переодике от формулы параболы отнимал текущую высоту
(4*hmax/d)*(d-x)*(x/d)-GetLocationZ(Loc)
Спасибо всем, тему можно закрыть.
Старый 05.10.2010, 18:05
Закрытая тема

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

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

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

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



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