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

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

Закрытая тема
 
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Мой код оптимален, он будет работать?
scope PlayerExit initializer Init
private function Actions takes nothing returns nothing
 local integer i=0
 local string s=GetPlayerName(GetTriggerPlayer())

 loop
 call DisplayTimedTextToPlayer(Player(i),0,0,10,s+" has left the game.")
 set i=i+1
 exitwhen i==12
 endloop
endfunction

private function Init takes nothing returns nothing
 local trigger t=CreateTrigger()
 local integer i=0

 loop
 exitwhen i==12
 call TriggerRegisterPlayerEvent(t,Player(i),EVENT_PLAYER_LEAVE)
 set i=i+1
 endloop

 call TriggerAddAction(t,function Actions)

 set t=null
endfunction
endscope
нет возможности проверить самому
Старый 30.08.2009, 01:59
ZeToX2007

offline
Опыт: 7,009
Активность:
Bee, Работать будет. все гуд.

ZeToX2007 добавил:
Но лучше сначало создать группу играющих игроков, потом когда игрок покидает игру убирать его из групы, и текст писать писать для для этой группы, имхо
Старый 30.08.2009, 02:15
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
я просто немного сомневался насчет loopов, боюсь что не всем игрокам сообщение покажется а так я был уверен что в остальном все гуд.
p:s можно оптимизировать чтонибудь?
Старый 30.08.2009, 02:18
ZeToX2007

offline
Опыт: 7,009
Активность:
Код:
scope PlayerExit initializer Init
globals
force f = CreateForce()
endglobals

private function Actions takes nothing returns nothing
 local string s=GetPlayerName(GetTriggerPlayer())
 call ForceRemovePlayer (f,GetTriggerPlayer())
if IsPlayerInForce(GetLocalPlayer(), f) then
 call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,s+" has left the game.")
endif
endfunction

private function Init takes nothing returns nothing
 local trigger t=CreateTrigger()
 local integer i=0

 loop
 exitwhen i==12
 if  GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING  then
 call ForceAddPlayer (f,Player(i))
 call TriggerRegisterPlayerEvent(t,Player(i),EVENT_PLAYER_LEAVE)
 endif
 set i=i+1
 endloop
 call TriggerAddAction(t,function Actions)
 set t=null
endfunction
endscope


ZeToX2007 добавил:
Bee, Как те мой вариант ?

Отредактировано ZeToX2007, 30.08.2009 в 02:31.
Старый 30.08.2009, 02:24
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
ZeToX2007, спасибо, закрыто.
Старый 30.08.2009, 02:30
ZeToX2007

offline
Опыт: 7,009
Активность:
Или можно юзать bj_FORCE_ALL_PLAYERS )))))
Старый 30.08.2009, 02:33
Toadcop

offline
Опыт: 54,313
Активность:
оффтоп. но ближе работая с реплеями я понял что...
Код:
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,s+" has left the game.")
фейл. т.е.
мессага локальному игроку в этом случие это как бы симулирует показание мессаги ВСЕМ игрокам одним действием. по настоящему это обманчивая лож... ибо в реплее локал плаер всегда равен первый играющий игрок (и не меняетса при изменение игрока т.е. за кем следит в реплеи)

т.е. правильно делать вот так.

Код:
function echo takes string msg returns nothing
    local integer i=0
  loop
   exitwhen i>11
    call DisplayTextToPlayer(Player(i),0,0,msg)
   set i=i+1
  endloop
endfunction


и сам вызов

if GetLocalPlayer()==Player(X) then
    call echo("my msg O_O")
endif


но фактически здесь нас ждёт второй фейл ! О_О
это сам GetLocalPlayer() что бы всё сделать "правильно" надо самому его симулировать ! напр глобальным boolean массивом. т.е. у каждого игрока будет туда записан он сам типо

local[0]=true
local[1]=false
local[2]=false
...

т.е. если GetLocalPlayer() == 0 то будет как выше написано. и у каждого игрока по своему (асинхроный массив) ну и обращение выгледит рода

if local[_Player_Id_Here_] then
// local actions
endif
таким образом есть оптимизацыя и лутчый контроль...

и тем самым во время реплея (если сделать еще доп код который активируетса тока при реплее) можно успешно и на 100% смотреть реплей от лица нужного игрока. фактически сейчас такое есть только в ТсХАОС но на уровне беты когда нибудь буду еще улутчать наверно...

