![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2008
Сообщений: 158
|
Приветствую всех!
Может кто подскажит как сделать чтобы: 1 при нажимании на объект он прилипал при повторном нажатии - отлипал 2 Отлипал в определённом месте, в неправильном месте возвращался на место 3 Чтобы при этом ещё появлялось сообщение (например): нажатие в правильном месте МОЛОДЕЦ в неправильном ЕШЁ РАЗ |
|
|||||
|
Модрон-ветеринар
|
В следующий раз, при формулировке вопроса не забудьте указать что к чему прилипать должно. То, что к курсору мыши прилипнуть - это еще догадываться нужно, что отбивает охоту читать вопрос дальше.
Решение состоит из комбинации методов startDrag, stopDrag, hitTest, обработчика события onEnterFrame и набора триггеров состояний с проверкой условий. 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 ; } } Можно также сделать проверку hitTest с координатами конкретных точек, убрав мувики "мест". Сообщения в динамические текстовые поля тоже легко вставить. Последний раз редактировалось mooncar; 09.10.2009 в 17:36. |
|
|||||
|
Регистрация: Sep 2008
Сообщений: 158
|
Чуть не так. Сообщение появляться должно на экране а не в отдельном окне. И при наведении на правильное место нужно нажать кнопку и тогда объект должен отлипнуть
|
|
|||||
|
Модрон-ветеринар
|
Цитата:
Приначале нового перетаскивания обнуляете строку: 2. Ни про какие кнопки вы не говорили. Думаю, что принципы алгоритма понятны и их можно подкорректировать по своему желанию. Поставьте условие на проверку hitTest в onPress при повторном нажатии. Последний раз редактировалось mooncar; 09.10.2009 в 17:42. |
|
|||||
|
Регистрация: Sep 2008
Сообщений: 158
|
В том то и дело что не очень. Вот переделано (без сообщения)
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; } } } А плохое место делать не нужно. Всё поле считается плохим кроме хорошего места. |
|
|||||
|
Модрон-ветеринар
|
Проще говоря - вы не можете сделать так:
Берем объект, ташшым его и отпускаем. Если отпустили где нужно - он встал, если не попали - вернулся? Добавлено через 6 минут Вот тут: this у вас указывает на mc. То есть эта запись равноценна этой: поскольку это находится внутри функции mc.onPress |
|
|||||
|
Регистрация: Sep 2008
Сообщений: 158
|
Как раз так могу.
Не могу так: нажал на объект он прилип. (Кнопку мыши отпустил, а объект остался прилипнутым). Потащил его на нужное место и нажал опять кнопку мышки. Он отлип. Если нажал кнопку мышки в другом месте (в любом кроме нужного) то объект отлип и стал на то место где я его взял в начале |
|
|||||
|
Модрон-ветеринар
|
Тогда вот так:
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 = 'Попробуй еще раз.'; } } }; Даже так (объект плавно возвращается на место, частоту кадров поставить побольше, чтобы рывков не было): 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 = 'Попробуй еще раз.'; } } }; Последний раз редактировалось mooncar; 09.10.2009 в 19:48. |
|
|||||
|
Регистрация: Sep 2008
Сообщений: 158
|
Огромнейшее СПАСИБО!!!!!!!!
Я ещё пару вопросов если можно: как тут сделать так что когда на объектом на правильное место попал, объект не можно было бы использовать тоесть перетаскивать? И ещё например 2 объекта и две области. Перетаскиваются в любом порядке. Нужно слово "молодец" показать когда 2 объекта будут стоять на месте? |
|
|||||
|
Модрон-ветеринар
|
Цитата:
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 = 'Попробуй еще раз.'; } } }; Цитата:
Вводим еще триггер. Пишем функции для каждого набора "правилное место - объект". И где условие попадания (ну, где сейчас 'Молодец' показывается), нужно сделать еще одну проверку: //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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|