Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.05.2015, 21:18
Cheremicin вне форума Посмотреть профиль Отправить личное сообщение для Cheremicin Найти все сообщения от Cheremicin
  № 1  
Ответить с цитированием
Cheremicin

Регистрация: May 2015
Сообщений: 3
По умолчанию События мыши с несколькими объектами одновременно.

Создаю игру-головоломку, не могу понять, каким образом можно реализовать следующее:
Есть прямоугольное поле произвольных размеров, поделенное на клетки.
Пользователь должен нажав на начальную клетку провести указателем по клеткам, которые по его мнению приведут его к выходу на другом конце поля. При этом клетки, по которым двигается указатель - подсвечиваются и траектория остается подсвеченной. Как только пользователь отпускает кнопку мыши - происходит одно из двух действий: либо (в случае правильного выбора) - клетки остаются подсвеченными, либо (если он ошибся) возвращаются в первоначальное состояние.

Вопрос, как реализовать события мыши, если клик происходит на одном объекте, потом задействуются другие объекты и завершается на другом?

Благодарю за помощь!

Старый 29.05.2015, 21:44
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Все сильно упростится, если слушать нажатие мыши (MOUSE_DOWN) и движение (MOUSE_MOVE) не на клетках, а не поле целиком. Тогда все сразу становится проще:

FieldDemo.swf   (1.9 Кб)


Код AS3:
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;
}
Вложения
Тип файла: swf FieldDemo.swf (1.9 Кб, 94 просмотров)
Тип файла: zip FieldDemo.zip (5.4 Кб, 12 просмотров)
__________________
Поймай яблоко 2!


Последний раз редактировалось Zebestov; 30.05.2015 в 15:26.
Старый 29.05.2015, 22:49
Cheremicin вне форума Посмотреть профиль Отправить личное сообщение для Cheremicin Найти все сообщения от Cheremicin
  № 3  
Ответить с цитированием
Cheremicin

Регистрация: May 2015
Сообщений: 3
Zebestov, огромнейшее вам спасибо!
Оперативно помогли решить мою головную боль на выходные ))

Старый 29.05.2015, 23:25
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Ага. Там смотри я подправил в коде одну важную деталь. В методе checkPath() необходимо сбросить путь, присвоив массиву нулевую длину, например.
__________________
Поймай яблоко 2!

Старый 29.05.2015, 23:47
Cheremicin вне форума Посмотреть профиль Отправить личное сообщение для Cheremicin Найти все сообщения от Cheremicin
  № 5  
Ответить с цитированием
Cheremicin

Регистрация: May 2015
Сообщений: 3
Не совсем понял, для чего его обнулять?

Старый 29.05.2015, 23:50
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 6  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Потому что каждый новый путь будет добавляться к уже отработанному старому.
__________________
Поймай яблоко 2!

Старый 30.05.2015, 02:12
romanlysenko вне форума Посмотреть профиль Отправить личное сообщение для romanlysenko Найти все сообщения от romanlysenko
  № 7  
Ответить с цитированием
romanlysenko
 
Аватар для romanlysenko

Регистрация: May 2015
Сообщений: 19
Zebestov, круто, спасибо. Необходимости пока что ещё не было в данном примере, но все равно заберу себе тоже, пара идей на будущее есть по поводу где это можно использовать... )))
__________________
Писать код или не писать, вот то, что отличает профессионала от дилетанта. ©

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:03.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.