Сейчас 20:29:17 Четверг, 28 марта, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Как проверить точку на проходимость?
Как проверить точку на проходимость?
rixt7956Дата: Суббота, 08 Января 2011, 14:18:58 | Сообщение # 1
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Как проверить точку на проходимость без использования функции IsTerrainPathable и поставки дамми?


Сообщение отредактировал rixt7956 - Суббота, 08 Января 2011, 15:01:40
 

Manko_OДата: Суббота, 08 Января 2011, 14:23:24 | Сообщение # 2
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
Больше нет вариантов.Юзай
Quote (rixt7956)
IsTerrainPathable
 

rixt7956Дата: Суббота, 08 Января 2011, 14:25:21 | Сообщение # 3
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (Manko_O)
Больше нет вариантов.
Вобщето есть, к примеру ControlSystem by MF там это сделано, но я не понял как оно там сделано.
 

Manko_OДата: Суббота, 08 Января 2011, 14:35:55 | Сообщение # 4
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
Скажи зачем тебе проверять проходимость. Какие действия? Может чтото подберём.
 

rixt7956Дата: Суббота, 08 Января 2011, 14:40:32 | Сообщение # 5
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Щас тебе дам код, сделаешь так чтобы юнит не проходил сквозь деревья и воду, буду тебе месяц ставить плюсы (но что бы без лагов)
 

AjaccioДата: Суббота, 08 Января 2011, 14:44:07 | Сообщение # 6
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Code

call SetUnitPosition(unit, x, y)

Похоже в ControlSystem сделано гениально и просто. Проверки просто нет.
Движение сделано через эту функцию и она сама проверяет все условия.


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

rixt7956Дата: Суббота, 08 Января 2011, 14:45:03 | Сообщение # 7
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Code
    function OtrCondition takes nothing returns boolean
return GetSpellAbilityId()=='A003'
      endfunction

function Trig_Otr_Act3 takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer th=GetHandleId(t)
local unit u=LoadUnitHandle(udg_HMDU,th,0)
local real angle=LoadReal(udg_HMDU,th,1)
local real speed=LoadReal(udg_HMDU,th,2)
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local real x1=PolarX(x,speed,angle)
local real y1=PolarY(y,speed,angle)
local integer i=GetRandomInt(1,2)
      if IsTerrainPathable(x1,y1,PATHING_TYPE_WALKABILITY) then
              loop
                      if i==1 then
                          set angle=angle-45
                      elseif i==2 then
                          set angle=angle+45
                      endif
                  set x1=PolarX(x,speed,angle)
                  set y1=PolarY(y,speed,angle)
                  exitwhen IsTerrainPathable(x1,y1,PATHING_TYPE_WALKABILITY)==false
              endloop
          set speed=speed-2
      endif
      if IsTerrainPathable(PolarX(x,speed,angle),PolarY(y,speed,angle),PATHING_TYPE_WALKABILITY)==false then
          set x1=PolarX(x,speed,angle)
          set y1=PolarY(y,speed,angle)
          call SetUnitX(u,x1)
          call SetUnitY(u,y1)
          call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl",x,y))
          set speed=speed-0.5
      endif
      if speed<=0 then
          call FlushChildHashtable(udg_HMDU,th)
          call PauseTimer(t)
          call DestroyTimer(t)
      else
          call SaveReal(udg_HMDU,th,1,angle)
          call SaveReal(udg_HMDU,th,2,speed)          
      endif
set t=null
set u=null
endfunction

      function Trig_Otr_Act2 takes unit u,unit u2 returns nothing
local timer t=CreateTimer()
local integer th=GetHandleId(t)
local real x1=GetUnitX(u)
local real y1=GetUnitY(u)
local real x2=GetUnitX(u2)
local real y2=GetUnitY(u2)
local real angle=bj_RADTODEG*Atan2(y2-y1,x2-x1)
local real speed=20-XYdist(x1,y1,x2,y2)/100

call SaveUnitHandle(udg_HMDU,th,0,u2)
call SaveReal(udg_HMDU,th,1,angle)
call SaveReal(udg_HMDU,th,2,speed)

call TimerStart(t,0.03,true,function Trig_Otr_Act3)

set t=null
      endfunction

      function Trig_Otr_Actions takes nothing returns nothing
local unit u=GetTriggerUnit()
local unit uu
local group g=CreateGroup()
call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitY(u),500,null)
      loop
          set uu=FirstOfGroup(g)
          exitwhen uu==null
              if IsUnitEnemy(uu,GetOwningPlayer(u)) and GetUnitState(uu,UNIT_STATE_LIFE)>0 then
                  call Trig_Otr_Act2(u,uu)
              endif
          call GroupRemoveUnit(g,uu)
      endloop
call DestroyGroup(g)
set u=null
set g=null
      endfunction

//===========================================================================
      function InitTrig_Otr takes nothing returns nothing
