Вход

Просмотр полной версии : Нажатие кнопки и движение мувиков


rockerror
02.11.2009, 13:03
Уважаемые Дамы и Господа флэшеры. Вновь наступил на похожие грабли...

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

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


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 минуту
Вынес код за пределы кнопки и чутка подправил, теперь он выглядит вот так:


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 минут
Переписал вот так:

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)))

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


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
В твоём случае должно быть как-то так:
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() и плавнее всего получается рисованное...

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 минут
С этим разобрался. работаю с первым вариантом, т.е. сейчас код выглядит вот так:

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 минут
Хмхмхм... Еще немного переработал... как мне кажется в верном ключе... но проблему не решил....(((( Теперь все выглядит вот так:

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-х нажатий... Не могу понять почему... СЕйчас код выглядит вот так:


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 минут
Хах))) Написал сообщение и понял))) Все ВСЕ ОК!!!))) ВСЕМ ОГРОМНОЕ СПАСИБО!!!

Рабочий код:


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
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)
}
}

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