PageRenderTime 58ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/flashmedia/basics/GameObject.as

https://github.com/vkflashmedia/Facecontrol
ActionScript | 865 lines | 652 code | 69 blank | 144 comment | 88 complexity | 3385ef5a9bd4599f1efbecb54e710d4c MD5 | raw file
  1. package com.flashmedia.basics
  2. {
  3. import com.flashmedia.basics.actions.intervalactions.Animation;
  4. import flash.display.Bitmap;
  5. import flash.display.DisplayObject;
  6. import flash.display.Sprite;
  7. import flash.events.KeyboardEvent;
  8. import flash.events.MouseEvent;
  9. import flash.geom.Rectangle;
  10. import flash.text.TextField;
  11. import flash.text.TextFieldAutoSize;
  12. import flash.text.TextFormat;
  13. /*
  14. TODO недостаточно настроек для задания фокуса. Нет смещения по x y, выравнивания, растяжения по ширине высоте и т.п.
  15. TODO разобраться как правильно рисовать прямоугольник (width - 1) или width
  16. TODO изменить все координаты и размеры на Number, так как идет потеря точности.
  17. Например в GridBox между выделением иногда появляются пробелы.
  18. TODO Для оптимизации можно использовать систему сигналов, как в той статье.
  19. */
  20. /**
  21. * Наследуемся от Sprite, чтобы получать пользовательские события (Мышь, Клавиатура ...)
  22. * Автоматическое масштабирование, поворот
  23. * Альфа, наложения, фильтры, маскирование
  24. * Видимость-невидимость
  25. */
  26. public class GameObject extends Sprite
  27. {
  28. public static const CONTROL_STATE_NORMAL:uint = 0;
  29. public static const CONTROL_STATE_HIGHLIGHTED:uint = 1;
  30. public static const CONTROL_STATE_DISABLED:uint = 2;
  31. public static const CONTROL_STATE_SELECTED:uint = 3;
  32. public static const VISUAL_SELECT_MASK_Z_ORDER: int = 1200;
  33. public static const VISUAL_SELECT_Z_ORDER: int = 1100;
  34. public static const VISUAL_DEBUG_CONTAINER_Z_ORDER: int = 1000;
  35. public static const VISUAL_DISPLAY_OBJECT_Z_ORDER: int = 801;
  36. public static const VISUAL_TEXT_FIELD_Z_ORDER: int = 800;
  37. public static const VISUAL_BORDER_Z_ORDER: int = 700;
  38. public static const VISUAL_BITMAP_MASK_Z_ORDER: int = 500;
  39. public static const VISUAL_BITMAP_Z_ORDER: int = 400;
  40. public static const VISUAL_FOCUS_Z_ORDER: int = 300;
  41. public static const VISUAL_HOVER_Z_ORDER: int = 200;
  42. public static const NAME_SELECT_MASK: String = 'game_object_select_mask';
  43. public static const NAME_SELECT: String = 'game_object_select';
  44. public static const NAME_DEBUG_CONTAINER: String = 'game_object_debug_container';
  45. public static const NAME_TEXT_FIELD: String = 'game_object_text_field';
  46. public static const NAME_BORDER: String = 'game_object_border';
  47. public static const NAME_BITMAP_MASK: String = 'game_object_bitmap_mask';
  48. public static const NAME_BITMAP: String = 'game_object_bitmap';
  49. public static const NAME_FOCUS: String = 'game_object_focus';
  50. public static const NAME_HOVER: String = 'game_object_hover';
  51. //TODO remove
  52. // public static const HORIZONTAL_ALIGN_NONE: String = 'hor_align_none';
  53. // public static const HORIZONTAL_ALIGN_LEFT: String = 'hor_align_left';
  54. // public static const HORIZONTAL_ALIGN_CENTER: String = 'hor_align_center';
  55. // public static const HORIZONTAL_ALIGN_RIGHT: String = 'hor_align_right';
  56. // public static const VERTICAL_ALIGN_NONE: String = 'vert_align_none';
  57. // public static const VERTICAL_ALIGN_TOP: String = 'vert_align_top';
  58. // public static const VERTICAL_ALIGN_CENTER: String = 'vert_align_center';
  59. // public static const VERTICAL_ALIGN_BOTTOM: String = 'vert_align_bottom';
  60. public static const HOVER_INDENT: uint = 7;
  61. public static const HOVER_COLOR: uint = 0x57c8d5;
  62. public static const HOVER_ALPHA: Number = 0.2;
  63. public static const FOCUS_INDENT: uint = 7;
  64. public static const FOCUS_COLOR: uint = 0x57c8d5;
  65. public static const FOCUS_ALPHA: Number = 0.6;
  66. public static const BACKGROUNG_COLOR: uint = 0xfefefe;
  67. public static const SELECT_COLOR: uint = 0xffdd00;
  68. public static const BORDERS_COLOR: uint = 0x0000ff;
  69. public static const MAX_Z_ORDER: int = 9999;
  70. public static const SIZE_MODE_BORDER: String = 'size_mode_border';
  71. public static const SIZE_MODE_SELECT: String = 'size_mode_select';
  72. // protected var _speedX: int;
  73. // protected var _speedY: int;
  74. // protected var _stationary: Boolean; //
  75. // protected var _interactive: Boolean; //
  76. // protected var _mass: uint;
  77. // protected var _elasticity: uint = 1; // упругость [0..1]
  78. // private var states: Array; // визуальные состояния
  79. public static const MIN_WIDTH: Number = 1;
  80. public static const MIN_HEIGHT: Number = 1;
  81. protected var _width: Number;
  82. protected var _height: Number;
  83. // ширина и высота определяются автоматически по графическомуу содержимому
  84. protected var _autoSize: Boolean;
  85. protected var _zOrder: int;
  86. protected var _type: String; // произвольный пользовательский тип
  87. // отладка
  88. protected var _debug: Boolean;
  89. protected var _debugText: TextField;
  90. protected var _debugContainer: Sprite;
  91. protected var _scene: GameScene;
  92. // графическое содержимое
  93. protected var _bitmap: Bitmap;
  94. //потом сделать более сложное выделение - произвольную область, а по умолчанию по границам.
  95. // текстовое содержимое
  96. protected var _textField: TextField;
  97. // область выделения
  98. protected var _select: Sprite;
  99. // объект маска для выделения. Позволяет задать выделению форму, отличную от прямоугольника.
  100. protected var _selectMask: Sprite;
  101. // границы объ_selectекта - отдельный объект, так как при изменении границ нужно удалить, пересоздать и заново добавлять его
  102. protected var _border: Sprite;
  103. // объект маска для маскирования (отсечения)
  104. protected var _bitmapMask: Sprite;
  105. // слой, на котором располагается игровой объект
  106. protected var _gameLayer: GameLayer;
  107. // настройка свойств селекта
  108. protected var _selectable: Boolean;
  109. protected var _selectAutosize: Boolean;
  110. protected var _selectRect: Rectangle;
  111. // модальный показ объекта
  112. protected var _isModal: Boolean;
  113. // настройка свойств фокуса
  114. protected var _focusEnabled: Boolean;
  115. protected var _viewFocus: Boolean;
  116. protected var _isDefaultFocus: Boolean;
  117. protected var _focus: DisplayObject;
  118. protected var _focusSizeMode: String;
  119. protected var _focusLayout: int;
  120. protected var _focusFillColor: int;
  121. protected var _focusFillAlpha: Number;
  122. protected var _focusBorderColor: int;
  123. protected var _focusBorderAlpha: Number;
  124. // настройка свойств рамки при наведении
  125. protected var _hoverEnabled: Boolean;
  126. protected var _viewHover: Boolean;
  127. protected var _isDefaultHover: Boolean;
  128. protected var _hover: DisplayObject;
  129. protected var _hoverSizeMode: String;
  130. protected var _hoverLayout: int;
  131. protected var _hoverFillColor: int;
  132. protected var _hoverFillAlpha: Number;
  133. protected var _hoverBorderColor: int;
  134. protected var _hoverBorderAlpha: Number;
  135. // цвет фона
  136. protected var _fillBackground: Boolean;
  137. protected var _backgroundColor: uint;
  138. protected var _backgroundAlpha: Number;
  139. // слои игрового обекта
  140. protected var _view: View;
  141. // анимации
  142. /**
  143. * Список анимаций игрового объекта.
  144. */
  145. protected var _animations: Array;
  146. /**
  147. * Анимация, которая воспроизводится в данный момент.
  148. * Если ничего не воспроизводится, то null.
  149. */
  150. protected var _playingAnim: Animation;
  151. public function GameObject(value: GameScene)
  152. {
  153. super();
  154. _scene = value;
  155. _view = new View(this);
  156. _debug = false;
  157. _autoSize = true;
  158. setSelect(false, true);
  159. setFocusColor(FOCUS_COLOR, FOCUS_ALPHA, FOCUS_COLOR, 1);
  160. setFocus(false, true, null, View.ALIGN_HOR_NONE | View.ALIGN_VER_NONE, SIZE_MODE_BORDER);
  161. setHoverColor(HOVER_COLOR, HOVER_ALPHA, HOVER_COLOR, 1);
  162. setHover(false, true, null, View.ALIGN_HOR_NONE | View.ALIGN_VER_NONE, SIZE_MODE_BORDER);
  163. _type = 'GameObject';
  164. _backgroundColor = BACKGROUNG_COLOR;
  165. _backgroundAlpha = 1.0;
  166. _fillBackground = false;
  167. _zOrder = 1;
  168. _isModal = false;
  169. // границы объекта
  170. _width = MIN_WIDTH;
  171. _height = MIN_HEIGHT;
  172. width = 100;
  173. height = 100;
  174. }
  175. public function destroy(): void {
  176. if (_focus) {
  177. _view.removeDisplayObject(NAME_FOCUS);
  178. _focus = null;
  179. }
  180. if (_hover) {
  181. _view.removeDisplayObject(NAME_HOVER);
  182. _hover = null;
  183. }
  184. if (_border) {
  185. _view.removeDisplayObject(NAME_BORDER);
  186. _border = null;
  187. }
  188. if (_bitmap) {
  189. _view.removeDisplayObject(NAME_BITMAP);
  190. _bitmap = null;
  191. }
  192. if (_bitmapMask) {
  193. _view.removeDisplayObject(NAME_BITMAP_MASK);
  194. _bitmapMask = null;
  195. }
  196. if (_textField) {
  197. _view.removeDisplayObject(NAME_TEXT_FIELD);
  198. _textField = null;
  199. }
  200. if (_select) {
  201. _select.removeEventListener(KeyboardEvent.KEY_DOWN, keyboardListener);
  202. _select.removeEventListener(MouseEvent.CLICK, mouseClickListener);
  203. _select.removeEventListener(MouseEvent.DOUBLE_CLICK, mouseDoubleClickListener);
  204. _select.removeEventListener(MouseEvent.MOUSE_OVER, mouseOverListener);
  205. _select.removeEventListener(MouseEvent.MOUSE_OUT, mouseOutListener);
  206. _select.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
  207. _view.removeDisplayObject(NAME_SELECT);
  208. _select = null;
  209. }
  210. if (_selectMask) {
  211. _view.removeDisplayObject(NAME_SELECT_MASK);
  212. _selectMask = null;
  213. }
  214. if (_debugContainer) {
  215. _view.removeDisplayObject(NAME_DEBUG_CONTAINER);
  216. _debugContainer = null;
  217. }
  218. _gameLayer = null;
  219. //todo release animations
  220. //todo release view
  221. }
  222. public function get view(): View {
  223. return _view;
  224. }
  225. public function set debug(value: Boolean): void {
  226. _debug = value;
  227. drawDebugInfo();
  228. // sortSprites();
  229. }
  230. public function set isModal(value: Boolean): void {
  231. _isModal = value;
  232. }
  233. public function get isModal(): Boolean {
  234. return _isModal;
  235. }
  236. public function get debug(): Boolean {
  237. return _debug;
  238. }
  239. public override function get width(): Number {
  240. return _width;
  241. }
  242. public override function set width(value: Number): void {
  243. if (value < MIN_WIDTH) {
  244. value = MIN_WIDTH;
  245. }
  246. if (_width != value) {
  247. _width = value;
  248. updateBorder();
  249. if (_selectAutosize) {
  250. _selectRect = new Rectangle(0, 0, _width, _height);
  251. updateSelection();
  252. }
  253. updateFocus();
  254. updateHover();
  255. // updateTextFieldAlign();
  256. drawDebugInfo();
  257. // sortSprites();
  258. _view.layoutVisuals();
  259. var event: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_SIZE_CHANGED);
  260. event.gameObject = this;
  261. dispatchEvent(event);
  262. }
  263. }
  264. public override function get height(): Number {
  265. return _height;
  266. }
  267. public override function set height(value: Number): void {
  268. if (value < MIN_HEIGHT) {
  269. value = MIN_HEIGHT;
  270. }
  271. if (_height != value) {
  272. _height = value;
  273. updateBorder();
  274. if (_selectAutosize) {
  275. _selectRect = new Rectangle(0, 0, _width, _height);
  276. updateSelection();
  277. }
  278. updateFocus();
  279. updateHover();
  280. // updateTextFieldAlign();
  281. drawDebugInfo();
  282. // sortSprites();
  283. _view.layoutVisuals();
  284. var event: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_SIZE_CHANGED);
  285. event.gameObject = this;
  286. dispatchEvent(event);
  287. }
  288. }
  289. public function get zOrder(): int {
  290. return _zOrder;
  291. }
  292. /**
  293. * Свойство zOrder имеет смысл, если объект находится на слое GameLayer
  294. */
  295. public function set zOrder(value: int): void {
  296. if (value > MAX_Z_ORDER) {
  297. value = MAX_Z_ORDER;
  298. }
  299. internalZOrder = value;
  300. }
  301. public function get type(): String {
  302. return _type;
  303. }
  304. public function set type(value: String): void {
  305. _type = value;
  306. drawDebugInfo();
  307. }
  308. public function fillBackground(valueColor: uint, valueAlpha: Number): void {
  309. _fillBackground = true;
  310. _backgroundColor = valueColor;
  311. _backgroundAlpha = valueAlpha;
  312. updateBorder();
  313. // sortSprites();
  314. }
  315. public function clearBackground(): void {
  316. _fillBackground = false;
  317. updateBorder();
  318. // sortSprites();
  319. }
  320. public function set bitmapMask(value: Sprite): void {
  321. if (_bitmapMask) {
  322. // removeChild(_bitmapMask);
  323. _view.removeDisplayObject(NAME_BITMAP_MASK);
  324. }
  325. _bitmapMask = value;
  326. _view.addDisplayObject(_bitmapMask, NAME_BITMAP_MASK, VISUAL_BITMAP_MASK_Z_ORDER);
  327. // addChild(_bitmapMask);
  328. if (_bitmap) {
  329. _bitmap.mask = _bitmapMask;
  330. }
  331. // sortSprites();
  332. }
  333. public function set bitmap(value: Bitmap): void {
  334. if (_bitmap) {
  335. // removeChild(_bitmap);
  336. _view.removeDisplayObject(NAME_BITMAP);
  337. }
  338. _bitmap = value;
  339. _view.addDisplayObject(_bitmap, NAME_BITMAP, VISUAL_BITMAP_Z_ORDER);
  340. // addChild(_bitmap);
  341. if (_bitmapMask) {
  342. _bitmap.mask = _bitmapMask;
  343. }
  344. if (_autoSize) {
  345. width = _bitmap.width;
  346. height = _bitmap.height;
  347. }
  348. drawDebugInfo();
  349. // sortSprites();
  350. }
  351. public function setTextField(value: TextField, layoutMode: int = 0): void {
  352. if (_textField) {
  353. _view.removeDisplayObject(NAME_TEXT_FIELD);
  354. }
  355. if (value) {
  356. _textField = value;
  357. _view.addDisplayObject(_textField, NAME_TEXT_FIELD, VISUAL_TEXT_FIELD_Z_ORDER, layoutMode);
  358. }
  359. }
  360. public function get bitmap(): Bitmap {
  361. if (_bitmap) {
  362. return _bitmap;
  363. }
  364. return null
  365. }
  366. public function get textField(): TextField {
  367. return _textField;
  368. }
  369. public function set autoSize(value: Boolean): void {
  370. _autoSize = value;
  371. }
  372. public function get autoSize(): Boolean {
  373. return _autoSize;
  374. }
  375. public function setSelect(selectable: Boolean, autoSize: Boolean = true, selectMask: Sprite = null, selectRect: Rectangle = null): void {
  376. _selectable = selectable;
  377. if (_selectable) {
  378. _selectAutosize = autoSize;
  379. _selectRect = selectRect;
  380. if (_selectAutosize || !_selectRect) {
  381. _selectRect = new Rectangle(0, 0, _width, _height);
  382. }
  383. if (_selectMask) {
  384. _view.removeDisplayObject(NAME_SELECT_MASK);
  385. }
  386. _selectMask = selectMask;
  387. if (_selectMask) {
  388. _view.addDisplayObject(_selectMask, NAME_SELECT_MASK, VISUAL_SELECT_MASK_Z_ORDER);
  389. }
  390. if (_selectRect && _selectMask) {
  391. _selectMask.x = _selectRect.x;
  392. _selectMask.y = _selectRect.y;
  393. }
  394. }
  395. updateSelection();
  396. updateFocus();
  397. updateHover();
  398. drawDebugInfo();
  399. // sortSprites();
  400. }
  401. public function get selectable(): Boolean {
  402. return _selectable;
  403. }
  404. public function setFocusColor(fillColor: int, fillAlpha: Number, borderColor: int, borderAlpha: Number): void {
  405. _focusFillColor = fillColor;
  406. _focusFillAlpha = fillAlpha;
  407. _focusBorderColor = borderColor;
  408. _focusBorderAlpha = borderAlpha;
  409. updateFocus();
  410. }
  411. public function setFocus(enabled: Boolean, viewFocus: Boolean = true, focusDisplayObject: DisplayObject = null, layout: int = 0, sizeMode: String = SIZE_MODE_BORDER): void {
  412. _focusEnabled = enabled;
  413. _viewFocus = viewFocus;
  414. _isDefaultFocus = !focusDisplayObject;
  415. _focus = focusDisplayObject;
  416. _focusLayout = layout;
  417. _focusSizeMode = sizeMode;
  418. updateFocus();
  419. }
  420. public function get canFocus(): Boolean {
  421. return _focusEnabled;
  422. }
  423. public function set focus(value: Boolean): void {
  424. if (_focusEnabled) {
  425. if (_viewFocus) {
  426. _focus.visible = value;
  427. }
  428. var eventType: String = GameObjectEvent.TYPE_LOST_FOCUS;
  429. if (value) {
  430. eventType = GameObjectEvent.TYPE_SET_FOCUS;
  431. }
  432. var goEvent: GameObjectEvent = new GameObjectEvent(eventType);
  433. goEvent.gameObject = this;
  434. dispatchEvent(goEvent);
  435. }
  436. }
  437. // public function set focusSizeMode(value: String): void {
  438. // _focusSizeMode = value;
  439. // updateFocus();
  440. // //sortSprites();
  441. // }
  442. public function setHoverColor(fillColor: int, fillAlpha: Number, borderColor: int, borderAlpha: Number): void {
  443. _hoverFillColor = fillColor;
  444. _hoverFillAlpha = fillAlpha;
  445. _hoverBorderColor = borderColor;
  446. _hoverBorderAlpha = borderAlpha;
  447. updateHover();
  448. }
  449. public function setHover(enabled: Boolean, viewHover: Boolean = true, hoverDisplayObject: DisplayObject = null, layout: int = 0, sizeMode: String = SIZE_MODE_BORDER): void {
  450. _hoverEnabled = enabled;
  451. _viewHover = viewHover;
  452. _isDefaultHover = !hoverDisplayObject;
  453. _hover = hoverDisplayObject;
  454. _hoverLayout = layout;
  455. _hoverSizeMode = sizeMode;
  456. updateHover();
  457. }
  458. // public function set canHover(value: Boolean): void {
  459. // _hoverEnabled = value;
  460. // updateHover();
  461. //// sortSprites();
  462. // }
  463. // public function set hoverSprite(value: Sprite): void {
  464. // _hover = value;
  465. // updateHover();
  466. // sortSprites();
  467. // }
  468. public function get canHover(): Boolean {
  469. return _hoverEnabled;
  470. }
  471. public function set hover(value: Boolean): void {
  472. if (_hoverEnabled && _viewHover) {
  473. _hover.visible = value;
  474. }
  475. }
  476. // public function set hoverSizeMode(value: String): void {
  477. // _hoverSizeMode = value;
  478. // updateHover();
  479. // sortSprites();
  480. // }
  481. public function get gameLayer(): GameLayer {
  482. return _gameLayer;
  483. }
  484. public function get scene(): GameScene {
  485. return _scene;
  486. }
  487. /**
  488. * Добавляет анимацию в список анимаций GameObject
  489. */
  490. public function addAnimation(value: Animation): void {
  491. if (!_animations) {
  492. _animations = new Array();
  493. }
  494. _animations.push(value);
  495. }
  496. /**
  497. * Поиск анимации в списке анимация.
  498. * @anm - ссылка или строковое имя анимации.
  499. */
  500. private function findAnim(anm: *): Animation {
  501. var result: Animation = null;
  502. if (anm is String) {
  503. for each(var aa: Animation in _animations) {
  504. if (aa.nameAction == (anm as String)) {
  505. result = aa;
  506. }
  507. }
  508. }
  509. if (anm is Animation) {
  510. result = _animations[_animations.indexOf(anm)];
  511. }
  512. return result;
  513. }
  514. /**
  515. * Начать прогрывание анимации по имени или ссылке
  516. * @anm - строковое имя или ссылка на объект анимации
  517. * @loopCount - количество воспроизведений анимации. По умолчанию 1. Отрицательное число - бесконечное воспроизведение.
  518. * @startFrame - индекс кадра, с которого начинать воспроизведение. По умолчанию 0.
  519. * @endFrame - индекс кадра, на котором заканчивать воспроизведение. По умолчанию последний кадр.
  520. */
  521. public function startAnimation(anm: *, iterationsCount: int = 1, startFrame: int = -1, endFrame: int = -1): void {
  522. var a: Animation = findAnim(anm);
  523. if (a) {
  524. // if (_playingAnim) {
  525. // _playingAnim.stop();
  526. // }
  527. _playingAnim = a;
  528. //todo add listener start, pause, stop
  529. _playingAnim.start(iterationsCount, startFrame, endFrame);
  530. }
  531. }
  532. /**
  533. * Приостановить воспроизведение.
  534. * При следующем вызове startAnimation, воспроизведение будет продолжено с текущего кадра.
  535. */
  536. public function pauseAnimation(): void {
  537. if (_playingAnim) {
  538. _playingAnim.pause();
  539. }
  540. }
  541. /**
  542. * Остановить воспроизведение.
  543. * При следующем вызове startAnimation, воспроизведение будет начато сначала.
  544. */
  545. public function stopAnimation(): void {
  546. if (_playingAnim) {
  547. _playingAnim.stop();
  548. }
  549. }
  550. internal function setGameLayer(value: GameLayer): void {
  551. _gameLayer = value;
  552. }
  553. internal function set internalZOrder(value: int): void {
  554. _zOrder = value;
  555. if (_gameLayer) {
  556. _gameLayer.sortChildsByZ();
  557. }
  558. }
  559. protected function drawDebugInfo(): void {
  560. if (_debug) {
  561. if (!_debugContainer) {
  562. _debugContainer = new Sprite();
  563. // addChild(_debugContainer);
  564. _view.addDisplayObject(_debugContainer, NAME_DEBUG_CONTAINER);
  565. }
  566. _debugContainer.graphics.clear();
  567. if (!_debugText) {
  568. _debugText = new TextField();
  569. _debugText.selectable = false;
  570. _debugText.autoSize = TextFieldAutoSize.CENTER;
  571. _debugText.setTextFormat(new TextFormat('Arial', 8));
  572. _debugText.textColor = BORDERS_COLOR;
  573. }
  574. _debugText.text = '[';
  575. _debugText.appendText((_type is String) ? 'type:' +_type : '');
  576. _debugText.appendText((name is String) ? ' name:' + name : '');
  577. _debugText.appendText(']');
  578. _debugText.x = (_width - _debugText.textWidth) / 2;
  579. _debugText.y = (_height - _debugText.textHeight) / 2;
  580. if (!_debugContainer.contains(_debugText)) {
  581. _debugContainer.addChild(_debugText);
  582. }
  583. // main sprite
  584. // _debugContainer.graphics.lineStyle(1, 0x0000ff);
  585. // _debugContainer.graphics.drawRect(0, 0, width, height);
  586. // border sprite
  587. _debugContainer.graphics.lineStyle(1, BORDERS_COLOR);
  588. _debugContainer.graphics.drawRect(0, 0, _width - 1, _height - 1);
  589. // selection
  590. if (_select) {
  591. _select.alpha = 0.5;
  592. }
  593. }
  594. else {
  595. if (_debugContainer) {
  596. _debugContainer.graphics.clear();
  597. _debugContainer.removeChild(_debugText);
  598. }
  599. if (_select) {
  600. _select.alpha = 0.0;
  601. }
  602. }
  603. }
  604. private function updateBorder(): void {
  605. if (!_border) {
  606. _border = new Sprite();
  607. _view.addDisplayObject(_border, NAME_BORDER, VISUAL_BORDER_Z_ORDER, View.ALIGN_HOR_NONE | View.ALIGN_VER_NONE, null, true);
  608. }
  609. _border.graphics.clear();
  610. _border.graphics.lineStyle(1, BORDERS_COLOR, 0.0);
  611. _border.graphics.drawRect(0, 0, _width, _height);
  612. if (_fillBackground) {
  613. _border.graphics.beginFill(_backgroundColor, _backgroundAlpha);
  614. _border.graphics.drawRect(0, 0, _width, _height);
  615. _border.graphics.endFill();
  616. }
  617. // if (!contains(_border)) {
  618. // addChild(_border);
  619. // }
  620. }
  621. private function updateSelection(): void {
  622. if (_selectable) {
  623. if (!_select) {
  624. _select = new Sprite();
  625. _select.mouseEnabled = true;
  626. _select.doubleClickEnabled = true;
  627. _select.addEventListener(KeyboardEvent.KEY_DOWN, keyboardListener);
  628. _select.addEventListener(MouseEvent.CLICK, mouseClickListener);
  629. _select.addEventListener(MouseEvent.DOUBLE_CLICK, mouseDoubleClickListener);
  630. _select.addEventListener(MouseEvent.MOUSE_OVER, mouseOverListener);
  631. _select.addEventListener(MouseEvent.MOUSE_OUT, mouseOutListener);
  632. _select.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
  633. _view.addDisplayObject(_select, NAME_SELECT, VISUAL_SELECT_Z_ORDER);
  634. }
  635. _select.tabEnabled = true;
  636. _select.graphics.clear();
  637. _select.graphics.beginFill(SELECT_COLOR);
  638. _select.graphics.drawRect(_selectRect.x, _selectRect.y, _selectRect.width, _selectRect.height);
  639. _select.graphics.endFill();
  640. _select.alpha = 0.0;
  641. if (_selectMask) {
  642. _select.mask = _selectMask;
  643. }
  644. else {
  645. _select.mask = null
  646. }
  647. // if (!contains(_select)) {
  648. // addChild(_select);
  649. // }
  650. }
  651. else {
  652. if (_select) {
  653. _select.removeEventListener(KeyboardEvent.KEY_DOWN, keyboardListener);
  654. _select.removeEventListener(MouseEvent.CLICK, mouseClickListener);
  655. _select.removeEventListener(MouseEvent.DOUBLE_CLICK, mouseDoubleClickListener);
  656. _select.removeEventListener(MouseEvent.MOUSE_OVER, mouseOverListener);
  657. _select.removeEventListener(MouseEvent.MOUSE_OUT, mouseOutListener);
  658. _select.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener);
  659. //removeChild(_select);
  660. _view.removeDisplayObject(NAME_SELECT);
  661. _select = null;
  662. }
  663. }
  664. }
  665. private function updateFocus(): void {
  666. if (_focusEnabled) {
  667. if (_isDefaultFocus) {
  668. if (!_focus) {
  669. var s: Sprite = new Sprite();
  670. s.visible = false;
  671. _focus = s;
  672. }
  673. (_focus as Sprite).graphics.clear();
  674. (_focus as Sprite).graphics.lineStyle(1, _focusBorderColor, _focusBorderAlpha);
  675. (_focus as Sprite).graphics.beginFill(_focusFillColor, _focusFillAlpha);
  676. switch (_focusSizeMode) {
  677. case SIZE_MODE_SELECT:
  678. if (_select) {
  679. (_focus as Sprite).graphics.drawRect(_selectRect.x, _selectRect.y, _selectRect.width - 1, _selectRect.height - 1);
  680. break;
  681. }
  682. default:
  683. (_focus as Sprite).graphics.drawRect(-FOCUS_INDENT, - FOCUS_INDENT, _width + 2 * FOCUS_INDENT - 1, _height + 2 * FOCUS_INDENT - 1);
  684. }
  685. (_focus as Sprite).graphics.endFill();
  686. }
  687. _focus.visible = false;
  688. _view.removeDisplayObject(NAME_FOCUS);
  689. // if (!_view.contains(NAME_FOCUS)) {
  690. _view.addDisplayObject(_focus, NAME_FOCUS, VISUAL_FOCUS_Z_ORDER, _focusLayout);
  691. // }
  692. // if (!contains(_focus)) {
  693. // addChild(_focus);
  694. // }
  695. }
  696. else {
  697. if (_focus) {
  698. // removeChild(_focus);
  699. _view.removeDisplayObject(NAME_FOCUS);
  700. _focus = null;
  701. }
  702. }
  703. }
  704. private function updateHover(): void {
  705. if (_hoverEnabled) {
  706. if (_isDefaultHover) {
  707. if (!_hover) {
  708. var s: Sprite = new Sprite();
  709. s.visible = false;
  710. _hover = s;
  711. }
  712. (_hover as Sprite).visible = false;
  713. (_hover as Sprite).graphics.clear();
  714. (_hover as Sprite).graphics.lineStyle(1, _hoverBorderColor, _hoverBorderAlpha);
  715. (_hover as Sprite).graphics.beginFill(_hoverFillColor, _hoverFillAlpha);
  716. switch (_hoverSizeMode) {
  717. case SIZE_MODE_SELECT:
  718. if (_select) {
  719. (_hover as Sprite).graphics.drawRect(_selectRect.x, _selectRect.y, _selectRect.width - 1, _selectRect.height - 1);
  720. break;
  721. }
  722. default:
  723. (_hover as Sprite).graphics.drawRect(-HOVER_INDENT, - HOVER_INDENT, _width + 2 * HOVER_INDENT - 1, _height + 2 * HOVER_INDENT - 1);
  724. }
  725. (_hover as Sprite).graphics.endFill();
  726. // if (!contains(_hover)) {
  727. // addChild(_hover);
  728. // }
  729. }
  730. _hover.visible = false;
  731. _view.removeDisplayObject(NAME_HOVER);
  732. //if (!_view.contains(NAME_HOVER)) {
  733. _view.addDisplayObject(_hover, NAME_HOVER, VISUAL_HOVER_Z_ORDER, _hoverLayout);
  734. //}
  735. }
  736. else {
  737. if (_hover) {
  738. _view.removeDisplayObject(NAME_HOVER);
  739. // removeChild(_hover);
  740. _hover = null;
  741. }
  742. }
  743. }
  744. protected function keyboardListener(event: KeyboardEvent): void {
  745. var goEvent: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_KEY_DOWN);
  746. goEvent.gameObject = this;
  747. goEvent.keyCode = event.keyCode;
  748. dispatchEvent(goEvent);
  749. }
  750. protected function mouseClickListener(event: MouseEvent): void {
  751. if (_selectable && _focusEnabled) {
  752. _scene.selectedGameObject = this;
  753. event.stopPropagation(); // отменяет дальнейшую обработку события - сцена не снимет выделение
  754. }
  755. var goEvent: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_MOUSE_CLICK);
  756. goEvent.gameObject = this;
  757. dispatchEvent(goEvent);
  758. }
  759. protected function mouseDoubleClickListener(event: MouseEvent): void {
  760. if (_selectable && _focusEnabled) {
  761. _scene.selectedGameObject = this;
  762. event.stopPropagation(); // отменяет дальнейшую обработку события - сцена не снимет выделение
  763. }
  764. var goEvent: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_MOUSE_DOUBLECLICK);
  765. goEvent.gameObject = this;
  766. dispatchEvent(goEvent);
  767. }
  768. protected function mouseOverListener(event: MouseEvent): void {
  769. if (_selectable && _hoverEnabled) {
  770. if (_viewHover) {
  771. _hover.visible = true;
  772. }
  773. var goEvent: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_SET_HOVER);
  774. goEvent.gameObject = this;
  775. dispatchEvent(goEvent);
  776. }
  777. }
  778. protected function mouseOutListener(event: MouseEvent): void {
  779. if (_selectable && _hoverEnabled) {
  780. if (_viewHover) {
  781. _hover.visible = false;
  782. }
  783. var goEvent: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_LOST_HOVER);
  784. goEvent.gameObject = this;
  785. dispatchEvent(goEvent);
  786. }
  787. }
  788. protected function mouseMoveListener(event: MouseEvent): void {
  789. var goEvent: GameObjectEvent = new GameObjectEvent(GameObjectEvent.TYPE_MOUSE_MOVE);
  790. goEvent.gameObject = this;
  791. goEvent.mouseX = event.localX;
  792. goEvent.mouseY = event.localY;
  793. dispatchEvent(goEvent);
  794. }
  795. }
  796. }