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

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

Закрытая тема
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Помогите исправить код
Vampirrr добавил:
Код:
function my_function takes nothing returns nothing 
local integer a
local integer b
local integer CheckSelection 

if ( GetOwningPlayer(GetTriggerUnit()) == Player(0)) and  (( GetUnitTypeId(GetTriggerUnit()) == 'hmtt') or ( GetUnitTypeId(GetTriggerUnit()) == 'ocat' ) or ( GetUnitTypeId(GetTriggerUnit()) == 'ebal' ) or ( GetUnitTypeId(GetTriggerUnit()) == 'umtw' )) then

set a = 1
loop       
    exitwhen a == 64
    set a = a+1        

 if ( IsUnitInGroup(GetTriggerUnit(), GetUnitsInRectAll(udg_Square[ a ])) == true ) ) and ( udg_CheckSelection == 0 ) ) then 
endloop
set CheckSelection = 1
if ( ( a >= 25 ) and (a <= 32 )) then 

set b = 1 
loop  
       exitwhen b == 4
       set b = b+1 

if ( ( IsUnitGroupEmptyBJ(GetUnitsInRectOfPlayer(udg_Square[( a + ( 8 * b ) )], Player(0))) == true ) ) and ( ( IsUnitGroupEmptyBJ(GetUnitsInRectOfPlayer(udg_Square[( a + ( 8 * b ) )], Player(1))) == true ) ) then 

call CreateNUnitsAtLoc( 1, 'e001', GetTriggerPlayer(), GetRectCenter(udg_Square[( a + ( 8 * b ) )]), bj_UNIT_FACING )

endif
endloop
endfunction


в общем должно быть что-то в этом роде, но работать не будет, т.к. в последнем цикле мне нужно, что бы он заканчивался сразу же, как только в клетке, которые он считает замечался юнит..а еще у меня там ошибочки есть, постоянно endif требует и с каждым разом на строку выше =)
Старый 29.12.2008, 07:49
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Цитата:
loop
exitwhen a == 64
set a = a+1


После этого цикла a у тебя будет равно 64! Следовательно:
Цитата:
if ( ( a >= 25 ) and (a <= 32 )) then

set b = 1
loop
exitwhen b == 4
set b = b+1

if ( ( IsUnitGroupEmptyBJ(GetUnitsInRectOfPlayer(udg_Square[( a + ( 8 * b ) )], Player(0))) == true ) ) and ( ( IsUnitGroupEmptyBJ(GetUnitsInRectOfPlayer(udg_Square[( a + ( 8 * b ) )], Player(1))) == true ) ) then

call CreateNUnitsAtLoc( 1, 'e001', GetTriggerPlayer(), GetRectCenter(udg_Square[( a + ( 8 * b ) )]), bj_UNIT_FACING )

endif

У тебя я явно не будет выполняться!

Gres добавил:
И в конце нужно еще два endif'a добавить кажись!
Старый 29.12.2008, 07:56
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
так, делая на ГУИ, у меня в число а запоминалась клетка (номер региона) в котором находится наш юнит. И я делал так же, циклами..но в ГУИ не смог выйти из цикла когда надо..вот пытаюсь решить эту проблему джассом.

» триггер на ГУИ
RookRed
Events
Player - Player 1 (Red) Selects a unit
Conditions
(Owner of (Triggering unit)) Equal to Player 1 (Red)
Or - Any (Conditions) are true
Conditions
(Unit-type of (Triggering unit)) Equal to Самоходная моÑ?тиÑ?а
(Unit-type of (Triggering unit)) Equal to Катапульта
(Unit-type of (Triggering unit)) Equal to Баллиста
(Unit-type of (Triggering unit)) Equal to ТÑ?уповозка
Actions
For each (Integer A) from 1 to 64, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
((Triggering unit) is in (Units in Square[(Integer A)])) Equal to True
CheckSelection Equal to 0
Then - Actions
Set CheckSelection = 1
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Integer A) Greater than or equal to 25
(Integer A) Less than or equal to 32
Then - Actions
For each (Integer B) from 1 to 4, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
((Units in Square[((Integer A) + (8 x (Integer B)))] owned by Player 1 (Red)) is empty) Equal to True
Then - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
((Units in Square[((Integer A) + (8 x (Integer B)))] owned by Player 2 (Blue)) is empty) Equal to True
Then - Actions
Custom script: exitwhen false
Unit - Create 1 . for (Triggering player) at (Center of Square[((Integer A) + (8 x (Integer B)))]) facing Default building facing (270.0) degrees
Else - Actions
Else - Actions
For each (Integer C) from 1 to 3, do (Actions)
Loop - Actions
Unit - Create 1 . for (Triggering player) at (Center of Square[((Integer A) - (8 x C))]) facing Default building facing (270.0) degrees
For each (Integer C) from 1 to (32 - (Integer A)), do (Actions)
Loop - Actions
Unit - Create 1 . for (Triggering player) at (Center of Square[((Integer A) + C)]) facing Default building facing (270.0) degrees
For each (Integer C) from 1 to ((Integer A) - 25), do (Actions)
Loop - Actions
Unit - Create 1 . for (Triggering player) at (Center of Square[((Integer A) - C)]) facing Default building facing (270.0) degrees
Else - Actions
Else - Actions


Vampirrr добавил:
ну так что мне делать?
Старый 29.12.2008, 08:16
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Непонял... из какого цикла! При каком условии? У тя цикл должен прекращаться когда a входит в промежуток от 25 до 32?
Старый 29.12.2008, 08:28
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Gres, таг, будет проще если ты карту посмотришь)

P.S.: не пытайся запустить ее в варике, не удалив джассовую версию триггера - выкидывает из эдитора..где ошибка, я хз..
Прикрепленные файлы
Тип файла: w3x Example.w3x (29.8 Кбайт, 15 просмотров )
Старый 29.12.2008, 08:30
J
expert
offline
Опыт: 48,447
Активность:
Vampirrr втф? я же тебе подробно расписал как находить клетку в которой находится твой юнит... прекращай тупить и убери этот цикл от 1 до 64
Старый 29.12.2008, 08:52
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Jon, блин, давай тут забудем про то что я хочу и просто поправим мне код? так сказать, совместим приятное с полезным..мне тут уже интересен джасс, а не решить проблему с созданием юнитов. И еще я хотел бы посмотреть как работает действие exitwhen true (false), в джассовом виде. Да и примерчик бы не помешал..
Старый 29.12.2008, 09:01
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Млин да помойму там код с нуля проще написать! Ты просто объясни конкретно что тебе нужно! Ибо у тя там ваще в одном цикле еще два цикла! Ужас!
Старый 29.12.2008, 09:13
J
expert
offline
Опыт: 48,447
Активность:
чтото типо...
Код:
// (!!)индексация ректов от 0 до 63 включительно(!!)
function my_function takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local integer Column = R2I((GetUnitX(u)-<ВерхнийЛевыйУголДоски.x>)/<РазмерЯчейки.x>)
    local integer Row    = R2I((<ВерхнийЛевыйУголДоски.y>-GetUnitY(u))/<РазмерЯчейки.y>)
    local integer IndexRect = Column+Row*<КоличествоЯчеекПоШирине> //Это <то значение что ты получал с помощью цикла от 1 до 64>-1
    local integer c = Column
    local integer r = Row 
    local integer i
    loop
        set c = c - 1
        exitwhen c < 0
        set i = c+r*<КоличествоЯчеекПоШирине>
        call <ПоставитьСтрелкуНаЯчейку>(udg_Square[i])
        if <ВРектеНаходитсяЮнит>(udg_Square[i]) then
            exitwhen true
        endif
    endloop
    set c = Column
    loop
        set c = c + 1
        exitwhen c >= <КоличествоЯчеекПоШирине>
        set i = c+r*<КоличествоЯчеекПоШирине>
        call <ПоставитьСтрелкуНаЯчейку>(udg_Square[i])
        if <ВРектеНаходитсяЮнит>(udg_Square[i]) then
            exitwhen true
        endif
    endloop
    set c = Column
    loop
        set r = r - 1
        exitwhen r < 0
        set i = c+r*<КоличествоЯчеекПоШирине>
        call <ПоставитьСтрелкуНаЯчейку>(udg_Square[i])
        if <ВРектеНаходитсяЮнит>(udg_Square[i]) then
            exitwhen true
        endif
    endloop
    set r = Row 
    loop
        set r = r + 1
        exitwhen r >= <КоличествоЯчеекПоВысоте>
        set i = c+r*<КоличествоЯчеекПоШирине>
        call <ПоставитьСтрелкуНаЯчейку>(udg_Square[i])
        if <ВРектеНаходитсяЮнит>(udg_Square[i]) then
            exitwhen true
        endif
    endloop
    set u = null
endfunction

Отредактировано J, 02.01.2009 в 14:23.
Старый 29.12.2008, 09:14
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Jon, спс, буду разбирать)

