Форум 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=132002)

rockerror 02.11.2009 13:03

Нажатие кнопки и движение мувиков
 
Уважаемые Дамы и Господа флэшеры. Вновь наступил на похожие грабли...

Задача: есть 4 мувика (позже будет больше). На сцену влазит только 3 (так задумано). Нужно сделать 2 кнопки, чтобы перематывать мувики на сцене вправо и влево.

Как решал: создал 2 кнопки (далее описывать буду только левую, мотающую влево, ибо правая аналогична), которым присвоил код:

Код AS1/AS2:

var n:Number = _root.event1._x
on (release) {
        if(_root.event1._x > n-300) {
        _root.event1._x -=10;
        _root.event2._x -=10;
        _root.event3._x -=10;
        _root.event4._x -=10;
        }
}

n-300 ибо ширина мувика 300 и надо чтобы весь ряд мувиков сдвигался влево/вправо ровно на ширину 1 мувика. Однако признаков жизнеспособности при тестировании у кода не обнаружил... Где я накорсячил и как это попроавить?

Добавлено через 41 минуту
Вынес код за пределы кнопки и чутка подправил, теперь он выглядит вот так:

Код AS1/AS2:

var n:Number = _root.event1._x
this.but_left.onRelease = function () {
        if(_root.event1._x > n - 300) {
        _root.event1._x -=10;
        _root.event2._x -=10;
        _root.event3._x -=10;
        _root.event4._x -=10;
        }
}

Двигаться стало, НО!!! Задача предполагала плавное движение на ширину мувика с "шагом" 10... А пока происходит только перемещение на 10 и все... надо как-то зациклить процесс...

Добавлено через 44 минуты
Подозреваю, что я сравниваю координату саму с собой... как мне получить координату х мувика в начале движения, зафиксировать это значение сравнивать новые координаты именно с ней???...

Добавлено через 53 минуты
Хмм... Есть кто живой тут????

Добавлено через 56 минут
Переписал вот так:
Код AS1/AS2:

var n = _root.event1._x - 300;
this.but_left.onRelease = function() {
        if (_root.event1._x> n) {
                _root.event1._x -= 10;
                _root.event2._x -= 10;
                _root.event3._x -= 10;
                _root.event4._x -= 10;
        }
};

Добавлено через 56 минут
не помогло...

AzagThoth 02.11.2009 15:06

Если хочешь сделать плавно - тебе понадобится выделенная функция которая будет вызываться из событийного обработчика нажатия кнопки посредством setInterval после вызова блокируешь кнопку, по завершении определённого количества вызовов функции в вызываемой функции делаешь clearInterval и разблокируешь кнопку и всё будет как тебе надо) Надеюсь помог.

rockerror 02.11.2009 15:42

Спасибо Гипербореец))))))) Пока не попробовал, то, что ты предложил, но... Нельза ли немного конкретнее, ну всмысле с примером кода? ибо у меня туго с золотым корнем и я еще не очень втыкаю в магию ActionScript)))

Попробовал через цикл, но где-то опять накосячил...

Код AS1/AS2:

this.but_left.onRelease = function() {
        for (var n = _root.event1._x-300; _root.event1._x>n; _root.event1._x -= 10) {
                _root.event2._x -= 10;
                _root.event3._x -= 10;
                _root.event4._x -= 10;
        }
};


AzagThoth 02.11.2009 15:54

В твоём случае должно быть как-то так:
Код AS1/AS2:

var i:Number=0;
var timer:Number=null;
var Врубить:String=null;
 
function Подвинься():Void{
        _root.event2._x -= 10;
        _root.event3._x -= 10;
        _root.event4._x -= 10;
        if(i<30){
                i++;
        }
        else{
                i=0;
                clearInterval(time);
                eval(Врубить).enabled=true;
        }
        updateAfterEvent();
}
 
this.but_left.onRelease = function() {
        timer=setInterval(Подвинься,600);
        this.enabled=false;
        Врубить=''+this;
};


fessor 02.11.2009 16:02

код не тестировал, плавное движение возможно либо нарисовать либо зациклить кадры со скриптом, либо использовать setInterval() и плавнее всего получается рисованное...
Код AS1/AS2:

walk = function(a:Number){
        if(_root.event1._x > -300){
                _root.event1._x += a
                _root.event2._x += a;
                _root.event3._x += a;
                _root.event4._x += a;
        }else{
        clearInterval(tmp)
        }
}
this.but_left.onRelease = function() {
tmp = setInterval (walk,10000,-10);
};


rockerror 02.11.2009 16:05

Благодарю, пытаюсь вкурить...))