так что вот иногда очень простые вещи не являютса такими простыми как кажутса и конечно же и наоборот =)
Старый 30.08.2009, 02:35
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
~Toadcop, ты меня запутал. Мой вариант правилен? Его нельзя оптимизировать? Он самый лудший в своем роде? Тогда закрыто.

Bee добавил:
!moders pls kill this theme!
Старый 30.08.2009, 05:29
Toadcop

offline
Опыт: 54,313
Активность:
я модер -.- ничего убивать не будем.
Цитата:
Он самый лудший в своем роде?
нет конечно. Force непонятное уг чють больше чем полностью...
Старый 30.08.2009, 15:00
adic3x

offline
Опыт: 108,439
Активность:
// cJass

include "cj_print.j"

scope PlayerExit initializer Init {

    void Actions () {
        int i = 0x00
        string s = sprintf ("^pc has left the game.", GetTriggerPlayer())

        loop {
            DisplayTimedTextToPlayer(Player(i), 0., 0., 10., s)
            exitwhen ++i = 0x0c
        }
    }

    void Init () {
        trigger t = CreateTrigger()
        int i = 0x00

        loop {
            TriggerRegisterPlayerEvent(t, Player(i), EVENT_PLAYER_LEAVE)
            exitwhen ++i == 0x0c
        }

        TriggerAddAction(t, function Actions)
        t = null
    }

}
ADOLF добавил:
^^
Старый 30.08.2009, 16:49
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
ADOLF, omg крой скорее.
Старый 30.08.2009, 16:55
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
А как cJass компилирует такой код в конечном виде?)
Старый 30.08.2009, 17:02
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Что вообще такое cJass? Я думал что дальше vJass'a некуда. Чем вам вексориан не угодил.
Старый 30.08.2009, 17:08
N1XapOIII

offline
Опыт: 1,815
Активность:
Код:
function Trig_MDE_Actions takes nothing returns nothing
    call DisplayTextToForce(GetPlayersAll(), "Someone has left the game" )
endfunction

function InitTrig_MDE takes nothing returns nothing
    local trigger MDE = CreateTrigger()
    local integer Igrok = 0
        loop
            exitwhen Igrok == 12
            call TriggerRegisterPlayerEvent(MDE, ConvertedPlayer(Igrok), EVENT_PLAYER_LEAVE)
            set Igrok = Igrok + 1
        endloop
    call TriggerAddAction( MDE, function Trig_MDE_Actions )
    set Igrok = 0
    set MDE = null
endfunction


Я думаю так будет лучше всего. =)

// это не так - прим. Адик

Отредактировано ADOLF, 31.08.2009 в 12:27.
Старый 30.08.2009, 17:19
Elf_Stratigo

offline
Опыт: 4,699
Активность:
думаю игрокам больше важен игровой процесс нежели его просмотр
Старый 30.08.2009, 17:54
adic3x

offline
Опыт: 108,439
Активность:
Я думаю так будет лучше всего. =)
типичный пример быдлокода, медленне + читабельность жуткая
называть переменные "Igrok" отучивайтесь сразу т.к. придумать что то хуже почти невозможно
цикл организован неправильно
елки, вы еще и интерег обнуляете... кто вас этому научил?! это делать ненадо...
я наверное прикрою тему, да?
Старый 31.08.2009, 12:24
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
ADOLF, готов услышать самый лучший вариант =)
Не вижу координальных различий, разве что код на cJass лучше и чище выглядит =)

Отредактировано Hellfim, 31.08.2009 в 12:51.
Старый 31.08.2009, 12:35
ScorpioT1000
Работаем
offline
Опыт: отключен
Toadcop:
но фактически здесь нас ждёт второй фейл ! О_О
а как насчет того, что проверять на плейер 0(раз в реплее всегда игрок1, то зачем показывать всем 12 при локале? т.е. можно показать тока локалу и игроку1) :) либо тому, с чьей стороны смотрица реплей.
ScorpioT1000 добавил:
а я все понял
ScorpioT1000 добавил:
массив булов для того чтобы был статус "смотрится ли сейчас реплей от лица этого игрока"
ScorpioT1000 добавил:
имхо для 12 человек пофиг, тут же не over 9000
я вот думаю нафиг вобще local player тогда для показа?
или ты привел пример на "простом"?
Старый 31.08.2009, 12:49
adic3x

offline
Опыт: 108,439
Активность:
разве что код на cJass лучше и чище выглядит
за это и боролись, и print качественно (оптимально) выводит цветные имена игроков
Старый 31.08.2009, 13:05
Закрытая тема

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

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

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

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



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