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

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

Ответ
 
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Система маунта (Ездовые животные)
Версия: v1.2
Автор: OxygenD
Исполнение: vJass
» Инструкция
Инструкция:
    --- Настройка ---
    MSAddUnit(id юнита,id клона у юнита, id анимации) - зарегестрировать юнита в системе
    MSAddMount(id маунта, высота подьема того кто сидит) - зарегестрировать маунт в системе
    --- Функции управления ---
    MountUnit(юнит, маунт) - посадить юнита на маунта
    UnMountUnit(юнит) - спустить юнита с маунта 
    Эти функции возвращают true при успехе и false при неудаче.
   ---Проверка---
   OnMount(unit) возвращает true если юнит уже на маунте и false если он не на маунте.
Описание

Позволяет юнитам садится на других юнитов верхом, имитируя езду верхом.
Как я думаю у всех систем, и у этой в частности, есть свои плюсы и минусы.
Ну начнем с плюсов:

+ Легко настраивается
+ Удобна в использовании
+ Импорта всего 1 триггер
+ Система маунта в конце концов!

Минусы:

- На каждого юнита который может садится на маунта должен быть даммик с моделью того, кто садится. Желательно, дабы избежать проблем с поворотами на сколнах, даммик должен быть на основе маунта на которого он садится, либо все анимационные конфигурации должны быть идентичны. Также тип ходьбы у дамми, должен быть любой отличный от летающего. Проще всего поставить обычный, пеший.
- В системе нужно регистрировать всех маунтов, даммиков и тех кто может на них садится.

Код:
» code
/*

    MOUNT SYSTEM v1.2 BY OXYGEND
   Instruction:
    --- Setting ---
    MSAddUnit(unit id,unit dummy id,animation id) - register unit in system
    MSAddMount(mount id, sit height) - register mount in system
    --- Control ---
    MountUnit(unit, target) - mount unit
    UnMountUnit(unit) - unmount unit
    This functions return true with success and false with fail.
    
                                            P.S Write my nickname somewhere in credit if you will use this system:)
*/

library MountSys initializer InitSystem

globals
 private constant integer  Maxunit = 100
 
 private constant real     TIMER_PEREODIC = 0.025 // optimal
 
 private constant boolean  DEBUG_FLAG = false
endglobals

 globals
 // General
 private timer              UpTimer         = CreateTimer()
 private unit array         MountedUnit     [Maxunit]
 private unit array         UnitMounted     [Maxunit]
 private unit array         InvisUnit       [Maxunit]
 private boolean array      OnMOUNT         [Maxunit]
 private integer            MaxUnit             = 0
 // For registration
 integer                    NOW_MOUNTED         = 0
 integer                    REGISTRED_UNITS     = 0
 integer                    MOUNT_COUNT         = 0
 integer array              GENERAL_ID      [Maxunit]
 integer array              CLONE_ID        [Maxunit]
 integer array              MOUNT_ID        [Maxunit]
 integer array              MISSED_SLOT     [Maxunit]
 integer array              ANIM_ID         [Maxunit]
 real array                 MOUNT_HIGHT     [Maxunit]
 
