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

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

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

Регистрация: Sep 2008
Сообщений: 158
По умолчанию прилипание и перетаскивание

Приветствую всех!

Может кто подскажит как сделать чтобы:
1 при нажимании на объект он прилипал при повторном нажатии - отлипал
2 Отлипал в определённом месте, в неправильном месте возвращался на место
3 Чтобы при этом ещё появлялось сообщение (например): нажатие в правильном месте МОЛОДЕЦ в неправильном ЕШЁ РАЗ

Старый 09.10.2009, 16:37
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
В следующий раз, при формулировке вопроса не забудьте указать что к чему прилипать должно. То, что к курсору мыши прилипнуть - это еще догадываться нужно, что отбивает охоту читать вопрос дальше.
Решение состоит из комбинации методов startDrag, stopDrag, hitTest, обработчика события onEnterFrame и набора триггеров состояний с проверкой условий.

Код AS1/AS2:
var X0:Number = mc._x ; //исходные координаты
var Y0:Number = mc._y ;
var draged:Boolean = false ; //признак "прилипнутости" - нужен для обеспечения "отлипания" мувика по повторному нажатию
var standOnGoodPlace:Boolean = false ; //признак того, что прилипли к правильному месту - нужен для обеспечения "снятия" мувика с правильного места
 
mc.onPress= function() {
	if (!draged) { //прилипаем, если до этого еще не прилипли 
		 this.startDrag(); //прилип (читайте хелп о параметрах startDrag() для задания зоны перетаскивания)
		 this.onEnterFrame  = mc_onEnterFrame;
		 draged = true ;
	}
	else {
		this.stopDrag() //отлипли по повторному нажатию
		delete this.onEnterFrame ;
		draged = false ;
	}
};
 
function mc_onEnterFrame () {
	if (this.hitTest(PravilnoeMesto_mc)) { //если попали на хорошее место 
	  if (!standOnGoodPlace) {  //и при этом не на нем же все еще стоим с прошлого раза
			this.stopDrag()  //отлип в правильном месте
			delete this.onEnterFrame ;
			trace('Молодец!');
			draged = false ;
			standOnGoodPlace = true ; //включаем состояние прилипнутости к правильнотму месту
		}
	}
	else {
		standOnGoodPlace = false; //выключаем состояние прилипнутости к правильнотму месту
	}
 
	if (this.hitTest(NepravilnoeMesto_mc)) {
		this.stopDrag() //отлип в НЕправильном месте
		delete this.onEnterFrame ;
		mc._x = X0;
		mc._y = Y0;
		trace('НЕ молодец! Еще раз');
		draged = false ;
	}  
}
ХитТесты корректируйте сами (может mc должен на их середины попасть, если правильные и неправильные места большие).
Можно также сделать проверку hitTest с координатами конкретных точек, убрав мувики "мест".
Сообщения в динамические текстовые поля тоже легко вставить.
Вложения
Тип файла: rar lookingGoodPlace.rar (8.0 Кб, 142 просмотров)


Последний раз редактировалось mooncar; 09.10.2009 в 17:36.
Старый 09.10.2009, 17:25
veles2008 вне форума Посмотреть профиль Отправить личное сообщение для veles2008 Найти все сообщения от veles2008
  № 3  
Ответить с цитированием
veles2008
 
Аватар для veles2008

Регистрация: Sep 2008
Сообщений: 158
Чуть не так. Сообщение появляться должно на экране а не в отдельном окне. И при наведении на правильное место нужно нажать кнопку и тогда объект должен отлипнуть

Старый 09.10.2009, 17:39
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 4  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Цитата:
Сообщение от veles2008 Посмотреть сообщение
Чуть не так. Сообщение появляться должно на экране а не в отдельном окне. И при наведении на правильное место нужно нажать кнопку и тогда объект должен отлипнуть
1. Я же сказал - делаете динамические текстовые поля и присваиваете им нужные сообщения.
Код AS1/AS2:
tf.text = 'Молодец';
Приначале нового перетаскивания обнуляете строку:
Код AS1/AS2:
tf.text = '';
2. Ни про какие кнопки вы не говорили. Думаю, что принципы алгоритма понятны и их можно подкорректировать по своему желанию.
Поставьте условие на проверку hitTest в onPress при повторном нажатии.


