Тестировал время с помощью файла, который дал мне 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
Вот этим не интересовался, лучше написать код, сохранить карту, а после открыть её 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
Это техника скрытия от клиентов некоторых методов или полей у поставщика. Клиент - класс, который использует поставщика, поставщик тоже класс. Таким образом можно убедится, например, что некоторые поля могут меняться только внутри методов класса. Также можно убирать не важные для клиента методы и поля. Такие поля и методы называются приватными (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 Бертрана Мейера).
Сомневаюсь что округляться будет в нужную сторону, да и легче сразу real сравнивать.
Простите, а что будет округлятся у целочисленных? Fakov:
Эм? А почему сразу real не сравнивать?
Ситуация такая. Есть число целое, есть нецелое. Мне нужно их сравнить\сложить\умножить\разделить\вычесть. Вопрос: нужно ли конвертировать целое в нецелое с помощью I2R(), и что будет, если этого не сделать?
Я вот на HIVE читал, что I2R(int) медленнее, чем int * 1.0, но я хотел бы уточнить эту информацию и выяснить вообще необходимость конвертации как и с помощью I2R(), так и с помощью умножения на 1.0. Пушистый:
Integer наследует Real, поэтому переменную типа integer можно использовать, как real (но не наоборот).
Нет, integer базовый тип, да и хранятся они по-разному.
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
В Units\CommandFunc.txt прописать в нужном приказе Buttonpos=0,-11.
Отредактированные файл импортировать в карту по тому же пути (Units\CommandFunc.txt).
Я так понимаю, что в спелбуке много спелов? Я просто добавлял спелбук юниту во время прелоада, этого хватало. Также может сработать добавление всех способностей из спелбука юниту во время прелоада
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 //Необязательно.
Отредактирован PT153
» WarCraft 3 / I2R
Без умножения и I2R() вышло быстрее.
» WarCraft 3 / Deprotect(Помощь)
Отредактирован PT153
» WarCraft 3 / Повседневные приёмы в программировании варкрафта
Лол, пока смотрел в мануале про function interface, обнаружил TypeCast.
» WarCraft 3 / I2R
Отредактирован PT153
» WarCraft 3 / Повседневные приёмы в программировании варкрафта
Зачем это? Для удобства.
Также есть protected и public поля и методы. Protected могут использоваться и изменяться только внутри класса и его наследников. Public, очевидно, могут использоваться и изменяться всеми классами.
ScopteRectuS:
Покажу на примере JASS, хотя там ООП вообще нет (точнее, есть завуалированное использование триггеров и массивов по видом ООП).
ScopteRectuS:
» WarCraft 3 / I2R
» WarCraft 3 / 2 условия одной функции
» WarCraft 3 / 2 условия одной функции
Условие: Тип подобранного предмета равно X
Действие: Увеличить значение Силы у Hero manipulating Unit на Y
Условие: Тип утерянного предмета равно X
Действие: Уменьшить значение Силы у Hero manipulating Unit на Y
Отредактирован PT153
» WarCraft 3 / I2R
Fakov: Ситуация такая. Есть число целое, есть нецелое. Мне нужно их сравнить\сложить\умножить\разделить\вычесть.
Вопрос: нужно ли конвертировать целое в нецелое с помощью I2R(), и что будет, если этого не сделать?
Я вот на HIVE читал, что I2R(int) медленнее, чем int * 1.0, но я хотел бы уточнить эту информацию и выяснить вообще необходимость конвертации как и с помощью I2R(), так и с помощью умножения на 1.0.
Пушистый: Нет, integer базовый тип, да и хранятся они по-разному.
» WarCraft 3 / 2 условия одной функции
» WarCraft 3 / Время
» WarCraft 3 / Как закрепить в позиции героя 2х юнитов?
» WarCraft 3 / vJass
» WarCraft 3 / Время
» WarCraft 3 / Можноли так написать
Отредактирован PT153
» WarCraft 3 / Функцыя вызова
» WarCraft 3 / Как убрать на панели приказов кнопку?
Отредактированные файл импортировать в карту по тому же пути (Units\CommandFunc.txt).
» WarCraft 3 / Как сделать multishot?
» WarCraft 3 / И снова по прелоадам
Отредактирован PT153
» WarCraft 3 / PolledWait
А чем плох TriggerSleepAction?
» WarCraft 3 / Лимит символов
Точка и точка с запятой не обрывает. Двоеточние, вроде, тоже не обрывает.
» WarCraft 3 / Вопрос по альтернативным формам
» WarCraft 3 / Предметные способности - можно ли заюзать триггерно?
Отредактирован PT153
» WarCraft 3 / Простой вопрос по ForceUIKey
Отредактирован PT153
» WarCraft 3 / Простой вопрос по ForceUIKey