![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2010
Сообщений: 49
|
Доброго времени суток дорогие форумчане.Дело в том ,что AS 2 я не знаю,сразу учил с AS3.По одному примеру в интернете я решил попробовать сделать игру,но пример написан на AS2.В принципе все переделал как с мог.Но возникла такая проблема.До этого я использовал hitTestObject одного мувика с другим,например :
В принципе и тут я переделал,но это очень километрово писать код для каждого блока.А в примере автор использует массив с которого передает данные как я понял.Вобщем я с таким пока не сталкивался прошу помощи.Теперь по порядку.У нас есть герой (hero),он прыгает бегает и так далее, с этим ясно.Далее мы содаем блоки для него.Автор примера создает прямоугольник,все блоки в нем, а в кадре прямоугольника пишет _parent.addBox(this);.Далее такой код AS2: //половина ширины персонажа var hhx = (hero.p1._x - hero.p3._x + hero.p1._width / 2 + hero.p3._width / 2) / 2; //половина высоты персонажа var hhy = (hero.p2._y - hero.p4._y + hero.p2._height / 2 + hero.p4._height / 2) / 2; //массив с платформами var boxes = []; //каждая платформа при старте вызывает эту функцию и передаёт себя как параметр addBox = function (obj) { boxes.push(obj); } checkHitPlatform = function(){ //перебираем все платформы и проверяем пересечение с персонажем с учётом того, //в какую сторону он смотрит var i = boxes.length; while (i--) { var curB = boxes[i]; if (curB.hitTest(hero.p1)) { //контакт справа if (hero._xscale > 0) { hero._x = curB._x - curB._width / 2 - hhx; } else { hero._x = curB._x + curB._width / 2 + hhx; } } else if (curB.hitTest(hero.p2)) { //контакт снизу jump = false; speedY = 0; hero._y = curB._y - curB._height / 2 - hhy; } else if (curB.hitTest(hero.p3)) { //контакт слева if (hero._xscale > 0) { hero._x = curB._x + curB._width / 2 + hhx; } else { hero._x = curB._x - curB._width / 2 - hhx; } } else if (curB.hitTest(hero.p4)) { //контакт сверху speedY = 0; // как вариант: speedY *= -1; hero._y = curB._y + curB._height / 2 + hhy; } } } |
|
|||||
|
strange mood
|
Если нужно проверить только пересечение, то вполне хватит такой функции:
function checkHitPlatform(){ for(var i:int = 0; i < boxes.length; i++){ if(hero.hitTestObject(boxes[i])){ //ляляля } } } Мои телепатические скилы пока не позволяют точно установить, с чем именно вы не сталкивались и какой момент вам непонятен. Если вы уточните вопрос, я постараюсь дать необходимый вам ответ.
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 49
|
GAIKER, спасибо за ответ.Да мне нужно не только пересечение,а именно так как вы сказали 4 мувика-зоны и пересечение с каждой,но там я дальше допишу это понятно.Попробую обьяснить,что именно мне непонятно.Строка в мувике с платформами
и вот эта функция Обычно я обращаюсь к мувику либо по Instance,либо addChild.А вот как он тут не понял.Можно тут чуть подробнее.Допустим я сделал мувик, внего насавил платформ как в данном случае дальше...Спасибо. |
|
|||||
|
strange mood
|
Пойду от печки, т.е. от this.
This - это указатель на мувик, внутри которого исполняется код. Когда в коде идет работа со свойством или вызывается функция, то неявно подразумевается, что мы работаем с мувиком, внутри которого этот код написан, и поэтому this можно не писать. Т.е. мы можем написать и мувик встанет на соответствующую координату. А можем написать и эффект будет точно такой же. Но приколы начинаются в тот момент, когда мы решаем поработать с другим мувиком. Представим, что у нас есть мувик mcParent, внутри него лежит мувик mcChild, и мы пишем код в первом кадре mcParent. Нам нужно также сдвинуть mcChild на x=100. Пишем: Теперь немного усложним задачу: в mcParent лежат мувики mcFoo, mcBar, mcZod, mcKux и mcLol. Код вырастет до такого: Код, написанный копипастом, вызывает воспоминания о массивах и циклах: var mcs:Array = []; mcs.push(mcFoo); mcs.push(mcBar); mcs.push(mcZod); mcs.push(mcKux); mcs.push(mcLol); for(var i:int = 0; i < mcs.length; i++){ var mc:MovieClip = mcs[i]; mc.x = 100; }//for this.mcsToMove = []; function addMc(mc:MovieClip){ this.mcsToMove.push(mc); }//addMc function moveMcs(){ for(var i:int = 0; i < mcsToMove.length; i++){ var mc:MovieClip = mcsToMove[i]; mc.x = 100; }//for }//moveMcs Эта строчка отрабатывает во всех мувиках, которые нужно сдвинуть. Каждый такой мувик обращается к mcParent и передает ему ссылку на себя самого. И каждый раз mcParent получает ссылку на мувик и заносит ее в свой массив mcsToMove. В итоге в этом массиве будут содержаться ссылки на все мувики, которые нужно сдвинуть. Теперь по этому массиву можно пройтись циклом, собственно сдвигая мувики - это произойдет при вызове moveMcs(). Ну и в качестве финального штриха меняем понятие "сдвинуть на x=100" на "проверить на столкновение с героем", и получаем искомое.
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 49
|
GAIKER, Спасибо за исчерпывающий ответ.Ну что такое this и parent это я знал.Не знал как работает команда push и всегда боялся как это правельно сказать подключаться из мувика глубже к функции другого мувика типа этого
(П.С правда тут у меня так сработало ),т.е писал отдельную функцию для каждого мувика.Но у меня стаж еще и года нету не все сразу.Спасибо тебе большое.С уважением Андрей. |
|
|||||
|
strange mood
|
push заносит элемент в конец массива http://help.adobe.com/en_US/FlashPla...ay.html#push()
MovieClip(parent) - это приведение parent к типу MovieClip, не путать с new MovieClip(parent); Запись type(value) приводит value к типу type, либо выкидывает исключение, если приведение невозможно. Еще есть вариант value as type, такая конструкция тоже приводит тип, но если приведение невозможно, то она не выкидывает исключение, а просто возвращает null. ЗЫ: Кнопочка "спасибо" находится над сообщением и выглядит как весы ![]()
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 49
|
GAIKER,Нажмал на весы + добавил отзыв
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:37. |
|
|
« Предыдущая тема | Следующая тема » |
|
|