Последний раз редактировалось mooncar; 09.10.2009 в 17:42.
Старый 09.10.2009, 18:24
veles2008 вне форума Посмотреть профиль Отправить личное сообщение для veles2008 Найти все сообщения от veles2008
  № 5  
Ответить с цитированием
veles2008
 
Аватар для veles2008

Регистрация: Sep 2008
Сообщений: 158
В том то и дело что не очень. Вот переделано (без сообщения)
Код AS1/AS2:
var X0:Number = mc._x ; //исходные координаты
var Y0:Number = mc._y ;
var draged:Boolean = false ; //признак "прилипнутости" - нужен для обеспечения "отлипания" мувика по повторному нажатию
var standOnGoodPlace:Boolean = false ; //признак того, что прилипли к правильному месту - нужен для обеспечения "снятия" мувика с правильного места
 
mc.onPress= function() {
	if (!draged) { //прилипаем, если до этого еще не прилипли 
		 this.startDrag(); //прилип (читайте хелп о параметрах startDrag() для задания зоны перетаскивания)
		 this.onEnterFrame  = mc_onEnterFrame;
		 draged = true ;
	}
 
		else 
		{
 
 
		this.stopDrag() //отлипли по повторному нажатию
		delete this.onEnterFrame ;
		draged = false ;
 
 
 
 
if(mc.hitTest(this["PravilnoeMesto_mc"])) {
mc._x = this["PravilnoeMesto_mc"]._x;
mc._y = this["PravilnoeMesto_mc"]._y;
draged = false ;
standOnGoodPlace = true ;
}
else if (not(mc.hitTest(this["PravilnoeMesto_mc"]))){
mc._x=X0;
mc._y=Y0;
}
}
}
Только к нужному месту при нажатии не прилипает почему то. Что делать?
А плохое место делать не нужно. Всё поле считается плохим кроме хорошего места.

Старый 09.10.2009, 18:43
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 6  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Проще говоря - вы не можете сделать так:
Берем объект, ташшым его и отпускаем. Если отпустили где нужно - он встал, если не попали - вернулся?

Добавлено через 6 минут
Вот тут:
Код AS1/AS2:
mc.hitTest(this["PravilnoeMesto_mc"])
this у вас указывает на mc.
То есть эта запись равноценна этой:
Код AS1/AS2:
mc.hitTest(mc["PravilnoeMesto_mc"])
поскольку это находится внутри функции mc.onPress

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

Регистрация: Sep 2008
Сообщений: 158
Как раз так могу.
Не могу так: нажал на объект он прилип. (Кнопку мыши отпустил, а объект остался прилипнутым). Потащил его на нужное место и нажал опять кнопку мышки. Он отлип. Если нажал кнопку мышки в другом месте (в любом кроме нужного) то объект отлип и стал на то место где я его взял в начале

Старый 09.10.2009, 18:56
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 8  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Тогда вот так:
Код AS1/AS2:
var X0:Number = mc._x ; //исходные координаты
var Y0:Number = mc._y ;
var draged:Boolean = false ; //признак "прилипнутости"
 
mc.onPress = function() {
	if (!draged) { //прилипаем, если еще не прилипли 
		 this.startDrag(); 
                 message_tf.text = ''; //сброс поля с сообщением
		 draged = true ;
	}
	else {    //отлип по второму нажатию
		this.stopDrag();
		draged = false ;				
		if (this.hitTest(PravilnoeMesto_mc)) { //this - это mc
                        message_tf.text = 'Молодец!';
		}
		else {
			this._x = X0;
			this._y = Y0;
			message_tf.text = 'Попробуй еще раз.';				
		}
	}
};
Добавлено через 7 минут
Даже так (объект плавно возвращается на место, частоту кадров поставить побольше, чтобы рывков не было):
Код AS1/AS2:
var X0:Number = mc._x ; //исходные координаты
var Y0:Number = mc._y ;
var draged:Boolean = false ; //признак "прилипнутости"
import mx.transitions.Tween;
 
