PDA

Просмотр полной версии : Обращение к функции


Darki
14.06.2006, 15:41
Здравствуйте еще раз… скажу сразу, что в AS разбираться начинаю с нуля и методом тыка, приходится постоянно комментировать, поэтому коды могут показаться вам смешными, а вопросы непонятными, но попробую ?

Новый документ
Слой (Layer1): рисую кружок, диаметр примерно 38… конвертирую в Button, задаю instance name – butt. Помещаю в нижний правый угол…
Создаю четырехугольную звездочку… высота и ширина 38… конвертирую в MovieClip, instance name – kur. Выношу за пределы поля.
В библиотеке создаю MovieClip, имя – kv, идентификатор – id_kv, в нем по центру рисую прямоугольник 40*40… прямоугольник конвертирую в MovieClip, name – klet… выделяю klet – пишу код:

on (press) {//обрабатываем событие мувика нажатие мыши
koors = new Object(); //Создаем новый объект
koors.x = _x; //Задаем объекту переменную координат _х
koors.y = _y; //Задаем объекту переменную _у
localToGlobal(koors); // переводим координаты koors относительно мувика на координаты относительно главного поля
_root.kur._x = koors.x; // устанавливаю координату х звездочки
_root.kur._y = koors.y; // устанавливаю координату y звездочки
}

далее перехожу на scene 1, создаю новый слой называю Action, выделяю первый кадр, пишу код:

kur.swapDepths(16363); //Выставляю глубину курсора, чтобы курсор впоследствии находился НАД клетками а не ниже :)
//-------------------------------------------
butt.onPress = function() { // создаем функцию нажатия кнопки
for (bx=1; bx<3; bx++) { //создаем цикл (короче бх от 1 до 2 путем сложения)
for (by=1; by<3; by++) { //создаем цикл (короче бу от 1 до 2 путем сложения)
Field = attachMovie("id_kv", "kv"+bx+by, bx+by*2); //клонируем мувик kv и присваиваем ему имя "kv"+bx+by (плюс вроде устанавливаем глубину bx+by*2)
Field._x = (bx*40); // указываем координату х
Field._y = (by*40); // указываем координату у
}
}
};
//----------------------------------------


запускаем тест, жмем кнопку, получаем сгенерированное поле из 4 клеток… при нажатии на клетку, в клетку устанавливается курсор, она же наша звездочка

А теперь собственно вопросы:
1. хочу убрать весь код из мувика klet оставить в нем только вызов к функции, убранный код хочу вписать в виде функции в слой Action (просто очень не удобно скакать по мувикам когда код нужно изменить) – сам вопрос: как правильно сделать функцию в слое Action и обращение к ней из мувика klet?
2. Как сделать перемещение курсора kur? В смысле что бы курсор переезжал из начальной клетки в клетку по которой щелкнул мышкой…

Пока все… заранее благодарен

MINASTIS
14.06.2006, 17:39
1. function имя_функции (перменные_в_функции) {
всякие операторы\действия
}

Потом вызываешь функцию в любом действии например:

on (release) {
имя_функции(переменны);
}

Если ты не используешь в функции замены стандартных переменных то оставляй скобки пустыми после вызова функции.

2. СДелай в каком-нить мувике действие (не в кадре мува а на нем)
onClipEvent (enterFrame) {
if (kur._x < xnew) {
kur._x += 1;
}
if (kur._x > xnew) {
kur._x -= 1;
}
}

Так будет курсор в квадратик перемещаться. Ты конечно понял что новые "х" и "у" надо указывать из середины нажатой клеточки.

Darki
14.06.2006, 19:38
Большое спасибо, особенно за ответ на второй вопрос...
С первым вопросом все равно остается проблемма... код, который был в мувике klet и стал функцией, не работает... а как сделать не знаю

А и еще... Описанный код на второй вопрос можно ли затолкать в функцию?

Usnul
14.06.2006, 20:36
еще проще и правильнее:

запихни это все в первый кадр и убери все остальные скрипты - они ненужны. В аттаче исходник лежит с этим кодом, поможет тебе разобраться.

