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

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

Ответ
 
dutub

offline
Опыт: 518
Активность:
CJass Оптимизация
((код
library DialogMod initializer Init {
trigger DialogMod = CreateTrigger()
trigger DialogModEvent = CreateTrigger()

dialog MainDialog
button array MainDialogBtn
Mods Flags
boolean MRandom = false
boolean MBoss = false

integer ModsCount = 0
==============================================================================================
==============================================================================================
nothing Init() {
TriggerRegisterTimerEventSingle(DialogMod, 0.10)
TriggerAddAction(DialogMod, function Dialog.Create)
}
==============================================================================================
==============================================================================================
struct Dialog {
static nothing Create() {
MainDialog = DialogCreate()
if MRandom {
MainDialogBtn[0] = DialogAddButtonBJ(MainDialog, "Случайные герои: да")
ModsCount++
} else {
MainDialogBtn[0] = DialogAddButtonBJ(MainDialog, "Случайные герои: нет")
}
if MBoss {
MainDialogBtn[1] = DialogAddButtonBJ(MainDialog, "Ивент Босс: да")
ModsCount++
} else {
MainDialogBtn[1] = DialogAddButtonBJ(MainDialog, "Ивент Босс: нет")
}
MainDialogBtn[2] = DialogAddButtonBJ(MainDialog, "Начать игру!")
DialogDisplayBJ(true, MainDialog, Player(0))

TriggerRegisterDialogEventBJ(DialogModEvent, MainDialog)
TriggerAddAction(DialogModEvent, function Dialog.CheckClick)
}

static nothing CheckClick() {
if GetClickedButtonBJ() == MainDialogBtn[0] {
DialogDestroy(MainDialog)
if MRandom {
MRandom = false
} else {
MRandom = true
}
Dialog.Create()
}
if GetClickedButtonBJ() == MainDialogBtn[1] {
DialogDestroy(MainDialog)
if MBoss {
MBoss = false
} else {
MBoss = true
}
Dialog.Create()
}
if GetClickedButtonBJ() == MainDialogBtn[2] {
DialogDestroy(MainDialog)
DestroyTrigger(DialogMod)
DestroyTrigger(DialogModEvent)
Dialog.Mods()
}
}

static nothing Mods() {
if ModsCount > 1 {
DisplayTextToForce(GetPlayersAll(), "Хост выбрал следующие моды:")
} else {
DisplayTextToForce(GetPlayersAll(), "Хост не выбрал ни одного мода.")
}
if MRandom {
DisplayTextToForce(GetPlayersAll(), " -Случайные герои")
}
if MBoss {
DisplayTextToForce(GetPlayersAll(), " -Ивент Босс")
}
}
}
}
))
Можно ли писать на cjass, как пишу я? Или есть утечки?

Отредактировано Nekit1234007, 04.12.2010 в 12:09.
Старый 04.12.2010, 11:26
spellwerk

offline
Опыт: 4,869
Активность:
Код:
DisplayTextToForce
TriggerRegisterDialogEventBJ
DialogDisplayBJ
GetClickedButtonBJ
DialogAddButtonBJ

замени на обычные
Старый 04.12.2010, 11:36
dutub

offline
Опыт: 518
Активность:
Spy_, т.е

Код:
??? - тут какая обычная?
TriggerRegisterDialogEvent
DialogDisplay
GetClickedButton
DialogAddButton


так?
Старый 04.12.2010, 11:45
XOR

offline
Опыт: 38,159
Активность:
ты не используешь нативки, а убогую оболочку, созданную близзард для использования в гуи. нажмите ctrl и кликни на функцию, будет показана вся функция.
Старый 04.12.2010, 11:53
dutub

offline
Опыт: 518
Активность:
DisplayTimedTextToPlayer
TriggerRegisterDialogEvent
DialogDisplay
GetClickedButton
DialogAddButton

Я так понял это нативки?!
Старый 04.12.2010, 11:58
Nekit1234007

offline
Опыт: 11,916
Активность:
Кликни на них с ctrl'ом.
Старый 04.12.2010, 12:02
dutub

offline
Опыт: 518
Активность:
кликнул:

native DisplayTimedTextToPlayer takes player toPlayer, real x, real y, real duration, string message returns nothing
Старый 04.12.2010, 12:03
ScorpioT1000
Работаем
offline
Опыт: отключен
да
ScorpioT1000 добавил:
если ты в карте не собираешься изменять blizzard.j - вполне можно использовать и BJ
Старый 04.12.2010, 13:29
dutub

offline
Опыт: 518
Активность:
Что лучше использовать:

1. MultiboardSetItemValueBJ
2.
Код:
multiboard mb
multiboarditem mi
struct Multiboard {
        static nothing SetItemValue(integer col, integer row, string value) {
            mi = MultiboardGetItem(mb, row, col)
            MultiboardSetItemValue(mi, value)
            //MultiboardReleaseItem(mi)
        }
    }
Старый 04.12.2010, 14:42
Nekit1234007

offline
Опыт: 11,916
Активность:
Очень хреновое использование ооп, в данном случае неоправдано. А бж пользоваться не надо.
Nekit1234007 добавил:
т.е. совать ооп везде не надо.
Старый 04.12.2010, 14:45
dutub

offline
Опыт: 518
Активность:
Nekit1234007, Про Объектно-ориентированное программирование не спрашивал...
Значит лучше 2 использовать?
Старый 04.12.2010, 14:46
Nekit1234007

offline
Опыт: 11,916
Активность:
Нет, лучше третий вариант, которого у тебя нет, но должен быть.
Nekit1234007 добавил:
Не надо забивать гвозди микроскопом.
Старый 04.12.2010, 14:48
dutub