message_tf.text = 'Тащщи его!';
 
mc.onPress = function() {
	if (!draged) { //прилипаем, если еще не прилипли 
		 this.startDrag(); 
                 message_tf.text = ''; //сброс поля с сообщением
		 draged = true ;
	}
	else {    //отлип по второму нажатияю
		this.stopDrag();
		draged = false ;				
		if (this.hitTest(PravilnoeMesto_mc)) { //this - это mc
			message_tf.text = 'Молодец!';
		}
		else {
			var myTween1:Tween = new Tween(this, '_x', mx.transitions.easing.Strong.easeOut, this._x, X0, 0.5, true);
			var myTween2:Tween = new Tween(this, '_y', mx.transitions.easing.Strong.easeOut, this._y, X0, 0.5, true);
			message_tf.text = 'Попробуй еще раз.';				
		}
	}
};
Вложения
Тип файла: rar lookingGoodPlace2.rar (10.9 Кб, 124 просмотров)


Последний раз редактировалось mooncar; 09.10.2009 в 19:48.
Старый 09.10.2009, 22:25
veles2008 вне форума Посмотреть профиль Отправить личное сообщение для veles2008 Найти все сообщения от veles2008
  № 9  
Ответить с цитированием
veles2008
 
Аватар для veles2008

Регистрация: Sep 2008
Сообщений: 158
Огромнейшее СПАСИБО!!!!!!!!

Я ещё пару вопросов если можно:
как тут сделать так что когда на объектом на правильное место попал, объект не можно было бы использовать тоесть перетаскивать?
И ещё например 2 объекта и две области. Перетаскиваются в любом порядке. Нужно слово "молодец" показать когда 2 объекта будут стоять на месте?

Старый 09.10.2009, 23:51
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 10  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Цитата:
Сообщение от veles2008 Посмотреть сообщение
как тут сделать так что когда на объектом на правильное место попал, объект не можно было бы использовать тоесть перетаскивать?
Отключить активность кнопки через delete this.onPress :
Код AS1/AS2:
mc.onPress = function() {
	if (!draged) {
		 this.startDrag(); 
                 message_tf.text = '';
		 draged = true ;
	}
	else { 
		this.stopDrag();
		draged = false ;				
		if (this.hitTest(PravilnoeMesto_mc)) {
			message_tf.text = 'Молодец!';
                        delete this.onPress ;//отключаем дальнейшее реагирование  мувика на нажатие
		}
		else {
			var myTween1:Tween = new Tween(this, '_x', mx.transitions.easing.Strong.easeOut, this._x, X0, 0.5, true);
			var myTween2:Tween = new Tween(this, '_y', mx.transitions.easing.Strong.easeOut, this._y, X0, 0.5, true);
			message_tf.text = 'Попробуй еще раз.';				
		}
	}
};
Добавлено через 7 минут
Цитата:
Сообщение от veles2008 Посмотреть сообщение
Нужно слово "молодец" показать когда 2 объекта будут стоять на месте?
Это очевидно.
Вводим еще триггер. Пишем функции для каждого набора "правилное место - объект".
И где условие попадания (ну, где сейчас 'Молодец' показывается), нужно сделать еще одну проверку:

Код AS1/AS2:
//1 кусок
......
if (this.hitTest(PravilnoeMesto1_mc)) {
    hit1 = 1;
    if (hit1 + hit2 == 2) { //проверяем, оба ли объекта теперь на своих метсах
       	message_tf.text = 'Молодец!';
    }
    delete this.onPress ;//отключаем дальнейшее реагирование  мувика на нажатие
}
......
//2 кусок
if (this.hitTest(PravilnoeMesto2_mc)) {
    hit2 = 1;
    if (hit1 + hit2 == 2) { //проверяем, оба ли объекта теперь на своих метсах
       	message_tf.text = 'Молодец!';
    }
    delete this.onPress ;//отключаем дальнейшее реагирование  мувика на нажатие
}


Последний раз редактировалось mooncar; 10.10.2009 в 00:00.
Создать новую тему Ответ Часовой пояс GMT +4, время: 19:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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