endglobals

 function MSAddUnit takes integer uid,integer cid,integer aid returns nothing
   set REGISTRED_UNITS = REGISTRED_UNITS + 1
   set GENERAL_ID[REGISTRED_UNITS] = uid
   set CLONE_ID[REGISTRED_UNITS] = cid
   set ANIM_ID [REGISTRED_UNITS] = aid
 endfunction
 
 function MSAddMount takes integer mid,real height returns nothing
   set MOUNT_COUNT = MOUNT_COUNT + 1
   set MOUNT_ID[MOUNT_COUNT] = mid
   set MOUNT_HIGHT[MOUNT_COUNT] = height
 endfunction
   
 private function GetMountId takes integer m returns integer
   local integer i=1
   
    loop
    exitwhen(i>MOUNT_COUNT)
    
      if m == MOUNT_ID[i] then
        return i
      endif
      
     set i = i + 1
    endloop
   return 0
 endfunction
  
 private function GetMountedUnitId takes unit u returns integer
   local integer i = 1
   
    loop
    exitwhen(i>MaxUnit)
    
      if u == InvisUnit[i] then
        return i
      endif
      
      set i = i + 1
    endloop
    
   return 0
 endfunction
 
 private function GetMissSlot takes nothing returns integer
  local integer i = 1
  
   loop
    exitwhen(i>MaxUnit)
    
     if MISSED_SLOT[i]>0 then
      return MISSED_SLOT[i]
     endif
     
    set i = i + 1
   endloop
    return 0
 endfunction
  
 function OnMount takes unit u returns boolean
   return OnMOUNT[GetMountedUnitId(u)]
 endfunction

  function MountUnit takes unit u,unit t returns boolean
   local integer id=GetPlayerId(GetOwningPlayer(u))
   local integer i = 0
   local integer j = 0
   local integer ms
   
  loop
  exitwhen(i>REGISTRED_UNITS) 
    if GetUnitTypeId(u) == GENERAL_ID[i] and GetUnitTypeId(t) == MOUNT_ID[GetMountId(GetUnitTypeId(t))] then
    
    loop
     exitwhen(j > MaxUnit) 
     
       if t == UnitMounted[j] then
        static if DEBUG_FLAG then
         call BJDebugMsg("Mounted: fail(no place to mount)!")
        endif
         return false // fail
       endif
       
     set j = j + 1 
    endloop
    
      set ms = GetMissSlot()
      if ms != 0 then
    
        set NOW_MOUNTED = NOW_MOUNTED + 1
        set InvisUnit[ms] = u
        call ShowUnit(u,false)
        call SetUnitOwner(t,Player(id),false)
        set MountedUnit[ms] = CreateUnit(Player(id),CLONE_ID[i],GetUnitX(t),GetUnitY(t),GetUnitFacing(t))
        set UnitMounted[ms] = t
        call UnitAddAbility(MountedUnit[ms],'Aave')
        call UnitRemoveAbility(MountedUnit[ms],'Aave')
        call UnitAddAbility(MountedUnit[ms],'Aloc')
        call UnitRemoveAbility(MountedUnit[ms],'Aloc')
        set OnMOUNT[ms] = true
        set MISSED_SLOT[ms] = 0
        
      else
      
        set NOW_MOUNTED = NOW_MOUNTED + 1
        set MaxUnit = MaxUnit + 1
        set InvisUnit[MaxUnit] = u
        call ShowUnit(u,false)
        call SetUnitOwner(t,Player(id),false)
        set MountedUnit[MaxUnit] = CreateUnit(Player(id),CLONE_ID[i],GetUnitX(t),GetUnitY(t),GetUnitFacing(t))
        set UnitMounted[MaxUnit] = t
        call UnitAddAbility(MountedUnit[MaxUnit],'Aave')
        call UnitRemoveAbility(MountedUnit[MaxUnit],'Aave')
        call UnitAddAbility(MountedUnit[MaxUnit],'Aloc')
        call UnitRemoveAbility(MountedUnit[MaxUnit],'Aloc')
        set OnMOUNT[MaxUnit] = true
        set MISSED_SLOT[MaxUnit] = 0
      
      endif
      
       static if DEBUG_FLAG then
        call BJDebugMsg("Mounted: success!")
       endif
      return true // success
     endif
     
    set i = i + 1
   endloop
   
    static if DEBUG_FLAG then
     call BJDebugMsg("Mounted: fail(unregistred unit)!")
    endif
   return false // fail
  endfunction
 
 function UnMountUnit takes unit u returns boolean
   local integer i=0
   
   loop
    exitwhen(i>MaxUnit) 
     if (u == MountedUnit[i]) or (u == InvisUnit[i]) or (u == UnitMounted[i]) then
     
      set OnMOUNT[i] = false
      set NOW_MOUNTED = NOW_MOUNTED - 1
      call SetUnitFlyHeight(MountedUnit[i],0.0,300.0)
      call SetUnitX(InvisUnit[i],GetUnitX(MountedUnit[i]))
      call SetUnitY(InvisUnit[i],GetUnitY(MountedUnit[i]))
      call SetUnitFacing(InvisUnit[i],GetUnitFacing(MountedUnit[i]))
      call SetUnitOwner(UnitMounted[i],Player(15),false)
      call RemoveUnit(MountedUnit[i])
      call ShowUnit(InvisUnit[i],true)
      set MountedUnit[i] = null
      set UnitMounted[i] = null
      set InvisUnit[i]        = null
      set MISSED_SLOT[i] = i
       static if DEBUG_FLAG then
        call BJDebugMsg("Unmounted: success!")
       endif
      return true // success
      
     endif
     set i = i + 1
    endloop
    
    static if DEBUG_FLAG then
     call BJDebugMsg("Unmounted: fail!")
    endif
   return false // fail
  endfunction
 
 private function UnitPlusMaunt takes nothing returns nothing
    local integer i=1
    
  if NOW_MOUNTED > 0 then
    loop
     exitwhen(i>MaxUnit)
       if OnMOUNT[i] then
       
        call SetUnitFacing(MountedUnit[i],GetUnitFacing(UnitMounted[i]))
        call SetUnitX(MountedUnit[i],GetUnitX(UnitMounted[i]))
        call SetUnitY(MountedUnit[i],GetUnitY(UnitMounted[i]))
        call SetUnitFlyHeight(MountedUnit[i],MOUNT_HIGHT[GetMountId(GetUnitTypeId(UnitMounted[i]))],0.0)
        call SetUnitAnimationByIndex(MountedUnit[i],ANIM_ID[i])
        
       endif
      set i = i + 1
    endloop
   endif
    
  endfunction
 
 private function InitSystem takes nothing returns nothing
   call TimerStart(UpTimer,TIMER_PEREODIC,true,function UnitPlusMaunt)
 endfunction
 
