|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: May 2015
Сообщений: 3
|
События мыши с несколькими объектами одновременно.
Создаю игру-головоломку, не могу понять, каким образом можно реализовать следующее:
Есть прямоугольное поле произвольных размеров, поделенное на клетки. Пользователь должен нажав на начальную клетку провести указателем по клеткам, которые по его мнению приведут его к выходу на другом конце поля. При этом клетки, по которым двигается указатель - подсвечиваются и траектория остается подсвеченной. Как только пользователь отпускает кнопку мыши - происходит одно из двух действий: либо (в случае правильного выбора) - клетки остаются подсвеченными, либо (если он ошибся) возвращаются в первоначальное состояние. Вопрос, как реализовать события мыши, если клик происходит на одном объекте, потом задействуются другие объекты и завершается на другом? Благодарю за помощь! |
|
|||||
Lorem ipsum
|
Все сильно упростится, если слушать нажатие мыши (MOUSE_DOWN) и движение (MOUSE_MOVE) не на клетках, а не поле целиком. Тогда все сразу становится проще:
import flash.display.Sprite; import flash.events.MouseEvent; const FIELD_SIZE:int = 10; const CELL_SIZE:int = 30; // Это наше поле. var field:Sprite = new Sprite(); // Это массив клеток, составляющих путь, и вспомогательная // переменная, чтобы высекать, когда мы перескочили на другую клетку. var path:Array = []; var lastCell:Sprite; // Это какой-то фон, чтобы ловить событие мыши на всей сцене // (бо если сцена пустая, то ой) var bgSprite:Sprite = new Sprite(); bgSprite.graphics.beginFill(0xffffff); bgSprite.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); addChild(bgSprite); // Заполняем поле клетками и добавляем его на сцену. createField(125, 50); addChild(field); // Подписываемся на событие нажатия мыши. field.addEventListener(MouseEvent.MOUSE_DOWN, onFieldMouseDown); /////////////////////////////////////////////////////////////// // ОБРАБОТКА СОБЫТИЙ МЫШИ /////////////////////////////////////////////////////////////// function onFieldMouseDown(event:MouseEvent):void { var cell:Sprite = event.target as Sprite; if (cell.name) { field.addEventListener(MouseEvent.MOUSE_MOVE, onFieldMouseMove); addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); makeCellSelected(cell); lastCell = cell; } } function onFieldMouseMove(event:MouseEvent):void { var cell = event.target as Sprite; if (cell != lastCell) { lastCell = cell; addCellToPath(cell); } } function onStageMouseUp(event:MouseEvent):void { field.removeEventListener(MouseEvent.MOUSE_MOVE, onFieldMouseMove); removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); lastCell = null; checkPath(); } /////////////////////////////////////////////////////////////// // ОБРАБОТКА ПУТИ /////////////////////////////////////////////////////////////// function checkPath():void { // Ну тут у тебя своя логика. // Мы же просто сбрасываем выделение пути. makeAllCellsDeselected(); path.length = 0; } /////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ РАБОТЫ С КЛЕТКАМИ ПУТИ /////////////////////////////////////////////////////////////// function addCellToPath(cell:Sprite):void { if (path.indexOf(cell) < 0) { path[path.length] = cell; } makeCellSelected(cell); } function makeCellSelected(cell:Sprite):void { cell.alpha = 0.5; } function makeAllCellsDeselected():void { var i:int = path.length; while (i--) { (path[i] as Sprite).alpha = 1.0; } } /////////////////////////////////////////////////////////////// // СОЗДАНИЕ ПОЛЯ И КЛЕТОК /////////////////////////////////////////////////////////////// function createField(x:Number, y:Number):void { for (var row:int = 0; row < FIELD_SIZE; row++) { for (var col:int = 0; col < FIELD_SIZE; col++) { var cell:Sprite = createCell((row * FIELD_SIZE + col).toString()); cell.x = x + col * CELL_SIZE; cell.y = y + row * CELL_SIZE; field.addChild(cell); } } } function createCell(name:String = ""):Sprite { var result:Sprite = new Sprite(); result.name = name; result.graphics.beginFill(0xffaa00); result.graphics.lineStyle(1, 0x000000); result.graphics.drawRect(0, 0, CELL_SIZE, CELL_SIZE); result.graphics.endFill(); return result; }
__________________
Поймай яблоко 2! Последний раз редактировалось Zebestov; 30.05.2015 в 15:26. |
|
|||||
Регистрация: May 2015
Сообщений: 3
|
Zebestov, огромнейшее вам спасибо!
Оперативно помогли решить мою головную боль на выходные )) |
|
|||||
Lorem ipsum
|
Ага. Там смотри я подправил в коде одну важную деталь. В методе checkPath() необходимо сбросить путь, присвоив массиву нулевую длину, например.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: May 2015
Сообщений: 3
|
Не совсем понял, для чего его обнулять?
|
|
|||||
Lorem ipsum
|
Потому что каждый новый путь будет добавляться к уже отработанному старому.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: May 2015
Сообщений: 19
|
Zebestov, круто, спасибо. Необходимости пока что ещё не было в данном примере, но все равно заберу себе тоже, пара идей на будущее есть по поводу где это можно использовать... )))
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. © |
Часовой пояс GMT +4, время: 09:43. |
|
« Предыдущая тема | Следующая тема » |
|
|