Как может наличие BJDebugMsg("1") в одной функции ломать выполнение других?
Есть две библиотеки. Одна выше (Main), в ней инициализируются структуры и трекеблы (используется ExecuteFunc), при этом я вывожу их координаты.
code
include "cj_types.j"
constant real tick = 1//0.01
constant real delta = 64//square size
define field = bj_mapInitialCameraBounds
define mod = ModuloInteger
library Main initializer Init
{
    hashtable hash
    private trigger onhit, ontrack
    real X0,Y0,X1,Y1 // Camera bounds
    real mX0,mY0,mX1,mY1 // Entire map bounds
    // Square grid
    public keyword Square
    Square array loc
    int loci
    public struct Square
    {
        int index
        real cx, cy
        int ix, iy
        static thistype Create (int x, int y)
        {
            // Allocation
            thistype s = thistype.create()
            loci++; s.index=loci; loc[loci] = s
            
            // Coordinates
            s.ix=x; s.iy=y; s.cx=mX0+x*delta; s.cy=mY0+y*delta
            
            // Mouse tracking
            BJDebugMsg(R2S(s.cx)+":"+R2S(s.cy))
            trackable tr = CreateTrackable("Trackable.mdx", s.cx, s.cy, 0)
            SaveInteger(hash,GetHandleId(tr),0,s.index)
            TriggerRegisterTrackableHitEvent(onhit, tr)
            TriggerRegisterTrackableTrackEvent(ontrack, tr)
            tr=null
            
            // Finish
            return s
        }
    }
    // event args
    Square TriggeredSquare; private void SetTrigCell () {TriggeredSquare = LoadInteger(hash,GetHandleId(GetTriggeringTrackable()),0)}
    // 'event handlers', use execute func from there
    private void Tick () // executes everything 100 times per second
    {
    }
    private void OnMouseHit ()
    {SetTrigCell ()
        ExecuteFunc("Test")
    }
    private void OnMouseTrack ()
    {SetTrigCell ()
    }
    timer tick_timer
    private timer time
    real GetTime () {return TimerGetElapsed(time)}
    string GetTimeString ()
    {
        int t = R2I(GetTime())
        int minutes = mod(t,3600)/60
        int seconds = mod(t,60)
        string s = I2S(t/3600) + ":"
        if minutes < 10 {s+="0"}; s+=I2S(minutes); s+=":"
        if seconds < 10 {s+="0"}; s+=I2S(seconds)
        return s
    }
    private int rowcount; private real rowy
    private void Init ()
    {
        hash = InitHashtable()
        // Triggers handling trackables
        onhit=CreateTrigger(); TriggerAddAction(onhit, function OnMouseHit)
        ontrack=CreateTrigger(); TriggerAddAction(ontrack, function OnMouseTrack)
        // Timers
        time = CreateTimer(); TimerStart(time,999999,false,null)
        tick_timer = CreateTimer()
        TimerStart(tick_timer, tick, true, function Tick)
        // Map borders
        X0 = GetRectMinX(field)
        Y0 = GetRectMinY(field)
        X1 = GetRectMaxX(field)
        Y1 = GetRectMaxY(field)
        rect map = bj_mapInitialPlayableArea
        mX0 = GetRectMinX(map)
        mY0 = GetRectMinY(map)
        mX1 = GetRectMaxX(map)
        mY1 = GetRectMaxY(map)
        map=null
        // Init grid
        loci = 0; rowy = mY0; rowcount = 0; ExecuteFunc("Main__InitRow")
    }
    private void InitRow () // Generates a row of squares
    {
        int x=0; real rx=mX0
        loop
        {
            Square.Create(x, rowcount)
            x++; rx+=delta; exitwhen (rx>mX1)
        }
        rowy += delta; rowcount++; if rowy <= mY1 {ExecuteFunc("Main__InitRow")}
    }
}
В другой:
library Test uses Main
{
    void Test()
    {
        Main_Square s = TriggeredSquare
        BJDebugMsg("1") // agrahabl
            CreateUnit(Player(0),'hfoo',s.cx,s.cy,0)
    }
}
из верхней при клике на трекебл вызывается экзекуцией вот эта функция тест.
Странность в том, что пока в функции тест есть BJDebugMsg, трекеблы не создаются (координаты на экран не выходят)
но стоит ее убрать и все создается.
Прилагаю карту, попробуйте с бждебагмсг в тесте и без?

Принятый ответ

Проблема возникает также при переносе вот этого вот в инициализацию триггера тест.
Но при этом если вместо строки вроде "12345" использовать, например, GetAbilityName('Aloc') - то все работает.
Это какой-то баг со строками?
Еще у меня почему-то происходит фантомный клик по центру карты в начале игры
Вобщем не стоит юзать имена функций напрямую в экзекуте и вообще таймеры лучше
0
20
7 лет назад
Отредактирован biridius
0
Проблема возникает также при переносе вот этого вот в инициализацию триггера тест.
Но при этом если вместо строки вроде "12345" использовать, например, GetAbilityName('Aloc') - то все работает.
Это какой-то баг со строками?
Еще у меня почему-то происходит фантомный клик по центру карты в начале игры
Вобщем не стоит юзать имена функций напрямую в экзекуте и вообще таймеры лучше
Принятый ответ
0
32
7 лет назад
0
Абилки на имя нужно опрашивать с умом, игра то мультиязычная, где гарантии что у всех русский варкравт?
Да и вовсе не мешало бы сделать дебаг, то у тебя может быть рекурсия экзекутов, точно нету 2 запуска подряд?
1
18
7 лет назад
1
Хм, у меня тоже клик в центр карты иногда при запуске показывает. Оно не мешает, но интересно, что это может быть?
1
16
7 лет назад
1
Maniac_91:
Хм, у меня тоже клик в центр карты иногда при запуске показывает. Оно не мешает, но интересно, что это может быть?
Белый такой?
1
18
7 лет назад
1
Naadir, ага. Или серый. В зависимости от освещения.
0
20
7 лет назад
Отредактирован biridius
0
quq_CCCP, имя абилки не причем. Просто если в коде где-то есть явно написанная строка (в кавычках) то код не выполняется, а если нет выполняется.
Имя абилки я ставил вместо кавычной строки чтобы проверить, в строках дело или в бждебаге.
Когда я убираю эти строки, то в начале игры дебаг выводит мне координаты и все экзикутится.
Но когда я возвращаю строки, то никакого текста не появляется.
Заменив execute на таймер избавился от этих проблем, но все равно интересно что это было.
0
32
7 лет назад
0
Значит ошибка в названии, пропуск или кавычки... Если функция не найдена, то поток подвисает. При ините это как правило фатал...
0
20
7 лет назад
0
quq_CCCP, код компилируется, ничего не висит и не фаталит.
Просто когда где-то в каком-либо триггере есть строка в кавычках, то execute не срабатывает.
Когда я эту ни с чем не связанную строку убираю, все опять работает.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.