[DUОS] | Дата: Пятница, 29 Апреля 2011, 14:29:22 | Сообщение # 1 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| На этом уроке мы попрактикуемся в оптимизации кода GUI-триггеров на Jass. Все мы уже знаем, какие жуткие следы в коде карты оставляет триггер и зачастую очень много утечек. Я думал, что бы такое разобрать на этом уроке, сделанное триггерно и решил - вот это подходит. Итак... Откроем JassCraft. В нём создадим новое окно. Конвертируем триггер Start в текст и копируем код. Будет такой код: Code function Trig_Start_Actions takes nothing returns nothing // Это включает Заставку call CinematicModeBJ( true, GetPlayersAll() ) call CameraSetupApplyForPlayer( true, gg_cam_Camera_004, Player(0), 0.00 ) call TriggerSleepAction( 1.00 ) call TransmissionFromUnitWithNameBJ( GetPlayersAll(), gg_unit_Hamg_0059, "TRIGSTR_015", null, "TRIGSTR_016", bj_TIMETYPE_ADD, 0.00, true ) call TriggerSleepAction( 1.00 ) call CameraSetupApplyForPlayer( true, gg_cam_Camera_001, Player(0), 3.00 ) call TriggerSleepAction( 1.00 ) call TransmissionFromUnitWithNameBJ( GetPlayersAll(), gg_unit_hkni_0000, "TRIGSTR_001", null, "TRIGSTR_002", bj_TIMETYPE_ADD, 0.00, true ) call TriggerSleepAction( 1.00 ) call SetCameraTargetControllerNoZForPlayer( Player(0), gg_unit_hkni_0000, 0.00, 0.00, false ) call GroupPointOrderLocBJ( GetUnitsInRectAll(gg_rct________________002), "move", GetRectCenter(gg_rct________________001) ) call TriggerSleepAction( 10.00 ) call TransmissionFromUnitWithNameBJ( GetPlayersAll(), gg_unit_hkni_0000, "TRIGSTR_009", gg_snd_IceTrollYesAttack1, "TRIGSTR_010", bj_TIMETYPE_ADD, 0.00, true ) endfunction
//=========================================================================== function InitTrig_Start takes nothing returns nothing set gg_trg_Start = CreateTrigger( ) call TriggerAddAction( gg_trg_Start, function Trig_Start_Actions ) endfunction Давайте разберёмся. Code call CinematicModeBJ( true, GetPlayersAll() ) НИКОГДА не оставляйте BJ без внимания. Давайте это как-то развернём. В развёртке это выглядит так: Code call CinematicModeExBJ(cineMode, forForce, bj_CINEMODE_INTERFACEFADE) Тоже не подходит. Снова BJ... Разворачиваем и её.Code function CinematicModeExBJ takes boolean cineMode, force forForce, real interfaceFadeTime returns nothing // If the game hasn't started yet, perform interface fades immediately if (not bj_gameStarted) then set interfaceFadeTime = 0 endif
if (cineMode) then // Save the UI state so that we can restore it later. if (not bj_cineModeAlreadyIn) then set bj_cineModeAlreadyIn = true set bj_cineModePriorSpeed = GetGameSpeed() set bj_cineModePriorFogSetting = IsFogEnabled() set bj_cineModePriorMaskSetting = IsFogMaskEnabled() set bj_cineModePriorDawnDusk = IsDawnDuskEnabled() set bj_cineModeSavedSeed = GetRandomInt(0, 1000000) endif
// Perform local changes if (IsPlayerInForce(GetLocalPlayer(), forForce)) then // Use only local code (no net traffic) within this block to avoid desyncs. call ClearTextMessages() call ShowInterface(false, interfaceFadeTime) call EnableUserControl(false) call EnableOcclusion(false) call SetCineModeVolumeGroupsBJ() endif
// Perform global changes call SetGameSpeed(bj_CINEMODE_GAMESPEED) call SetMapFlag(MAP_LOCK_SPEED, true) call FogMaskEnable(false) call FogEnable(false) call EnableWorldFogBoundary(false) call EnableDawnDusk(false)
// Use a fixed random seed, so that cinematics play consistently. call SetRandomSeed(0) else set bj_cineModeAlreadyIn = false
// Perform local changes if (IsPlayerInForce(GetLocalPlayer(), forForce)) then // Use only local code (no net traffic) within this block to avoid desyncs. call ShowInterface(true, interfaceFadeTime) call EnableUserControl(true) call EnableOcclusion(true) call VolumeGroupReset() call EndThematicMusic() call CameraResetSmoothingFactorBJ() endif
// Perform global changes call SetMapFlag(MAP_LOCK_SPEED, false) call SetGameSpeed(bj_cineModePriorSpeed) call FogMaskEnable(bj_cineModePriorMaskSetting) call FogEnable(bj_cineModePriorFogSetting) call EnableWorldFogBoundary(true) call EnableDawnDusk(bj_cineModePriorDawnDusk) call SetRandomSeed(bj_cineModeSavedSeed) endif endfunction Ого. Вот это развёртка. Но её тоже можно посворачивать. Code constant real bj_CINEMODE_INTERFACEFADE = 0.50 Лучше заменить на .5 - быстрее будет работать. По сути из всей функции, исходя из того, что cineMode принимается как true, нам нужна только эта часть кода: Code // Save the UI state so that we can restore it later. if (not bj_cineModeAlreadyIn) then set bj_cineModeAlreadyIn = true set bj_cineModePriorSpeed = GetGameSpeed() set bj_cineModePriorFogSetting = IsFogEnabled() set bj_cineModePriorMaskSetting = IsFogMaskEnabled() set bj_cineModePriorDawnDusk = IsDawnDuskEnabled() set bj_cineModeSavedSeed = GetRandomInt(0,1000000) endif
// Perform local changes if (IsPlayerInForce(GetLocalPlayer(), forForce)) then // Use only local code (no net traffic) within this block to avoid desyncs. call ClearTextMessages() call ShowInterface(false,.5) call EnableUserControl(false) call EnableOcclusion(false) call SetCineModeVolumeGroupsBJ() endif
// Perform global changes call SetGameSpeed(bj_CINEMODE_GAMESPEED) call SetMapFlag(MAP_LOCK_SPEED, true) call FogMaskEnable(false) call FogEnable(false) call EnableWorldFogBoundary(false) call EnableDawnDusk(false)
// Use a fixed random seed, so that cinematics play consistently. call SetRandomSeed(0) Финальный вариант после очистки лишнего будет такой:Code // Ýòî âêëþ÷àåò Çàñòàâêó // Save the UI state so that we can restore it later. if (not bj_cineModeAlreadyIn) then set bj_cineModeAlreadyIn = true set bj_cineModePriorSpeed = GetGameSpeed() set bj_cineModePriorFogSetting = IsFogEnabled() set bj_cineModePriorMaskSetting = IsFogMaskEnabled() set bj_cineModePriorDawnDusk = IsDawnDuskEnabled() set bj_cineModeSavedSeed = GetRandomInt(0,1000000) endif
call ClearTextMessages() call ShowInterface(false,.5) call EnableUserControl(false) call EnableOcclusion(false) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_UNITMOVEMENT,bj_CINEMODE_VOLUME_UNITMOVEMENT) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_UNITSOUNDS,bj_CINEMODE_VOLUME_UNITSOUNDS) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_COMBAT,bj_CINEMODE_VOLUME_COMBAT) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_SPELLS,bj_CINEMODE_VOLUME_SPELLS) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_UI,bj_CINEMODE_VOLUME_UI) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_MUSIC,bj_CINEMODE_VOLUME_MUSIC) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_AMBIENTSOUNDS,bj_CINEMODE_VOLUME_AMBIENTSOUNDS) call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_FIRE,bj_CINEMODE_VOLUME_FIRE) call SetGameSpeed(bj_CINEMODE_GAMESPEED) call SetMapFlag(MAP_LOCK_SPEED, true) call FogMaskEnable(false) call FogEnable(false) call EnableWorldFogBoundary(false) call EnableDawnDusk(false) call SetRandomSeed(0) Камера развернётся так:Code if GetLocalPlayer() == Player(0) then call CameraSetupApplyForceDuration(gg_cam_Camera_004,true,0.) endif Остальное - по аналогии Д/з: Закончить оптимизацию триггера.
|
|
|
|
lawson | Дата: Пятница, 29 Апреля 2011, 15:32:53 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| Не красиво дуос. Извини но я тебя больше не уважаю. Но на счет урока - красавчик, но новичкам будет сложно.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 29 Апреля 2011, 15:45:02 |
|
|
|
Шторм | Дата: Пятница, 29 Апреля 2011, 20:32:49 | Сообщение # 3 |
9 уровень
Группа: Проверенные
Сообщений: 835
Награды: 0
Репутация: 165
Блокировки:
| Quote (lawson) Не красиво дуос. Извини но я тебя больше не уважаю. Я того же мнения. Извини, но ты балабол.
|
|
|
|
Джинжер | Дата: Воскресенье, 16 Октября 2011, 14:36:32 | Сообщение # 4 |
3 уровень
Группа: Пользователи
Сообщений: 47
Награды: 0
Репутация: 8
Блокировки:
| О, боги...
Я - подлая сволочь, которая может написать любовный рассказ, а потом твердить каждой второй девушке, что просто имя изменил. Типа.
|
|
|
|
PUVer | Дата: Понедельник, 30 Января 2012, 11:13:51 | Сообщение # 5 |
Сухопутные крысы!
Группа: Модераторы
Сообщений: 4462
Награды: 8
Репутация: 1845
Блокировки:
| Согласен с лавсоном. До 3-го урока прочитал. Всё понятно. Потом - тёмный лес. Думаю нужно разобрать поподробней в уроках как задавать события на джассе и т.п.
|
|
|
|
Dreii | Дата: Понедельник, 30 Января 2012, 11:39:21 | Сообщение # 6 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| PUVer, события можно и с помощью гуи+конверт
|
|
|
|
Ty3uK | Дата: Понедельник, 30 Января 2012, 11:50:13 | Сообщение # 7 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Я так и делаю, бтв. Лень писать функцию, которую можно получить за парочку кликов мышкой
|
|
|
|