_root.d - Dimention, размер поля, сколько на сколько.
удаление обьекта не обязательно, так что строку delete myPoint можешь убить. Она служит только для того чтобы лишний мусор не оставался.

_root.d = 5;
kur.swapDepths(Math.pow(_root.d,2)+1);
butt.onPress = function() {
for (bx=0; bx<_root.d; bx++) {
for (by=0; by<_root.d; by++) {
Field = attachMovie("id_kv", "kv_"+bx+"_"+by, bx+by*_root.d+1);
Field._x = bx*40;
Field._y = by*40;
Field.onPress = function(){
var myPoint:Object = {x:0, y:0};
this.localToGlobal(myPoint);
_root.kur._x = myPoint.x;
_root.kur._y = myPoint.y;
delete myPoint;
}
}
}
}

ЗЫ
Butt = задница.
butt - the fleshy part of the human body that you sit on; "he deserves a good kick in the butt"; "are you going to sit on your fanny and do nothing?"

Darki
14.06.2006, 21:10
Гыыы... Спасибо Вам огромедное :)

Darki
14.06.2006, 21:17
про исходник, у мну MX 2004 Prof 7.0 не открывает его... "unexpeсted file format" :(

Usnul
14.06.2006, 22:36
у мемя Flash 8 чего и вам советую, в нем много нового, одни фильтры чего стоят.

MINASTIS
15.06.2006, 10:00
Ничего подобного! Если человек конечно именно для себя делает флешку тогда 8 - супер! А я вот делаю для людей а у некоторых эта апплет-система установки флеплейера 8 идет боком и не пашет! Тогда они с 7 или 6 сидят флешплейером! А я делаю на 6 макромедия. КОнечно мне приходиться попотеть чтобы без помошников (фильтры, помошник кода) делать флешки, зато оно того стоит. Я никого не осуждаю за вашу версию макромедия, просто оспариваю дурное мнение об "устаревшей" 6 макромедии.

Во нафлудил а. :) :D

Darki
15.06.2006, 10:20
Еще раз спасибо вам обоим, если вы не против, то попозже у мну есть желание закоментировать описанный выше код... щас просто буду эксперементировать с перемещением курсора

Darki
15.06.2006, 16:44
Здраствуйте, Usnul и Minastis возпользовался вашим кодом, слегка подправил и кой че добавил, затем закоментировал...


_root.d = 4; //задаем переменную равную 4
speed = 10; //Создаю переменную обозначающую скорость равную 10(именно десять только для того чтобы начальные и конечные координаты совпадали)
kur.swapDepths(Math.pow(_root.d, 2)+1); // устанавливаю глубину курсора (через округление, я так понял)
butt.onPress = function() { // объявляю событие при нажатии на кнопку Батт :)
for (bx=0; bx<_root.d; bx++) { //создаю цикл установки координат по х, конкретно бх от 0 до переменной _root.d (5) путем сложения
for (by=0; by<_root.d; by++) { //создаю цикл установки координат по у, конкретно бу от 0 до переменной _root.d (5) путем сложения
Field = attachMovie("id_kv", "kv_"+bx+"_"+by, bx+by*_root.d+1); // создаем клетку,
Field._x = 20+(bx*40);//устанавливаем клетку по координате х (20 нужно, что бы клетка не вылезала за край поля)
Field._y = 20+(by*40);//устанавливаем клетку по координате у (20 нужно, что бы клетка не вылезала за край поля)
Field.onPress = function() { //объявляю событие при нажатии на клетку
var myPoint:Object = {x:0, y:0}; //объявляю переменную муПоинт как объект с координатами х=0, у=0
this.localToGlobal(myPoint); //перевожу координаты в клетке на главные координаты
//_root.kur._x = myPoint.x; // устанавливаю координаты курсора по х
//_root.kur._y = myPoint.y; // устанавливаю координаты курсора по у
bx = myPoint.x;
by = myPoint.y;
//delete myPoint; //отключенно ибо неизученна :)
};
}
}
kur._x = 20; //устанавливаю курсор в первой клетке по х
kur._y = 20; ////устанавливаю курсор в первой клетке по х
};


