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

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

Закрытая тема
 
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Отталкивание
На каком принципе работает отталкивание. Как вообще это реализоваать. на jass.
Старый 17.03.2011, 22:07
Иноземец
сJass = true
offline
Опыт: 4,379
Активность:
Dreii, Молча. SetUnitPosition (ну или SetUnitX/Y) тебе поможет в этом.
Старый 17.03.2011, 22:12
Hanabishi
COOL STATUS
offline
Опыт: отключен
каждые 0.04 (к примеру) двигаешь юнита в нужном направлении на нужное значение (скорость)
Старый 17.03.2011, 22:17
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Hanabishi,
Код:
function Knock_Timer takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local integer id=GetHandleId(t)
    local unit u=LoadUnitHandle(udg_Hashtable,id,0)
    local real angle=LoadReal(udg_Hashtable,id,3)
    local real time=LoadReal(udg_Hashtable,id,2)
    local real x = GetUnitX(u)+25.*Cos(angle*.0174532)
    local real y = GetUnitY(u)+25.*Sin(angle*.0174532)
    if time<=.0 then
        call FlushChildHashtable(udg_Hashtable,id)
        call PauseTimer(t)
        call DestroyTimer(t)
    elseif  IsTerrainPathable(x,y,PATHING_TYPE_WALKABILITY) == false then     
    call SetUnitX(u,x)
    call SetUnitY(u,y)
    endif
    set u=null
    set t = null
endfunction
function Knock takes unit u,real dist,real time,real angle returns nothing
    local timer t = CreateTimer()
    local integer id=GetHandleId(t)
    call SaveUnitHandle(udg_Hashtable,id,0,u)
    call SaveReal(udg_Hashtable,id,1,dist)
    call SaveReal(udg_Hashtable,id,2,time)
    call SaveReal(udg_Hashtable,id,3,angle)
    call TimerStart(t,.2,true,function Knock_Timer)
    set t = null
endfunction

едет безконца(
Старый 17.03.2011, 23:09
Hanabishi
COOL STATUS
offline
Опыт: отключен
забываешь отнимать время
в функции Knock_Timer добавь
call SaveReal(udg_Hashtable,id,2,time-0.2) //0.2 время таймера
и 0.2 период большеват для этого - будут сильные рывки, ставь 0.04
Старый 17.03.2011, 23:16
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Hanabishi, Hanabishi, ок учту
Старый 17.03.2011, 23:23
DotaMaster666
Silenced by GadenbIsh
offline
Опыт: 1,259
Активность:
Тут описан принцип, правда достаточно отстало, можно реализовать проще и эффективнее.
Dreii и Hanabishi судя по всему дилетанты и плохо разбираются в вопросе.
Старый 17.03.2011, 23:57
JassMan
свободен
offline
Опыт: 4,193
Активность:
DotaMaster666, покажи-ка пример по проще и эффективнее, мне даже интересно.
Старый 18.03.2011, 03:33
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
DotaMaster666, кеш прошлый век
Старый 18.03.2011, 10:24
DotaMaster666
Silenced by GadenbIsh
offline
Опыт: 1,259
Активность:
Могу указать на основные промахи:
  • Вообще не правильная организация движения (куча таймеров)
  • Непонятно зачем постоянно переводятся градусы постоянно переводятся в радианы
  • Присутствует "проскок" сквозь непроходимые участки
  • Алгоритм вообще нерабочий (в первом случае)
Doc:
  1. Не сильно решает, и без холиваров пожалуйста.
  2. true
  3. true

Отредактировано Doc, 19.03.2011 в 16:26.
Старый 18.03.2011, 13:43
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
ну эт отталкивание без торможения, некрасиво както...
function Knock_Timer takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local integer id=GetHandleId(t)
    local unit u=LoadUnitHandle(udg_Hashtable,id,0)
    local real angle=LoadReal(udg_Hashtable,id,3)
    local real accel=LoadReal(udg_Hashtable,id,2)
    local real x = GetUnitX(u)+accel.*Cos(angle*.0174532)
    local real y = GetUnitY(u)+accel.*Sin(angle*.0174532)

    set accel = accel - .1
    if accel<=.0 or IsTerrainPathable(x,y,PATHING_TYPE_WALKABILITY) == true then
        call FlushChildHashtable(udg_Hashtable,id)
        call PauseTimer(t)
        call DestroyTimer(t)
    else
        call SetUnitX(u,x)
        call SetUnitY(u,y)
    endif
    call SaveReal(udg_Hashtable,id,2,accel)
    set u=null
    set t = null
endfunction
function Knock takes unit u,real dist,real time,real angle returns nothing
    local timer t = CreateTimer()
    local integer id=GetHandleId(t)
    call SaveUnitHandle(udg_Hashtable,id,0,u)
    call SaveReal(udg_Hashtable,id,1,dist)
    call SaveReal(udg_Hashtable,id,2,accel)
    call SaveReal(udg_Hashtable,id,3,angle)
    call TimerStart(t,.2,true,function Knock_Timer)
    set t = null
endfunction
както так вроде будет не по времени а пока не остановица, accel - понижающаяся скорость, там вместо .1 под себя уже подогнать над
Старый 18.03.2011, 23:16
Закрытая тема

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

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

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

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



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