offline
Опыт: 518
Активность:
Nekit1234007, тогда покажи 3 вариант, если не затруднит.
Я даж представить себе не могу его.
Старый 04.12.2010, 14:50
Nekit1234007

offline
Опыт: 11,916
Активность:
((код
multiboard mb
void SetItemValue(integer col, integer row, string value) {
local multiboarditem mi = MultiboardGetItem(mb, row, col)
MultiboardSetItemValue(mi, value)
MultiboardReleaseItem(mi)
mi = null
}
))
Например.
Старый 04.12.2010, 15:31
ScorpioT1000
Работаем
offline
Опыт: отключен
тогда уж
struct MultiboardItem {
    void SetValue()

}
итп
Старый 04.12.2010, 18:24
dutub

offline
Опыт: 518
Активность:
Эхх я неправильно объяснил...
Я просто хотел узнать про функцию, а не про структуру и прочее...
В структуре Multiboard еще много методов...

Всем спасибо, все советы взял на заметку.
Тему можно прикрыть.
Старый 04.12.2010, 18:28
ScorpioT1000
Работаем
offline
Опыт: отключен
Я просто хотел узнать про функцию
всегда юзай нативки, но иногда встречаются BJ, которые содержат в себе много реализации и мне, как истинному кодеру, иногда лень это всё самому писать и я юзаю их )
Старый 04.12.2010, 18:49
dutub

offline
Опыт: 518
Активность:
((код
library Multiboard initializer MBInit
{
private trigger MBTrigger = CreateTrigger()
private trigger MBEventTrigger = CreateTrigger()
private integer array PlayerKills
private integer array PlayerDeaths
private integer PlayersInGame = 0
private integer array PlayerInGame

================================================================

private nothing MBInit ()
{
TriggerRegisterTimerEvent(MBTrigger, 0.1, false)
TriggerAddAction(MBTrigger, function Multiboard.Create)

integer i = 1
loop
{
TriggerRegisterPlayerUnitEvent(MBEventTrigger, Player(i), EVENT_PLAYER_UNIT_DEATH, null)
i ++
exitwhen i > PlayersInGame
}
TriggerAddAction(MBEventTrigger, function Multiboard.Event)
}

================================================================
struct Multiboard
{
private static multiboard mb
private static integer RowCount = 0

public static nothing Create ()
{
Multiboard.mb = CreateMultiboard()
Multiboard.GetPlayersInGame()
Multiboard.RowCount = PlayersInGame + 1
Multiboard.SetStyle()
Multiboard.SetDefaultValues()
MultiboardDisplay(Multiboard.mb, true)
}

public static nothing GetPlayersInGame ()
{
integer i = 0
integer j = 1
loop
{
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING
{
PlayersInGame ++
PlayerInGame[j] = i
j ++
}
i ++
exitwhen i > 5
}
}

private static nothing SetStyle ()
{
MultiboardSetColumnCount(Multiboard.mb, 3)
MultiboardSetRowCount(Multiboard.mb, PlayersInGame+1)
MultiboardSetItemsStyle(Multiboard.mb, true, false)
integer i = 0
loop
{
Multiboard.SetWidth(0, i, 70)
Multiboard.SetWidth(1, i, 40)
Multiboard.SetWidth(2, i, 40)
i ++
exitwhen i > Multiboard.RowCount
}
}

private static nothing SetDefaultValues ()
{
Multiboard.SetValue(0, 0, "|c00FFFF00"+"Игрок")
Multiboard.SetValue(1, 0, "|c00FFFF00"+"Убийств")
Multiboard.SetValue(2, 0, "|c00FFFF00"+"Смертей")

integer i = 1
loop
{
PlayerKills[i] = 0
PlayerDeaths[i] = 0
Multiboard.SetValue(0, i, GetPlayerName(Player(PlayerInGame[i])))
Multiboard.SetValue(1, i, " "+I2S(PlayerKills[i]))
Multiboard.SetValue(2, i, " "+I2S(PlayerDeaths[i]))
i ++
exitwhen i > PlayersInGame
}
}

private static nothing SetValue (integer col, integer row, string value)
{
multiboarditem mi = MultiboardGetItem(Multiboard.mb, row, col)
MultiboardSetItemValue(mi, value)
}

private static nothing SetWidth (integer col, integer row, real width)
{
multiboarditem mi = MultiboardGetItem(Multiboard.mb, row, col)
MultiboardSetItemWidth(mi, width/1000)
}

======

public static nothing Event ()
{
integer i = 1
loop
{
if GetOwningPlayer(GetKillingUnit()) == Player(PlayerInGame[i])
{
PlayerKills[i] ++
UpdateKills()
}

if GetOwningPlayer(GetDyingUnit()) == Player(PlayerInGame[i])
{
PlayerDeaths[i] ++
UpdateDeaths()
}
i ++
exitwhen i > PlayersInGame
}
}

private static nothing UpdateKills ()
{
integer i = 1
loop
{
Multiboard.SetValue(1, i, " "+I2S(PlayerKills[i]))
i ++
exitwhen i > PlayersInGame
}
}

private static nothing UpdateDeaths ()
{
integer i = 1
loop
{
Multiboard.SetValue(2, i, " "+I2S(PlayerDeaths[i]))
i ++
exitwhen i > PlayersInGame
}
}
}
}
))
Есть ли утечки в данном коде?
Старый 07.12.2010, 20:59
Nekit1234007

offline
Опыт: 11,916
Активность:
В SetWidth и в SetValue не удаляешь multiboarditem.
FYI: для структур есть метод onInit.
Старый 07.12.2010, 21:10
dutub

offline
Опыт: 518
Активность:
Nekit1234007, mi = null?!
А смысл использовать onInit?
Старый 07.12.2010, 21:14
Ответ

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

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

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

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



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