endlibrary

Лог работ:
» v1.0 -> v1.1
1.Переписана большая часть кода
2.Теперь нормально ездит по горам
3.Юнит больше не трясется
4.Изменена настройка.
» v1.1 -> v1.1a
1.Улучшена читабельность
2.Разделено на 2 триггера, регестрация и система.
» v1.1a -> v1.2
1. Улучшена работа циклов
2. Теперь система не работает в холостую
3. Теперь на vJass
4. Добавлено управление анимациями
---
Наработка добавлена на сайт.
Награда: 300 очков опыта.
Прикрепленные файлы
Тип файла: w3x Mount v1.2.w3x (23.4 Кбайт, 163 просмотров )

Отредактировано Oxygen D, 14.02.2012 в 13:43.
Старый 03.02.2012, 02:06
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Oxygen D, не все задроты MMOшек
Что то минусы преобладают. Да и минусы какие то кривые, без которых можно было обойтись

alexprey добавил:
Цитата:
Сообщение от Oxygen D
[ - ] На каждого юнита который может садится на маунта должен быть даммик с такой же моделькой, но тип ходьбы должен быть летающий.

А способность сфинкса уже не канает??
Цитата:
Сообщение от Oxygen D
[ - ] Если присмотреться, то во время езды, юнит на маунте немного трясется.

что ты с ним такого делал?
Цитата:
Сообщение от Oxygen D
[ - ] Пока,что не ставил проигрывание нужной анимации во время езды, но позже исправлю.