local trigger tr=CreateTrigger()
local integer i=0
      loop
          call TriggerRegisterPlayerUnitEvent(tr,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
          set i=i+1
          exitwhen i==12
      endloop
call TriggerAddCondition(tr,Condition(function OtrCondition))
call TriggerAddAction(tr, function Trig_Otr_Actions )
set tr=null
      endfunction

XYdist - это дистанция между точками, а PolarX и Y смещение соответственно просто я забыл CustomCode скопировать


Сообщение отредактировал rixt7956 - Суббота, 08 Января 2011, 14:52:20
 

Manko_OДата: Суббота, 08 Января 2011, 14:46:50 | Сообщение # 8
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
rixt7956,
Все
call SetUnitX(------)
call SetUnitY(-----)
На -
Quote (Ajaccio)
call SetUnitPosition(unit, x, y)

Кеп рядом. Я и забыл =)
 

rixt7956Дата: Суббота, 08 Января 2011, 14:47:07 | Сообщение # 9
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (Ajaccio)
Похоже в ControlSystem сделано гениально и просто. Проверки просто нет.
Движение сделано через эту функцию и она сама проверяет все условия.
Если бы всё делалось именно так то при столкновении с препятствием юнит бы сильно дёргался и его выносило в бок
 

Manko_OДата: Суббота, 08 Января 2011, 14:47:53 | Сообщение # 10
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
Щас глянем.
 

rixt7956Дата: Суббота, 08 Января 2011, 14:48:19 | Сообщение # 11
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Manko_O, Ну попробуй так сделать, юнит тогда не будет отлетать от припятствий, смотри мой код
 

Manko_OДата: Суббота, 08 Января 2011, 14:49:36 | Сообщение # 12
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
Find - SetUnitX- none
Find - call SetUnitPosition - call SetUnitPosition(Units[i],Xh,Y)
Кеп тут.
 

AjaccioДата: Суббота, 08 Января 2011, 14:51:38 | Сообщение # 13
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Quote

Если бы всё делалось именно так то при столкновении с препятствием юнит бы сильно дёргался и его выносило в бок

При малых изменениях координат дерганье вряд ли случится.
И да, при столкновении юнита начинает заносить. Как во всех нормальных РПГ-играх. А что?


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

rixt7956Дата: Суббота, 08 Января 2011, 14:54:43 | Сообщение # 14
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (Manko_O)
Find - SetUnitX- none
Find - call SetUnitPosition - call SetUnitPosition(Units[i],Xh,Y)
А по русский

Добавлено (08-01-2011, 14:54)
---------------------------------------------

Quote (Ajaccio)
При малых изменениях координат дерганье вряд ли случится.
И да, при столкновении юнита начинает заносить. Как во всех нормальных РПГ-играх. А что?
Мой код с этой функцией не работает
 

Manko_OДата: Суббота, 08 Января 2011, 14:55:06 | Сообщение # 15
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
Quote (rixt7956)
А по русский

То что там используется
Quote (rixt7956)
call SetUnitPosition

А она не тп в точку где нет проходимости.
 

rixt7956Дата: Вторник, 11 Января 2011, 16:47:14 | Сообщение # 16
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Quote (Manko_O)
А она не тп в точку где нет проходимости.
Кароче она не подходит, думаешь я её не использывал.

Добавлено (08-01-2011, 15:00)
---------------------------------------------
Есть ещё варианты?

Добавлено (10-01-2011, 13:00)
---------------------------------------------
Ни кто не знает?

Добавлено (11-01-2011, 16:47)
---------------------------------------------
Тому кто ответит будет месяц плюсов

Сообщение отредактировал rixt7956 - Понедельник, 10 Января 2011, 11:44:36
 

incomeДата: Вторник, 11 Января 2011, 16:52:06 | Сообщение # 17
3 уровень
Группа: Заблокированные
Сообщений: 63
Награды: 0
Репутация: 20
Блокировки:
на хайве часто видел создают предмет и скрывают его, затем проверяют координаты предмета и нужные, если разные - значит точка непроходима

Не ошибается только тот, кто ничего не делает


Сообщение отредактировал income - Вторник, 11 Января 2011, 16:54:40
 

rixt7956Дата: Вторник, 11 Января 2011, 18:54:01 | Сообщение # 18
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
income, мне не вариант на хайве искать
 

Manko_OДата: Вторник, 11 Января 2011, 19:22:18 | Сообщение # 19
7 уровень
Группа: Проверенные
Сообщений: 296
Награды: 0
Репутация: 23
Блокировки:
Quote (rixt7956)
мне не вариант на хайве искать

PЗачм искать?
Code
local real x  //нужная тебе X точка для проверки
local real y  //нужная тебе Y точка для проверки
local item t = CreateItem('texp',x,y)
local real x2 = GetItemX(t)
local real y2 = GetItemY(t)
call SetItemVisible(t,false )
if y == y2 and x == x2 then
//точка прохадима
else
//точка не проходима
endif
call RemoveItem(t)
set t = null
 

rixt7956Дата: Вторник, 11 Января 2011, 23:38:15 | Сообщение # 20
9 уровень
Группа: Проверенные
Сообщений: 1097
Награды: 0
Репутация: 153
Блокировки:
Тоже самое что подставлять юнита, а это будет не оптимизировано, мой код работает с группой.

Добавлено (11-01-2011, 23:38)
---------------------------------------------
Плюс все равно тебе потом поставлю, но мне нужны еще варианты.

 

HexingДата: Среда, 16 Ноября 2011, 11:24:46 | Сообщение # 21
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
c предметом - оптимальный

 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Как проверить точку на проходимость?
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz