0
28
6 лет назад
Отредактирован PT153
0

» WarCraft 3 / I2R

Тестировал время с помощью файла, который дал мне DracoL1ch. Кому нужно, могу кинуть в ЛС.
Без умножения и I2R() вышло быстрее.
Код, которым тестировал
function Trig takes nothing returns nothing
    local real r = 1.
    local integer i = 1
    local integer a = 1
    call ClearTextMessages()
    call StartPerfCounter()
    call DebugMsg("BEGIN!!!")
    call StopPerfCounter()
    call DebugMsg("Non convert")
    call StartPerfCounter()
    loop
        set r = r - i
        set a = a + 1
        exitwhen a == 1000
    endloop
    call StopPerfCounter()
    
    call DebugMsg("*1.")
    set a = 1
    call StartPerfCounter()
    loop
        set r = r - i * 1.
        set a = a + 1
        exitwhen a == 1000
    endloop
    call StopPerfCounter()
    
    call DebugMsg("I2R")
    set a = 1
    call StartPerfCounter()
    loop
        set r = r - I2R(i)
        set a = a + 1
        exitwhen a == 1000
    endloop
    call StopPerfCounter()
endfunction

function InitTrig_I2R_test takes nothing returns nothing
    set gg_trg_I2R_test = CreateTrigger(  )
    call TriggerRegisterTimerEvent( gg_trg_I2R_test, 5, true)
    call TriggerAddAction( gg_trg_I2R_test, function Trig )
endfunction
0
28
6 лет назад
0

» WarCraft 3 / Deprotect(Помощь)

Это не карта. Карта имеет расширение .w3m или .w3x.
2
28
6 лет назад
Отредактирован PT153
2

» WarCraft 3 / Повседневные приёмы в программировании варкрафта

function interface
Вот этим не интересовался, лучше написать код, сохранить карту, а после открыть её MPQEditor и посмотреть, что же вышло.
Я так понял она нужна, только для того чтобы как-то заменить code array, который нельзя создать.
Ну как видишь, можно с помощью этого ещё и функции передавать, что довольно неплохо.
Она создаёт триггер, который будет вызван через TriggerEvaluate( ), а параметры будут переданы через глобальные переменные.
Лучше глянуть, что происходит на самом деле, нормальный пример есть в мануале vJass (кидал выше).
Лол, пока смотрел в мануале про function interface, обнаружил TypeCast.
А насчёт interface/endinterface вроде всё понятно. Просто набор правил, чтобы в случае чего выдать ошибку?
Я не вижу большого смысла в интерфейсах в Jass, тут все объекты целые числа, потому интерфейс можно с лёгкостью заменить на textmacro. Как, в общем-то, и модули.
Есть такое понятие абстрактный класс, гибрид обычного класса и интерфейса. Абстрактный класс может иметь полноценный метод, а не только его декларацию в отличие от интерфейса, но его объект всё также не может быть создан. Тогда вопрос, а зачем нужны вообще интерфейсы, если абстрактные классы лучше? Например, в C# благодаря интерфейсам класс может наследоваться от нескольких интерфейсов и не более 1 класса одновременно. Наследование от нескольких абстракный классов может вызвать т. н. diamond problem, так как в абстрактных классах некоторые методы могут быть описаны. Потому в C# смысл в интерфейсах есть, а вот в vJass я его не вижу.
В vJass абстрактных классов нет, а мне пригодились бы.
struct A
    stub method F takes nothing returns nothing
        call BJDebugMsg("This is A!")
    endmethod
endstruct

struct B extends A
    timer t

    method F takes nothing returns nothing
        call BJDebugMsg("This is B!")
    endmethod
endstruct

struct C extends A
    unit k

    method F takes nothing returns nothing
        call BJDebugMsg("This is C!")
    endmethod
endstruct

struct D extends B, C // так нельзя в vJass, но нужно для примера
endstruct
...
function f takes nothing returns nothing
    local D d = D.create()
    set d.t = CreateTimer()
    set d.k = CreateUnit(Player(0), 'hfoo', 0., 0., 0.)
    call d.F() // а что вызвать? Метод из B или из C?
endfunction
0
28
6 лет назад
0

» WarCraft 3 / I2R

Ну просто функция - это официальный вариант, а можно перемножить
Нужно ли вообще перемножать?
Что потребует больше времени?
local real r = 100.
local integer i = 100
local real u = r + i * 1.
// или
local real r = 100.
local integer i = 100
local real u = r + i
local real r = 100.
local integer i = 100
local boolean b = r != i * 1.
// или
local real r = 100.
local integer i = 100
local boolean b = r != i
2
28
6 лет назад
Отредактирован PT153
2

» WarCraft 3 / Повседневные приёмы в программировании варкрафта

инкапсуляцию
Это техника скрытия от клиентов некоторых методов или полей у поставщика. Клиент - класс, который использует поставщика, поставщик тоже класс. Таким образом можно убедится, например, что некоторые поля могут меняться только внутри методов класса. Также можно убирать не важные для клиента методы и поля. Такие поля и методы называются приватными (private), то есть их можно использовать и изменять только внутри методов класса.
Зачем это? Для удобства.
Также есть protected и public поля и методы. Protected могут использоваться и изменяться только внутри класса и его наследников. Public, очевидно, могут использоваться и изменяться всеми классами.
ScopteRectuS:
полиморфизм
Это техника, которая позволяет одной переменной принимать разные типы во время выполнения программы. Т. н. dynamic binding.
Покажу на примере JASS, хотя там ООП вообще нет (точнее, есть завуалированное использование триггеров и массивов по видом ООП).
struct A
    stub method someMethod takes nothing returns nothing
        call BJDebugMsg("This is A!")
    endmethod
endstruct

struct B extends A
    method someMethod takes nothing returns nothing
        call BJDebugMsg("This is B!")
    endmethod

    stub method someMethod2 takes nothing returns nothing
        call BJDebugMsg("This is B2!")
    endmethod
endstruct

struct C extends B
    method someMethod2 takes nothing returns nothing
        call BJDebugMsg("This is C!")
    endmethod
endstruct
...
function f takes nothing returns nothing
    local A a = A.create()
    local B b = B.create()
    call a.someMethod() // будет выведено "This is A!".
    set a = B.create()
    call a.someMethod() // будет выведено "This is B!".
    call a.someMethod2() // будет выведено "This is B2!".
    set a = C.create()
    call a.someMethod() // будет выведено "This is B!", так как C унаследовало метод someMethod() от B.
    call a.someMethod2() // будет выведено "This is C!".
    set b = A.create() // неверно, так как A не является ни наследником класса B, ни самим классом B.
endfunction
Т. о. переменная а во время выполнения функции f имела в себе 3 разных типа.
Надо отметить, что это не касается vJASS, так как А, В и С на самом деле будут иметь тип integer, потому что настоящего ООП в vJASS нет.
ScopteRectuS:
Хоть убейте, не могу понять, как работать с интерфейсами и где их стоит применять.
А теперь про интерфейсы. Они нужны тогда, когда у некоторых классов есть одинаковые поля и методы. В интерфейсах нельзя описывать методы, только декларировать, а вот все наследники интерфейса должны будут этот метод описать.
interface A
    unit u
    method someMethod takes nothing returns nothing
endinterface

struct B extends A
    method someMethod takes nothing returns nothing
        call BJDebugMsg("This is B!")
    endmethod
endstruct

struct C extends A
    method someMethod takes nothing returns nothing
        call BJDebugMsg("This is C!")
    endmethod
endstruct
...
function f takes nothing returns nothing
    local A a = A.create() // неверно, нельзя инициировать объект интерфейса!
    local B b = B.create()
    local C c = C.create()
    set a = b
    call a.someMethod() // будет выведено "This is B!".
    set a.u = CreateUnit(Player(0), 'hfoo', 0., 0., 0.) // теперь в b.u записан пехотинец.
    set a = c
    call a.someMethod() // будет выведено "This is C!".
    set a.u = CreateUnit(Player(0), 'Hpal', 0., 0., 0.) // теперь в c.u записан паладин.
endfunction
А вообще, читайте мануал к vJASS, для маппинга в WCIII вполне хватит, а для обучения ООП поступите в университет или поищите книги (я вот знаю Touch of Class Бертрана Мейера).
0
28
6 лет назад
0

» WarCraft 3 / I2R

вызов функции дороже мат. операции.
Понятно, а зачем тогда вообще функция I2R()?
Что потребует больше времени?
local real r = 100.
local integer i = 100
local real u = r + i * 1.
// или
local real r = 100.
local integer i = 100
local real u = r + i
local real r = 100.
local integer i = 100
local boolean b = r != i * 1.
// или
local real r = 100.
local integer i = 100
local boolean b = r != i
0
28
6 лет назад
0

» WarCraft 3 / 2 условия одной функции

можно улучшить это и хранить характеристику в CV предмета к примеру. Но это не оч гибко, нежели хэш
Так я предложил заготовку, а так там можно легко дописать и хеш, и струкруры, и cv.
2
28
6 лет назад
2

» WarCraft 3 / 2 условия одной функции

Событие: A unit acquires an item
Условие: Тип подобранного предмета равно X
Действие: Увеличить значение Силы у Hero manipulating Unit на Y
Событие: A unit losses an item
Условие: Тип утерянного предмета равно X
Действие: Уменьшить значение Силы у Hero manipulating Unit на Y
Самый простой способ, можно даже на гуи написать.
0
28
6 лет назад
Отредактирован PT153
0

» WarCraft 3 / I2R