Gres - http://xgm.guru/forum/showthread.php?t=21136 вот с чего все начиналось))) лучше чем там, объяснить не могу)
Старый 29.12.2008, 09:20
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
1 цикл не работает (я только его оставил, остальные 3 цикла обрезал для проверки)..ошибок не вылетает никаких, а толку от триггера 0. Но сам триггер работает - проверил выведением на экран из этого триггера значения моей глобалки.

Отредактировано Vampirrr, 30.12.2008 в 07:47.
Старый 30.12.2008, 06:36
J
expert
offline
Опыт: 48,447
Активность:
значит чтото неправельно зделал
Старый 30.12.2008, 09:44
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Jon, для начала, мне бы хотелось знать, сколько юнитов создастся, если верхняя левая точка иметт координаты (-1024, 256)..Не сложно посчитать что с будет негативно, в рез-те мы имеем негатив в целом числе i. Потом, если у нас i и есть положение нашего пикнутого юнита, то наш цикл сразу становится тру и заканчивается (ибо мы проверяем если в регионе i есть юнит, а он там есть - это наш пикнутый юнит). И потом у меня возникла проблема с проверкой юнита в ректе, поэтому я пользовался этой проверкой:

Код:
if (( IsUnitGroupEmptyBJ(GetUnitsInRectOfPlayer(udg_Square[a+8*b], Player(0))) == true ) or ( IsUnitGroupEmptyBJ(GetUnitsInRectOfPlayer(udg_Square[a+8*b], Player(1))) == true )) then


будь добр, подскажи оптимизированную проверку, т.к. действие

if (RectContainsUnit(udg_square(a), GetUnitsInRect(udg_square(a), Plater (0)) невозможно (ну так я себе представляю нормальную проверку =))..
Старый 30.12.2008, 09:59
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
что с будет негативно
с какого перепуга?
Цитата:
будь добр, подскажи оптимизированную проверку, т.к. действие
хм... вообщето нужно создать еще один массив, такой же как и ректы, только типа unit, который будет хранить под индексом фигуру что находится в соответствующем ректе... и потом проверку <ВРектеНаходитсяЮнит>(udg_Square[i]) можно сделать так Figure[i] != null
Старый 30.12.2008, 10:02
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Jon, по поводу массива типа юнит - постараюсь сделать. А вот по поводу негативного смотри - допустим юнит находится на клетке d4 (шахматная доска). "с" в этом случае будет равна (по твоей формуле) (0-1024\256) (0 это позиция юнита по X)..А потом мы еще и в цикле делаем c-1..Ясно дело что минус юниты создаватся не будут)
Старый 30.12.2008, 10:13
J
expert
offline
Опыт: 48,447
Активность:
если на d4, значит столбец == 4, т.е. кориднаты 256*3.5 (т.к. стоит по середине ячейки)
R2I((896-0)/256)=R2I(3.5)=3 // отсчет слобцов с нуля
будь внимательнее

Отредактировано Jon, 30.12.2008 в 10:27.
Старый 30.12.2008, 10:17
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
цитатко из твоего кода:
"local integer Column = R2I((GetUnitX(u)-<ВерхнийЛевыйУголДоски.x>)/<РазмерЯчейки.x>)"
кстати, я кажется кое что заметил, что может быть неправильно, проснусь - проверю..
Старый 30.12.2008, 10:21
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
цитатко из твоего кода:
"local integer Column = R2I((GetUnitX(u)-<ВерхнийЛевыйУголДоски.x>)/<РазмерЯчейки.x>)"
ну и?

Отредактировано Jon, 30.12.2008 в 10:31.
Старый 30.12.2008, 10:22
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
J, либо ты меня не понимаешь, либо я тебя. Повторюсь - координата по X (икс) моей ЛЕВОЙ ВЕРХНЕЙ точки имеет значение -(минус)1024. Координата моего юнита по икс имеет значение 0. Подставив данные в формулу получим (0-1024/256)..Да к тому же как у тебя X верхней левой точки равен 0? O_o ты по карте в эдиторе координаты посмотри..значит у тебя доска начинается с центра карты и идет вообще вниз и вправо? Будет проще если ты примерчик сделаешь на несколько клеток, чисто с этим триггером. Иначе мы отсюда не выбиремся..
Старый 30.12.2008, 21:04
J
expert
offline
Опыт: 48,447
Активность:
R2I((0-(-1024))/256)
где негатив?

J добавил:
PS индексация ректора должна быть такая
00 01 02 03 04 05 06 07
08 09 10 11 12 13 14 15
...
56 57 58 59 60 61 62 63
у тебя так?
Старый 30.12.2008, 21:32
Закрытая тема

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

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

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

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



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