Как может наличие 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, трекеблы не создаются (координаты на экран не выходят)
но стоит ее убрать и все создается.
Странность в том, что пока в функции тест есть BJDebugMsg, трекеблы не создаются (координаты на экран не выходят)
но стоит ее убрать и все создается.
Прилагаю карту, попробуйте с бждебагмсг в тесте и без?
Принятый ответ
Проблема возникает также при переносе вот этого вот в инициализацию триггера тест.
Но при этом если вместо строки вроде "12345" использовать, например, GetAbilityName('Aloc') - то все работает.
Это какой-то баг со строками?
Но при этом если вместо строки вроде "12345" использовать, например, GetAbilityName('Aloc') - то все работает.
Это какой-то баг со строками?
Еще у меня почему-то происходит фантомный клик по центру карты в начале игры
Вобщем не стоит юзать имена функций напрямую в экзекуте и вообще таймеры лучше
Вобщем не стоит юзать имена функций напрямую в экзекуте и вообще таймеры лучше
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован biridius
Но при этом если вместо строки вроде "12345" использовать, например, GetAbilityName('Aloc') - то все работает.
Это какой-то баг со строками?
Вобщем не стоит юзать имена функций напрямую в экзекуте и вообще таймеры лучше
Да и вовсе не мешало бы сделать дебаг, то у тебя может быть рекурсия экзекутов, точно нету 2 запуска подряд?
Отредактирован biridius
Имя абилки я ставил вместо кавычной строки чтобы проверить, в строках дело или в бждебаге.
Но когда я возвращаю строки, то никакого текста не появляется.
Заменив execute на таймер избавился от этих проблем, но все равно интересно что это было.
Просто когда где-то в каком-либо триггере есть строка в кавычках, то execute не срабатывает.
Когда я эту ни с чем не связанную строку убираю, все опять работает.