PyCCKuu_4eJl:
Сомневаюсь что округляться будет в нужную сторону, да и легче сразу real сравнивать.
Простите, а что будет округлятся у целочисленных?
Fakov:
Эм? А почему сразу real не сравнивать?
Ситуация такая. Есть число целое, есть нецелое. Мне нужно их сравнить\сложить\умножить\разделить\вычесть.
Вопрос: нужно ли конвертировать целое в нецелое с помощью I2R(), и что будет, если этого не сделать?
Я вот на HIVE читал, что I2R(int) медленнее, чем int * 1.0, но я хотел бы уточнить эту информацию и выяснить вообще необходимость конвертации как и с помощью I2R(), так и с помощью умножения на 1.0.
Пушистый:
Integer наследует Real, поэтому переменную типа integer можно использовать, как real (но не наоборот).
Нет, integer базовый тип, да и хранятся они по-разному.
0
28
6 лет назад
0

» WarCraft 3 / 2 условия одной функции

Какие статы? Сила, ловкость, разум? Есть же такие способности, которые увеличивают хар-ки только во время ношения.
0
28
6 лет назад
0

» WarCraft 3 / Время

UrsaBoss:
а что подробного? Фейкплеер будет писать в чат, а триггером надо будет это ловить
А как триггерно написать в чат и выводить время или пинг с помощью этого?
0
28
6 лет назад
0

» WarCraft 3 / Как закрепить в позиции героя 2х юнитов?

Что такое МУИ?
0
28
6 лет назад
0

» WarCraft 3 / vJass

struct SomeStruct
    unit u

    method someMethod takes unit k returns nothing
        set u = k // set this.u = k
    endmethod

    static method someStaticMethod takes thistype this, unit k returns nothing
        set u = k // set this.u = k
    endmethod
endstruct
...
function funct takes nothing returns nothing
    local SomeStruct str = SomeStruct.create()
    local SomeStruct the = SomeStruct.create()
    call str.someMethod(CreateUnit(Player(0), 'hfoo', 0., 0., 0.))
    call SomeStruct.someStaticMethod(the, CreateUnit(Player(0), 'hfoo', 0., 0., 0.))
endfunction
мы можем спустя несколько действий сделать
Не понял, что ты хочешь сделать.
0
28
6 лет назад
0

» WarCraft 3 / Время

А фейкплеер просто "кинет на себя мут" и будет отсылать сообщения, далее триггером с ChatEvent ловишь
А можно поподробнее тут?
0
28
6 лет назад
0

» WarCraft 3 / Можноли так написать

А что записано в GetFilterUnit()?
0
28
6 лет назад
Отредактирован PT153
0

» WarCraft 3 / Функцыя вызова

call GroupDamag()
Если функцию передаёшь в TimerStart, то тогда
call TimerStart(whichTimer, timeout, periodic, function GroupDamag)
3
28
6 лет назад
3

» WarCraft 3 / Как убрать на панели приказов кнопку?

В Units\CommandFunc.txt прописать в нужном приказе Buttonpos=0,-11.
Отредактированные файл импортировать в карту по тому же пути (Units\CommandFunc.txt).
0
28
6 лет назад
0

» WarCraft 3 / Как сделать multishot?

Дать способность Barrage, что у танков людей.
0
28
6 лет назад
0

» WarCraft 3 / И снова по прелоадам

Я так понимаю, что в спелбуке много спелов? Я просто добавлял спелбук юниту во время прелоада, этого хватало. Также может сработать добавление всех способностей из спелбука юниту во время прелоада
1
28
6 лет назад
Отредактирован PT153
1

» WarCraft 3 / PolledWait

PolledWait использует таймер с малым периодом, потому своим таймером выйдет точнее и лучше (если сделать правильно).
А чем плох TriggerSleepAction?
0
28
6 лет назад
0

» WarCraft 3 / Лимит символов

на запятой
Верно, такая ошибка даже допущена в описании стандартных баффов.
Точка и точка с запятой не обрывает. Двоеточние, вроде, тоже не обрывает.
6
28
6 лет назад
6

» WarCraft 3 / Вопрос по альтернативным формам

Круто, а можно всем рассказать?)
0
28
6 лет назад
0

» WarCraft 3 / Предметные способности - можно ли заюзать триггерно?

А разве триггерно через ID можно?
Конечно, через id ПРИКАЗА, а не равкода способности.
2
28
6 лет назад
Отредактирован PT153
2

» WarCraft 3 / Простой вопрос по ForceUIKey

local Player p
local integer i = 0
loop
    exitwhen i > 11
    set p = Player(i)
    call SetUnitOwner( gg_unit_ogru_0009, p, true )
    if GetLocalPlayer() == p then
        call SelectUnit( gg_unit_ogru_0009, true)
        call ForceUIKey("L")
        // Пиши сколько нужно SelectUnit(whichUnit, true), но не забудь прописать ClearSelection() после выбора 12 юнитов.
    endif
    // Передача юнита нейтралу будет совершена после цикла, всё равно ты его будешь давать разным игрокам.
    set i = i + 1
endloop
call ClearSelection()
call SetUnitOwner( gg_unit_ogru_0009, Player(PLAYER_NEUTRAL_AGGRESSIVE), true )
set p = null //Необязательно.
2
28
6 лет назад
Отредактирован PT153
2

» WarCraft 3 / Простой вопрос по ForceUIKey

Вот статья про GetLocalPlayer, если нужно.