Анима не важна
Старый 03.02.2012, 12:37
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
alexprey:
что ты с ним такого делал?
Исправлено.
А способность сфинкса уже не канает??
Проходимость на земле остается. Уже пробовал.
Анима не важна
Поэтому сразу и не поставил. Кому надо прикрутят.
Я щас заметил что при въезде на горку юнит улетает. Исправляю.
Старый 03.02.2012, 12:44
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Oxygen_D:
[ + ] Легко настраивается
Не нашел ни одной настройки. Код ужасный. Как не читаемый так еще и лажовый. Ужасная смесь обычного jass с cJass. Ты хоть определись на каком языке пишешь.
Пруфы
((код jass
set createx = GetPolarX(-1000.0+(CreateDist*i),250,360.0)
set createy = GetPolarY(-3025.0+(CreateDist*i),250,360.0)
u1=CreateUnit(Player(15),'hfoo',createx,createy,90.0)
u2=CreateUnit(Player(15),'hmtt',createx,createy,90.0)
=============
function GetPolarX takes real source, real dist, real angle returns real
local real a = source + dist * Cos(angle * bj_DEGTORAD)
return a
endfunction
function GetPolarY takes real source, real dist, real angle returns real
local real a = source + dist * Sin(angle * bj_DEGTORAD)
return a
endfunction
))
alexprey добавил:
Oxygen_D:
Проходимость на земле остается. Уже пробовал.
SetX \ SetY - исправляет
Oxygen_D:
Анима не важна
Поэтому сразу и не поставил. Кому надо прикрутят.
С твоим кодом это не реально
alexprey добавил:
Oxygen_D:
Исполнение: cJass
исправь на
cJass 5% - Jass 80%
и будет норм =)
Старый 03.02.2012, 12:49
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
alexprey, омг. Нашел какой-то левый открывок кода из теста и начал атаку.
Открой пожалуйста папочку Mount и там Mount Sys и взгляни, ок?
Oxygen D добавил:
Oxygen_D, Этот код не для того, чтобы вам читать это просто для теста.
Oxygen D добавил:
alexprey, Лучше бы помог мне с подъемом на гору. А то там ерунда получается. Юнит улетает.
Старый 03.02.2012, 12:58
Holocauster
INRI
offline
Опыт: 4,249
Активность:
Ну, а теперь и минусы:
---------------------------------------
- Если юнит умирает, то маунт не становится нейтральным (а должен).
- Если выбрать "наездника" и приказать ему идти, то он будет идти (анимация Walk).
Попробуй дать маунту способность "москиты", и сделать так, чтобы при приказе всаднику двигаться у него не воспроизводилась анимация хотьбы (запрети ее триггерно), а у маунта воспроизводилась. И передай управление не маунту а всаднику. И чтоб маунт следовал за всадником.
Старый 03.02.2012, 13:00
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Oxygen_D:
alexprey, омг. Нашел какой-то левый открывок кода из теста и начал атаку.
Открой пожалуйста папочку Mount и там Mount Sys и взгляни, ок?
Там тоже не лучше. Писать нужно в одном стиле, а у тебя куча всякой не нужной ерунды.
Oxygen_D:
alexprey, Лучше бы помог мне с подъемом на гору. А то там ерунда получается. Юнит улетает.
Проецировать движение пробовал?
Старый 03.02.2012, 13:03
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Holocauster:
[ - ] Если юнит умирает, то маунт не становится нейтральным (а должен).
Исравлю
[ - ] Если выбрать "наездника" и приказать ему идти, то он будет идти.
Как разберусь с подъемом на гору, тоже исправлю.
Oxygen D добавил:
alexprey, Нет, не подскажешь?
Старый 03.02.2012, 13:05
Holocauster
INRI
offline
Опыт: 4,249
Активность:
Попробую похожее на гуи слепить. Не возражаешь, если твою карту возьму, просто триггеры с нуля сделаю (в джазе все равно не шарю XD)
Старый 03.02.2012, 13:07
alpha

offline
Опыт: 7,387
Активность:
Почему настройка системы внутри кода, а не в первом посте?
Чего система с дэбагом?
alpha добавил:
Отступы нормальные поставь, а не такие какие тебе нравятся, если делаешь систему расчитывая на то, что твой код будут проверять
alpha добавил:
Код раздели на два триггера, один где происходит настройка(Unit registration), второй - тело системы
Старый 03.02.2012, 16:10
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
alpha:
Чего система с дэбагом?
Ну как бы для проверки. Дебаг то можно и выключить.
Код раздели на два триггера, один где происходит настройка(Unit registration), второй - тело системы
ок. Ждите.
Oxygen D добавил:
Обновил.
Старый 03.02.2012, 16:27
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Holocauster, Смеялся долго:D
  1. Конь стоит, гном бегает по коню XD
  2. 200% рандомной походки по горам
[ - ] У героя меняются имена и сбрасываются спелы(
Невозможно было поставить спелы.
Oxygen D добавил:
Oxygen_D:
[ + ] Легкость импорта.
Импорта у меня в 1 триггер, а у тебя в целую папку:)
Старый 03.02.2012, 16:37
Holocauster
INRI
offline
Опыт: 4,249
Активность:
Все , что ты сказал, это 3 и 4 минусы. Работаю над этим. Если поработать, то будет неплохо кстати.
Старый 03.02.2012, 16:41
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Holocauster, Если ты думаешь, что проблема с анимками, то это не так. Там нужно правильно юнита на горе ставить.
Oxygen D добавил:
Holocauster, Единственный + это то, что ты можешь прям с маунта спелы кастовать.
Старый 03.02.2012, 16:45
alpha

