![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Сейчас писал интерактивную обучалку к игре, и наткнулся на одну очень неприятную особенность, которая украла у меня несколько часов жизни ). Больше похожую на баг в ас3. В общем, не знаю баг это или нет, но суть в следующем. Есть некий класс TrainingStep, который в упрощенном виде выглядит примерно так (в очень упрощенном виде):
package training { public class TrainingStep { public var targetDo:Sprite = null; public var finished:Boolean = false; } } Далее этап помещается в массив. И в другой функции, по энтерфрейму проверяется весь массив до первого не пройденного этапа. И вот тут то начинаются странности, которые не поддаются моей логике. Если используется публичная переменная targetDo, то в цикле, при проверке ссылки на ней, вылетит обращение к объекту null. Если же, изменить ее на приватную, для назначения использовать сеттер, а для получения геттер, то все нормально. package training { public class TrainingStep { private var _targetDo:Sprite = null; public var finished:Boolean = false; public function set targetDo(value:Sprite):void { _targetDo = value; } public function get targetDo():Sprite { return _targetDo; } } } И вот отсюда вытекает вопрос, как так? Публичная переменная не может хранить ссылку на дисплей объект? Или это действительно баг в языке? |
|
|||||
|
Цитата:
Вот кусок функции, в котором этапы создаются: private function setUpTraning():void { var ts:TrainingStep = new TrainingStep(Clause.SELECT_SOLDIER, _mySquad); ts.mouseRestrictor = new Rectangle(0, 0, 800, 350); ts.soldier = _gui.soldierHolders[_gui.soldierHolders.length -1].soldier; ts.targetDo = _gui.soldierHolders[_gui.soldierHolders.length -1]; // точно не null, и не зануляется в процессе ts.needsFocus = true; ts.needsTab = true; ts.keysText = "TAB + Щелчок левой кнопкой"; _steps.push(ts); } private function checkSteps():void{ var length:int = _steps.length; for (var j:int = 0; j < length; j++) { if (!_steps[j].finished) { if (_steps[j].window != null) { stage.addChild(_steps[j].window); } if (_steps[j].needsFocus == false) { FocusScreen.remove(); } _steps[j].update(); if (_steps[j].endClause == Clause.SELECT_SOLDIER) { if (_steps[j].needsTab) { FocusScreen.needsSomeKey(Keyboard.TAB); } FocusScreen.text = _steps[j].keysText; var targetPos:Point = (_steps[j].targetDo as Sprite).localToGlobal(new Point()); // если использовать паблик переменную, то здесь вылетит обращение к объекту null, если геттер, то все пройдет как по маслу targetPos.x += _steps[j].targetDo.width / 2; targetPos.y += _steps[j].targetDo.height / 2; FocusScreen.add(targetPos, 30); } if (_emptyVehicleIcon.parent) { _emptyVehicleIcon.parent.removeChild(_emptyVehicleIcon); } break; } else { _steps[j].dispose(); _steps.splice(j, 1); FocusScreen.remove(); break; } } } |
|
|||||
|
Цитата:
Добавлено через 2 минуты P.S. Вас самого не напрягают постоянные обращения типа _steps[j] и _gui.soldierHolders[_gui.soldierHolders.length -1];? Даже если не принимать в расчет производительность.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Цитата:
Если постоянно строчить [].field - компилятор не увидит ошбки в написании field и не будет проверять его поля. Ну и код читабельнее без []. По существу предположения 2: - сделали описку в поле public var targetDo или при обращении к нему, а не упало потому что на MovieClip при определённых настройках компилятора можно динамически создавать поля (ничем не поддверждено, другого придумать не могу просто) - бага компилятора На сферическом примере в вакууме никакого бага нет: package training { import flash.display.Sprite; public class TrainingStep { public var targetDo:Sprite = null; public var finished:Boolean = false; } } package { import flash.display.Sprite; import training.TrainingStep; public class Main extends Sprite { public function Main():void { var sprite:Sprite = new Sprite(); sprite.graphics.lineStyle(2, 0xff0000); sprite.graphics.drawEllipse(0, 0, 100, 80); var step:TrainingStep = new TrainingStep(); step.targetDo = sprite; addChild(step.targetDo);// Круг добавляет, не падает } } } Т.е. пытаемся вручную в приложении присвоить этому полю недачливый спрайт, посмотреть пропала ли бага, если _не_ пропала, попробовать присвоить другой спрайт и так пока не будет достигнут минимум, при котором бага ещё существует. Последний раз редактировалось expl; 23.10.2012 в 22:31. |
|
|||||
|
Цитата:
Цитата:
Плюс к тому, когда преписываю геттер / сеттер, я просто добавляю к имени переменной андерскор, и в ФД жму ctrl + shift + 1 для автогенерации. Создается геттер и сеттер, с тем же именем. И все магическим образом начинает работать. При обращении тоже никаких опечаток. Цитата:
|
|
|||||
|
Цитата:
Цитата:
Однако, моя версия действительно маловероятна. А как насчёт попыток минимально воспроизвести багу? Просто у меня не было таких проблем и сейчас вот набрал пример - всё работает. Т.е Вам придется либо докопаться до Истины, либо забить, решить что произошла аномалия, что в остальных местах поле вместо гетера работает правильно |
|
|||||
|
Цитата:
Цитата:
Цитата:
expl, у Вас пример не верный. Естественно она сразу же не отпадет. Отпадает при таком условии: В одном методе создается объект, и его публичной переменной присваиватеся спрайт. Потом этот объект помещается в массив. А в другом методе, по энтер фрейму перебирается массив, и происходит попытка обращения к этой переменной. п.с. Но на минимальном тесте не отваливается... Странно все это. Буду копать дальше. Если обнаружу в чем проблема, отпишусь. Добавлено через 15 минут Да... Баг обнаружился. Глюк флешдевелоп, или флекс сдк. Сейчас еще раз проверил, все опять отвалилось. Закрыл ФД. Опять запустил, скомпилировал, заработало. Последний раз редактировалось caseyryan; 23.10.2012 в 22:56. |
|
|||||
|
[+1 22.04.13]
[+1 06.03.13] Регистрация: Apr 2012
Сообщений: 239
|
бывает... я как-то бился 3 часа, искал ошибку в своем коде и потом оказалось что adblock в браузере блокирует get запрос к серверу, потому что в урле содержится слово ads .... =)
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
У Flash IDE это постоянный прикол был с кэшированием. В ФД сталкивался два раза за всю историю отношений.. так что с первым причастием, caseyryan))))
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:43. |
|
|
« Предыдущая тема | Следующая тема » |
|
|