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

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

Ответ
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Ограничение движения дамми
Дамми передвигается переодическим триггером
Как выставить ограничение в функции так чтобы дамми удалялся до выхода за пределы карты
Старый 31.01.2010, 22:47
XOR

offline
Опыт: 38,159
Активность:
if GetRectMax/MinX/Y(bj_initial_map_area) <> GetUnitX/Y
И у векса была такая библиотека.
Старый 31.01.2010, 22:58
DioD

offline
Опыт: 45,134
Активность:
если новые координаты выходят за пределы игровой зоны не выполнять передвижение или вовсе его прекратить.
библиотека векса же заставляет юнита вести себя жутким образом.
Старый 01.02.2010, 07:58
SRes
1110101000
offline
Опыт: 9,997
Активность:
Любезно поделюсь готовыми функциями (для ленивых) :
Код:
private function SetUnitXS takes unit u, real x returns nothing
    if ( GetRectMaxX( bj_mapInitialPlayableArea) < x) then
        set x = GetRectMaxX( bj_mapInitialPlayableArea)
    endif
    if ( GetRectMinX( bj_mapInitialPlayableArea) > x) then
        set x = GetRectMinX( bj_mapInitialPlayableArea)
    endif
    call SetUnitX( u, x)
endfunction
private function SetUnitYS takes unit u, real y returns nothing
    if ( GetRectMaxY( bj_mapInitialPlayableArea) < y) then
        set y = GetRectMaxY( bj_mapInitialPlayableArea)
    endif
    if ( GetRectMinY( bj_mapInitialPlayableArea) > y) then
        set y = GetRectMinY( bj_mapInitialPlayableArea)
    endif
    call SetUnitY( u, y)
endfunction
Старый 01.02.2010, 09:38
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Добрый всем вечер
Немогли бы мне оъяснить private это что за функция? ни разу не пробовал их сделать, да и вообще не сталкивался
Старый 05.02.2010, 20:16
Nekit1234007

offline
Опыт: 11,916
Активность:
private ограничивает видимость функции (и не только их) в библиотеках, областях и во многих других местах в вДжассе.
Код:
library A
    private function B takes something returns something
    endfunction
endlibrary

// Где-то глубоко в коде:
...
    call B() // Syntax Error такой функции "какбы нет"
...
Старый 05.02.2010, 20:27
Sunn
To feel joy, not be blue
offline
Опыт: 4,975
Активность:
По сути ничего такого астрального в private функциях нет. ВЖасс просто прибавляет приватные префиксы к именам всех переменных и функцияй, которые были обьявлены как приватные, т.е. если рассмотреть пример Некита, то написав не
Код:
call B()

а
Код:
call A__B()

мы бы таки вызвали эту приватную функцию, хоть по идее и не можем этого делать.
Приватными можно смело обьявлять все внутренние переменные и функции всяческих системок во избежание конфликтов имен и неосторожных вызовов.
Всю эту билиберду с именами важно помнить при использовании ExecuteFunc. Ибо фаталы.
Старый 05.02.2010, 21:10
Nekit1234007

offline
Опыт: 11,916
Активность:
Sunn, неполучицца, после каждой компиляции количество "_" меняется.
Старый 05.02.2010, 21:14
Sunn
To feel joy, not be blue
offline
Опыт: 4,975
Активность:
Кстати да. Раньше не замечал. Где-то каждая из трёх-четырёх компиляций ругается на неизвестную функцию.
Вот так вот.
Старый 05.02.2010, 21:18
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
~Nekit1234007, тоесть для того чтобы сделать в моем таймере по движению ограничение нужно:
1)создать библиотеку а в ней приват функцию
2)при движении перед тем как двигать сделать оператор иф

а вот SRes, написал
> if ( GetRectMaxX( bj_mapInitialPlayableArea) < x) then
set x = GetRectMaxX( bj_mapInitialPlayableArea)
endif
if ( GetRectMinX( bj_mapInitialPlayableArea) > x) then
set x = GetRectMinX( bj_mapInitialPlayableArea)
endif
call SetUnitX( u, x)

гетрект это что? что-то вроде дистанции?

ну вот пробую написать:
Код:
library A
    private function B takes unit u, real x, real y returns nothing
    if ( GetRectMaxX( bj_mapInitialPlayableArea) < x) then
        set x = GetRectMaxX( bj_mapInitialPlayableArea)
    endif
    if ( GetRectMinX( bj_mapInitialPlayableArea) > x) then
        set x = GetRectMinX( bj_mapInitialPlayableArea)
    endif
 if ( GetRectMaxY( bj_mapInitialPlayableArea) < y) then
        set y = GetRectMaxY( bj_mapInitialPlayableArea)
    endif
    if ( GetRectMinY( bj_mapInitialPlayableArea) > y) then
        set y = GetRectMinY( bj_mapInitialPlayableArea)
    endif
    call SetUnitY( u, y)
    call SetUnitX( u, x) // тоесть не в таймере а уже тут сетать?
    endfunction
endlibrary

function timer takes nothing returns nothing
   // call SetUnitX(Dummy, XN+30*Cos(Angle))  вместо них просто вызвать ф-цию?
   // call SetUnitY(Dummy,YN+30*Sin(Angle))    вместо них просто вызвать ф-цию?
    call B()

function actions ........
    ........
    call TimerStart(t,.05,true,timer)
endfuction
Старый 05.02.2010, 21:32
XOR