за это вам респект и еще раз огромное спасибо, далее я стал эксперементировать с движением курсора... в первом кадре добавил:

_root.onEnterFrame = function() {
if (kur._x<bx) {
kur._x += speed;
}
if (kur._x>bx) {
kur._x -= speed;
}
if (_root.kur._y<by) {
_root.kur._y += speed;
}
if (_root.kur._y>by) {
_root.kur._y -= speed;
}
};

и все бы хорошо, и двигается, и встает в нужные координаты, но вот проблема: как только создаю клетки кнопкой, курсор становится по координатам 10,10 используя переменную speed, кстати из-за этой же переменной мне не поменять скорость, ибо выставив другие значения курсор отказывается вставать по центру квадратов. Вопрос: Что я сделал не так? или как это исправить?

Заранее Благодарен. :)

MINASTIS
15.06.2006, 18:11
А ты попробуй высчитать. Допустим когда расстояние "х" до центра квадрата (заданной координаты) меньше 6 тогда сделай speed 1 и станет курсор посредине. Также с "у" сделай. Будет плавнее. Надеюсь высчитать оставшееся расстояние ты сумеешь, это ж простая математика.

Usnul
16.06.2006, 01:08
Вопрос: Что я сделал не так? или как это исправить?

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

@MINASTIS
Наверное у меня проблемы с пониманием ибо вообще ничего не понял из сказанного в мой адрес.

MINASTIS
16.06.2006, 06:52
2 Usnul да ладно не обращай внимания. Ты насчет версии флеша? У меня иногда бывают высказывания, не принимай близко к сердцу.

Darki
16.06.2006, 10:08
Доброго утречка, :) Minastis, ваш вариант несколько не подходит, ибо скорость начальная должна быть равна конечной, но с другой стороны я ведь этого и не говорил... но все равно спасибо, ибо ваш текст натолкнул на интересную мыслишку...
Usnul, Хелпу читаю... правда на англицком :(
Если интересно что я делаю могу сказать, может сразу снимет много вопросов.
Я хочу сделать поле как в поле боя Героях 3... соответственно, чтобы объекты двигались строго по клеткам и с одинаковой скоростью...
Так что придется теперь мне изобретать велосипед... эээм... PathFinding т.е. :)
ПС Еще раз спасибо вам

MINASTIS
16.06.2006, 10:28
Ты не понял. Смотри. Конечно прикольно что скорость одинаковая, но и в тех же героях вспомни: там ходили быстро\медленно. А у тебя будет плавно! Когда допустим мувик игрока на клеточку переходит то скорость равна 3. А когда остается у него до середины клеточки по "Х" и\или по "У" меньше 6 тогда сделай скорость 1. Плавно тоже хорошо! А когда мувик дойдет до середины то сделай скорость начальную. Так сложно разве?
хотя это твой выбор. Я думаю он у тебя около середины клеточки крутится мувик, да? Потому что у тебя скорость более 1 и тогда условие срабатывает постоянно, ибо мувик находится не в середине. А изменение скорости на 1 на пару секунд изменит дело.

Darki
16.06.2006, 11:22
Почему мне нужна одинаковая скорость? Потому-что объект у мну анимационный (по 7 кадров в каждую сторону). Когда скорось одинакова, создается видимость реалистичной ходьбы объекта. А вот если скорость замедляется, то создается впечатление, что объект перебирает ногами быстрее, чем нужно :), а со скоростью =1 вообще без смеха смотреть нельзя... идет, чел идет... и в конце выдает пробуксовку :)
пока проблему одинаковой скорости решил по ньюбовски (ибо я и есть ньюб) скорость = 10
Вопрос был не верный, попробую изменить: как програмно узнать какой рядом мувик?
ПС... Кстати, и если что-нить более удобное чем Окно Action (для написания кода)? - так уже устал сворачивать разворачивать :(