offline
Опыт: 7,387
Активность:
  private void InitSystem(){
    TimerStart(UpTimer,0.025,true,function UnitPlusMaunt)
  }
Действие запуска таймера перенеси в функцию MountUnit, т.е в случае если юнитов-наездников в карте нет - таймер идет, юнит-наездник появляется - таймер начинает работу, также делай создание таймера и внеси нужные действия в функцию UnMountUnit
alpha добавил:
убери из системы BJ-циклы, где exitwhen константно стоит в начале
alpha добавил:
Oxygen_D:
alpha:
Чего система с дэбагом?
Ну как бы для проверки. Дебаг то можно и выключить.
Ты должен выкладывать готовый продукт, а не то, что следует после установки проверять =)
Проверка нужна лишь в том случае, если пользователь может неправильно настроить систему, в установке система проста, так что думаю "проверки" - лишнее
Старый 03.02.2012, 16:52
Holocauster
INRI
offline
Опыт: 4,249
Активность:
alpha, а ты не мог бы у мя глянуть что не так?
С горой норм, разобрался. с анимками нет. Карту перезалил
Holocauster добавил:
Oxygen_D:
Конь стоит, гном бегает по коню XD
  • работаем над этим
200% рандомной походки по горам
  • Исправил
У героя меняются имена и сбрасываются спелы(
Невозможно было поставить спелы.
  • Исправил
Oxygen D добавил:
Oxygen_D:
[ + ] Легкость импорта.
Импорта у меня в 1 триггер, а у тебя в целую папку:)
Ну все равно же)

Отредактировано Holocauster, 16.02.2012 в 19:14.
Старый 03.02.2012, 17:54
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
alpha:
убери из системы BJ-циклы, где exitwhen константно стоит в начале
Чево?О_О Какие ещё BJ-циклы?!!!
Старый 03.02.2012, 17:59
Oxygen D
Вернулся
offline
Опыт: 5,180
Активность:
Вообщем, как удобнее мне так я и пишу.
Msey, а ты случаем не ландер?
Oxygen D добавил:
alpha, Господи.. что-то случится от того, что у меня проверка наверху?
NO
Oxygen D добавил:
Я не вижу большой проблемы в этом цикле и поэтому я пишу так, как удобнее мне.
Старый 03.02.2012, 21:23
GadenbIsh
Просто Гад
offline
Опыт: 70,930
Активность:
Oxygen_D, Говоря на языке программиста (ко мне не относится), то его пример более универсальный. Ты же не будешь проверять в начале футбольного матча забитые голы, верно?
Ну, вы не правы. В нормальных языках есть циклы с предусловием (while, for) и с постусловием (do.. while). И намного чаще как раз используются циклы с предусловием. Другое дело, что обычно в ЯП ставится условие продолжения действия, а не условие выхода, как здесь.
Старый 03.02.2012, 22:55
Tapok777

offline
Опыт: 510
Активность:
Oxygen D, порадовал)) Сам относительно давно сделал систему маунтов, но на ГУИ, так как в Jass я полный ноль (с устранением утечек мне помог Manhun1)
Мой совет - попробуй прикрутить систему туррелей, чтобы например один юнит (или игрок) играл роль водителя, а его друзья в это время отстреливались из туррелей) - будет намного интереснее, да и веселья от использования "коллективных" маунтов намного больше, чем от езды на них в одиночестве) Всё очень просто - туррели - отдельные юниты, такие же, как и собственно само "тело" транспортного средства, но их местоположение изменяется относительно "тела", как и положение водителя. И к ним также могут присоединяться "водители", которые собственно могут вести стрельбу.
Не ограничивайся простыми маунтами)) Старую карту с такой системой кинул тебе в личку, не ругайся, что всё на ГУИ, обрати внимание на необходимую систему коллизии для адекватного поведения "сложного маунта" в игре.
[+] замечание от Msey: Свои творчества публикуем в отдельных темах

Отредактировано Tapok777, 04.02.2012 в 13:19.
Старый 04.02.2012, 08:16
Ответ

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

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

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

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



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