offline
Опыт: 38,159
Активность:
GetRectMax/MinX/Y возвращает верхний, нижний, правый, левый углы.
XiMiKs добавил:
  • если уж делаешь функции приватными (у среса это был вообще просто пример), не надо их пытаться использовать снаружи.
  • timer некорректное имя функции
  • куча лишних скобок и т.д.
Старый 05.02.2010, 22:45
SRes
1110101000
offline
Опыт: 9,997
Активность:
В общем-то я просто забыл убрать private (тогда спешил, да и джасс давно не ковыряю), копировал из своей карты.
Код:
function SetUnitXS takes unit u, real x returns nothing
    if ( GetRectMaxX( bj_mapInitialPlayableArea) < x) then
        set x = GetRectMaxX( bj_mapInitialPlayableArea)
    endif
    if ( GetRectMinX( bj_mapInitialPlayableArea) > x) then
        set x = GetRectMinX( bj_mapInitialPlayableArea)
    endif
    call SetUnitX( u, x)
endfunction
function SetUnitYS takes unit u, real y returns nothing
    if ( GetRectMaxY( bj_mapInitialPlayableArea) < y) then
        set y = GetRectMaxY( bj_mapInitialPlayableArea)
    endif
    if ( GetRectMinY( bj_mapInitialPlayableArea) > y) then
        set y = GetRectMinY( bj_mapInitialPlayableArea)
    endif
    call SetUnitY( u, y)
endfunction

Просто вставляешь это где-нибудь вначале кода, а потом используешь ЭТИ функции, вместо обычных, эти функции ограничивают x, y по максимальным x, y карты.
Цитата:
call SetUnitXS(Dummy, XN+30*Cos(Angle))
call SetUnitYS(Dummy, YN+30*Sin(Angle))

Вроде такого.
Старый 05.02.2010, 22:47
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
~XiMiKs, этот код примером писал

Цитата:
Просто вставляешь это где-нибудь вначале кода, а потом используешь ЭТИ функции, вместо обычных, эти функции ограничивают x, y по максимальным x, y карты.

то есть перемещать в таймере уже не надо, просто вызвать функции ограничители?

» раскрыть

function SetUnitXS takes unit u, real x returns nothing
if ( GetRectMaxX( bj_mapInitialPlayableArea) < x) then
set x = GetRectMaxX( bj_mapInitialPlayableArea)
endif
if ( GetRectMinX( bj_mapInitialPlayableArea) > x) then
set x = GetRectMinX( bj_mapInitialPlayableArea)
endif
call SetUnitX( u, x)
endfunction
function SetUnitYS takes unit u, real y returns nothing
if ( GetRectMaxY( bj_mapInitialPlayableArea) < y) then
set y = GetRectMaxY( bj_mapInitialPlayableArea)
endif
if ( GetRectMinY( bj_mapInitialPlayableArea) > y) then
set y = GetRectMinY( bj_mapInitialPlayableArea)
endif
call SetUnitY( u, y)
endfunction

function timerTest takes nothing returns nothing
call SetUnitXS()
call SetUnitYS()
endfunction

function actions ........
........
call TimerStart(t,.05,true,timerTest)
endfunction


ладно такое чувство что я буду в ограничение движение вдуплять столько же сколько учился его двигать :D
Старый 06.02.2010, 10:28
SRes
1110101000
offline
Опыт: 9,997
Активность:
Эти функции ничего не заменяют, кроме SetUnitX\Y...
Старый 06.02.2010, 10:37
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
function MapContainsCoords takes real x, real y returns boolean
    return (GetRectMinX(bj_mapInitialPlayableArea) <= x) and (x <= GetRectMaxX(bj_mapInitialPlayableArea)) and (GetRectMinY(bj_mapInitialPlayableArea) <= y) and (y <= GetRectMaxY(bj_mapInitialPlayableArea))
endfunction
засунь этот код в Custom Srcipt карты
если координаты находятся в пределах карты то вернет true
что вы паритесь то?
Bee добавил:
просто перед тем как переместить дамми по новым координатам проверяещь их по вышеуказанной функции
Старый 06.02.2010, 10:59
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
~Bee, опиши пожалуйста примером кодом
ну просто я еще так и не научился возращать значения из ф-ций
примерно так:
» раскрыть
Код:
if  function MapContainsCoords returns true then
    call SetUnitX(d,Xd+70*Cos(ang))
    call SetUnitY(d,Yd+70*Sin(ang))
else 
RemoveUnit(d)
?
Старый 10.02.2010, 15:15
Nekit1234007

offline
Опыт: 11,916
Активность:
Код:
if MapContainsCoords(<Твоя координата х>,<Твоя y>) then
   // Твои действия
endif
Старый 10.02.2010, 15:18
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Nekit1234007, понял спасибо
только одна странность, когда вылетает за пределы он не удаляется а просто останавливается, почему так?

AlexKARASb добавил:
спасибо всем за то что объяснили ^___^
все тему можно закрыть
Старый 10.02.2010, 15:57
agentex

offline
Опыт: 34,834
Активность:
public круче, их можно юзать в executefunc (ExecuteFunc(область_функция)) в отличие от привате
Старый 10.02.2010, 16:24
Nekit1234007

offline
Опыт: 11,916
Активность:
ExecuteFunc(SCOPE_PRIVATE+"FunctionName")
Старый 10.02.2010, 16:27
Ответ

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

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

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

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



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