Добавлено через 3 минуты
стоп, второе это дополнение к первому или альтернатива?

Bitcoolman 02.11.2009 16:21

альтернатива

rockerror 02.11.2009 17:22

Протестил оба варианта. Оба рабочие, однако о плавности не идет и речи. КАждое смещение происходит примерно через секунду после предыдущего. С чем это связано? Можно ли обеспечить непрерывность движения?

Добавлено через 11 минут
С этим разобрался. работаю с первым вариантом, т.е. сейчас код выглядит вот так:
Код AS1/AS2:

var i:Number=0;
var timer:Number=null;
var vkl:String=null;
 
function dvig():Void{
        _root.event2._x -= 10;
        _root.event3._x -= 10;
        _root.event4._x -= 10;
        if(i<30){
                i++;
        }
        else{
                i=0;
                clearInterval(time);
                eval(vkl).enabled=true;
        }
        updateAfterEvent();
}
 
this.but_left.onRelease = function() {
        timer=setInterval(dvig,8);
        this.enabled=false;
        vkl=''+this;
};

Все круто, но есть один единственный косяк... сместившись на ширину одного мувика, процессия не останавливается, она продолжает двигаться дальше... Ширина 1 мувика - 300... не могу разобраться... Хелп ми плиз...

Добавлено через 27 минут
Хмхмхм... Еще немного переработал... как мне кажется в верном ключе... но проблему не решил....(((( Теперь все выглядит вот так:
Код AS1/AS2:

var i:Number = _root.event1._x;
var time:Number = null;
var vkl:String = null;
 
function dvig():Void {
        if (i>-300) {
                _root.event1._x -= 10;
                _root.event2._x -= 10;
                _root.event3._x -= 10;
                _root.event4._x -= 10;
        } else {
                clearInterval(time);
                eval(vkl).enabled = true;
        }
        updateAfterEvent();
}
this.but_left.onRelease = function() {
        timer = setInterval(dvig, 8);
        this.enabled = false;
        vkl = ''+this;
};

Добавлено через 29 минут
хм в коде вместо &gt знак >

Добавлено через 1 час 13 минут
Ура! Друзья мои, всем огромное спасибо)) Довел код до необходимого результата!!! НО... Теерь кнопка срабатывает только после 2-х нажатий... Не могу понять почему... СЕйчас код выглядит вот так:

Код AS1/AS2:

this.but_left.onPress = function() {
tmp = setInterval (walk,1,-10);
walk = function(){
        if(_root.event1._x < 50){
                _root.event1._x += 3;
                _root.event2._x += 3;
                _root.event3._x += 3;
                _root.event4._x += 3;
        }else{
                _root.event1._x -= 0;
                _root.event2._x -= 0;
                _root.event3._x -= 0;
                _root.event4._x -= 0;
        clearInterval(tmp)
        }
}
};

Добавлено через 1 час 16 минут
Хах))) Написал сообщение и понял))) Все ВСЕ ОК!!!))) ВСЕМ ОГРОМНОЕ СПАСИБО!!!

Рабочий код:

Код AS1/AS2:

walk1 = function(){;
if(_root.event1._x < 50){;
_root.event1._x += 3;
_root.event2._x += 3;
_root.event3._x += 3;
_root.event4._x += 3;
}else{;
_root.event1._x -= 0;
_root.event2._x -= 0;
_root.event3._x -= 0;
_root.event4._x -= 0;
clearInterval(tmp);
};
};
this.but_left.onPress = function() {
tmp = setInterval(walk1, 1, -10);
};
 
walk2 = function(){;
if(_root.event1._x > -250){;
_root.event1._x -= 3;
_root.event2._x -= 3;
_root.event3._x -= 3;
_root.event4._x -= 3;
}else{;
_root.event1._x -= 0;
_root.event2._x -= 0;
_root.event3._x -= 0;
_root.event4._x -= 0;
clearInterval(tmp);
};
};
 
this.but_right.onPress = function() {
tmp = setInterval(walk2, 1, -10);
};

P.S.
Данный код можно исполззовать для галереи)))

AzagThoth 02.11.2009 18:47

Код AS1/AS2:

this.but_left.onPress = function() {
tmp = setInterval (walk,1);
};
 
walk = function(){
        if(_root.event1._x < 50){
                _root.event1._x += 3;
                _root.event2._x += 3;
                _root.event3._x += 3;
                _root.event4._x += 3;
        }else{
                _root.event1._x -= 0;
                _root.event2._x -= 0;
                _root.event3._x -= 0;
                _root.event4._x -= 0;
        clearInterval(tmp)
        }
}

Может так попробовать?


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

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