Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   прилипание и перетаскивание (http://www.flasher.ru/forum/showthread.php?t=130961)

veles2008 09.10.2009 16:12

прилипание и перетаскивание
 
Приветствую всех!

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

mooncar 09.10.2009 16:37

Вложений: 1
В следующий раз, при формулировке вопроса не забудьте указать что к чему прилипать должно. То, что к курсору мыши прилипнуть - это еще догадываться нужно, что отбивает охоту читать вопрос дальше.
Решение состоит из комбинации методов 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 с координатами конкретных точек, убрав мувики "мест".
Сообщения в динамические текстовые поля тоже легко вставить.

veles2008 09.10.2009 17:25

Чуть не так. Сообщение появляться должно на экране а не в отдельном окне. И при наведении на правильное место нужно нажать кнопку и тогда объект должен отлипнуть

mooncar 09.10.2009 17:39

Цитата:

Сообщение от veles2008 (Сообщение 856604)
Чуть не так. Сообщение появляться должно на экране а не в отдельном окне. И при наведении на правильное место нужно нажать кнопку и тогда объект должен отлипнуть

1. Я же сказал - делаете динамические текстовые поля и присваиваете им нужные сообщения.
Код AS1/AS2:

tf.text = 'Молодец';

Приначале нового перетаскивания обнуляете строку:
Код AS1/AS2:

tf.text = '';

2. Ни про какие кнопки вы не говорили. Думаю, что принципы алгоритма понятны и их можно подкорректировать по своему желанию.
Поставьте условие на проверку hitTest в onPress при повторном нажатии.

veles2008 09.10.2009 18:24

В том то и дело что не очень. Вот переделано (без сообщения)
Код 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;
}
}
}

Только к нужному месту при нажатии не прилипает почему то. Что делать?
А плохое место делать не нужно. Всё поле считается плохим кроме хорошего места.

mooncar 09.10.2009 18:43

Проще говоря - вы не можете сделать так:
Берем объект, ташшым его и отпускаем. Если отпустили где нужно - он встал, если не попали - вернулся?

Добавлено через 6 минут
Вот тут:
Код AS1/AS2:

mc.hitTest(this["PravilnoeMesto_mc"])

this у вас указывает на mc.
То есть эта запись равноценна этой:
Код AS1/AS2:

mc.hitTest(mc["PravilnoeMesto_mc"])

поскольку это находится внутри функции mc.onPress

veles2008 09.10.2009 18:50

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

mooncar 09.10.2009 18:56

Вложений: 1
Тогда вот так:
Код 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 = 'Попробуй еще раз.';                               
                }
        }
};


veles2008 09.10.2009 22:25

Огромнейшее СПАСИБО!!!!!!!!

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

mooncar 09.10.2009 23:51

Цитата:

Сообщение от veles2008 (Сообщение 856677)
как тут сделать так что когда на объектом на правильное место попал, объект не можно было бы использовать тоесть перетаскивать?

Отключить активность кнопки через 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 (Сообщение 856677)
Нужно слово "молодец" показать когда 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 ;//отключаем дальнейшее реагирование  мувика на нажатие
}



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

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