Crimsonland 3: Выживание на практике
19.03.2009, автор Stormit, рубрики: ActionScript, Flash игры, Игровые баннерыМне уже порядком поднадоела эта тема, но люди просят рассказать каким образом создаются монстры, летят пули и как определяется попадание. Надеюсь это многим поможет, тем более что поняв эти простые истины, можно создать много разных flash игр.
На самом деле о некоторых вещах я уже писал раньше. Например, монстры будут появляться таким же способом, как препятствия в баннере с мячиком (помните?). Для простоты изложения мы будем использовать процедурный способ программирования с разделением кода на слои :). Потом так будет удобнее ориентироваться в коде (это первый шаг к классам и ООП).
Итак, из предыдущих постов у нас есть главный герой, готовый ринуться на толпы врагов. Я заменил базуку на пулемёт и немного повысил его манёвренность (скорость ходьбы и поворота). Слайд 1.
Подробно о том, как теперь устроен клип body клипа hero показано на слайте 2. При щелчке мышью, начинает проигрываться анимация стрельбы и во втором кадре вызывается функция placeBullet(), которая добавляет пулю на сцену. Это единственное место в этом примере, где вызов функции идёт из клипа, а не с главной линейки. Обратите внимание, что появился вспомогательный клип dot - он нужен чтобы пересчитать по нему правильные координаты пули в момент вылета из ствола. Это идеальный способ, когда дуло не находится точно на осях X и Y. Внутри всех вспомогательных клипов я пишу _visible = false. Так они не заметны для глаза, но доступны для кода.
Дальше создаём клип для противника с именем spider и прочую атрибутику: пулю (bullet) и спецэффект для поражения (boom). Клип spider состоит из 2-х кадров (состояний). В первом клип с анимацией ходьбы (здесь же и клип hit, который нужен для проверки попадания), а во втором - клип а анимацией погибания (когда анимация доигрывается, в последнем кадре вызывается _parent.removeMovieClip() которая удаляет противника (в данном случае _parent - это клип spider). Клип пули bullet - просто рисунок снаряда (при _rotation = 0 смотрит вправо). Клип boom - имитация кровавого всплеска. Все эти клипы присутствуют на линейке, но лежат далеко за пределами сцены чтобы случайно не попали в кадр (или выполнить для них _visible = false). Потом с каждого будет создаваться дубликат и использоваться по необходимости.
Создаём прямоугольный клип ground который площадью должен покрыть всю сцену. Противники будут появляться, учитывая его границы, а пули будут удаляться (в смысле delete), когда вылетят за его пределы. Слайд 3.
Следующее что мы сделаем - создадим выше 4 слоя для скрипта. На самом верхнем, первом слое, будет выполняться главный цикл (onEnterframe), который будет перемещать героя и добавлять противников. На втором - всё что касается движения главного героя. На третьем и четвёртом всё для пуль (выстрелов) и монстров соответственно (слайд 4).
Дальше привожу код по слоям сверху вниз:
-
Основной цикл.
Каждый 50-й кадр идёт вызов функции placeSpider(), которая добавляет на сцену противника (она описана дальше)
//переменная таймера для добавления противников на сцену var spiderCount = 0; //хранит уровень куда добавляются объекты var lev = 0; onEnterFrame = function(){ //функция действия главного героя actionHero(); if(spiderCount++ > 50) { spiderCount = 0; //добавляем паучка placeSpider(); } }
-
Главный герой.
Так как у нас теперь в руках пулемёт, персонаж стреляет пока мы держим зажатой клавишу мышки. Функция actionHero() вызывается каждый кадр в основном цикле. Этот код подробно рассмотрен в предыдущих 2-х постах (часть1, часть2).
var step = 3; var rotDirSpeed = 6; var rotToMouseSpeed = 7; function actionHero () { if (Key.isDown(Key.LEFT)) { hero._rotation -= rotDirSpeed; } else if (Key.isDown(Key.RIGHT)) { hero._rotation += rotDirSpeed; } var mDx = _xmouse - hero._x; var mDy = _ymouse - hero._y; //угол поворота между клипом hero и мышкой в градусах var mAngleD = Math.atan2(mDy, mDx) / Math.PI * 180; //угол поворота между башней и мышкой в градусах var dAngleD = hero._rotation + hero.body._rotation - mAngleD; //без этой проверки башня будет неправильно крутиться //при переходе границы -180 и +180 градусов if (dAngleD > 180) { dAngleD = -360 + dAngleD; } else if (dAngleD < -180) { dAngleD = 360 + dAngleD; } //поворачиваем башню с нашей скоростью if(Math.abs(dAngleD) < rotToMouseSpeed) { hero.body._rotation -= dAngleD; } else if(dAngleD > 0) { hero.body._rotation -= rotToMouseSpeed; } else { hero.body._rotation += rotToMouseSpeed; } //проверка на реализм поворота корпуса человека if(hero.body._rotation < -90) { hero.body._rotation = -90; } else if(hero.body._rotation > 90) { hero.body._rotation = 90; } var dirAngle = hero._rotation / 180 * Math.PI; if (Key.isDown(Key.UP)) { hero.foot.play(); hero._x += step * Math.cos(dirAngle); hero._y += step * Math.sin(dirAngle); } else if (Key.isDown(Key.DOWN)) { hero.foot.play(); hero._x -= step * Math.cos(dirAngle); hero._y -= step * Math.sin(dirAngle); } else { hero.foot.stop(); } //стреляем если зажата клавиша мышки if(Key.isDown(1)){ hero.body.play(); } }; //скрываем эталонный клип, все дубликаты при этом будут видимы blood._visible = false; //дублирует спецэффект и располагает поверх героя placeBlood = function() { lev++; var d = blood.duplicateMovieClip("b" + lev, lev + 20000); d._x = hero._x; d._y = hero._y; }
-
Пули.
Задаётся скорость полёта, функция которая добавляет пулю на сцену и задаёт сценарий действий. Проверка на попадание осыществляется старым проверенным способом - через функцию hitTest(). Перебираем всех пауков что есть на сцене и проверяем пересечение. Это выполняется для каждой летящей пули каждый кадр. Лучше не проверять главные клипы противников на пересечение, а создать внутри них вспомогательные клипы с заданной формой, которые будут не видны (скрыты _visible = false), но при этом будут учавствовать в расчётах (так можно сделать попадание только в тело, без учёта ног).
//скорость полёта пули bulletSpeed = 18; //функция добавляет пулю на сцену, перемещает к дулу пулемёта, //поворачивает по направлению выстрела и прописывает для неё алгоритм движения placeBullet = function (tgt) { lev++; //пересчитываем координаты конца дула в координаты текущего клипа var p = {x:tgt._x, y:tgt._y}; tgt._parent.localToGlobal(p); globalToLocal(p); //создаём дубликат клипа с пулей, позиционируем и поворачиваем var d = bullet.duplicateMovieClip("b" + lev, lev); d._x = p.x; d._y = p.y; d._rotation = hero._rotation + hero.body._rotation; d.a = d._rotation / 180 * Math.PI; //алгоритм действий пули d.onEnterFrame = function() { //смещение this._x += bulletSpeed * Math.cos(this.a); this._y += bulletSpeed * Math.sin(this.a); //проверка на выход за границы сцены if (this._x < ground._x - this._width || this._x > ground._x + ground._width + this._width || this._y < ground._y - this._height || this._y > ground._y + ground._height + this._height) { this.removeMovieClip(); } //проверка попадания в противников //ВНИМАНИЕ: в коде проверяется пересечение клипа текущей пули с ВНУТРЕННИМ клипом hit текущего противника var i = spiders.length; while (i--) { var curS = spiders[i]; if (curS.hit.hitTest(this)) { this.removeMovieClip(); curS.gotoAndStop(2); removeSpider(curS); } } }; };
-
Враги.
В коде создаётся массив spiders, который всегда содержит список противников, гуляющих по сцене. Каждый новосозданный противник добавляет себя в него и также удаляется из него после смерти. С этим массивом плотно работают все летящие пули, проверяя себя на попадание в каждого из монстров.
//массив хранит список всех противников которые бегают по сцене в данный момент var spiders = new Array(); //добавляет паука на сцены и задаёт для него поведение function placeSpider() { lev++; var d = spider.duplicateMovieClip("z" + lev, lev); //случайным образом выбираем с какой стороны экрана ему появиться if (Math.random() < .5) { d._x = ground._x + Math.random() * ground._width; if (Math.random() < .5) { d._y = ground._y - d._height / 2; } else { d._y = ground._y + ground._height + d._height / 2; } } else { d._y = ground._y + Math.random() * ground._height; if (Math.random() < .5) { d._x = ground._x - d._width / 2; } else { d._x = ground._x + ground._width + d._width / 2; } } //первоначальный поворот на цель и определение скорости var dx = hero._x - d._x; var dy = hero._y - d._y; d.a = Math.atan2(dy, dx); d._rotation = d.a / Math.PI * 180; d.speed = Math.random() * 2 + 2; //поведение противника d.onEnterFrame = function() { //смещается туда куда смотрит this._x += this.speed * Math.cos(this.a); this._y += this.speed * Math.sin(this.a); //постоянно корректирует своё направление движения на главного героя var dx = hero._x - this._x; var dy = hero._y - this._y; this.a = Math.atan2(dy, dx); this._rotation = this.a / Math.PI * 180; //проверка на достижение цели var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 25 && !placed) { //запустить спецэффект placeBlood(); //запустить клип с сообщением о проигрыше //в этом примере не описан, но можете иметь ввиду _parent.black.play(); delete this.onEnterFrame; } }; //добавляем новосозданного паука в список spiders.push(d); } //функция удаления паука из списка противников //вызывается при попадании пули function removeSpider(s) { var i = spiders.length; while(i--) { var curS = spiders[i]; if(curS == s) { //удаляём поведение, т.к. мёртвые уже ничего не решают delete curS.onEnterFrame; spiders.splice(i, 1); } } }
Если вам не хочется возится со слоями, можете вставить весь этот код в один кадр друг за другом.
Ctrl + Enter и смотрим результат (слайд 5). Всё должно появляться и бегать как нужно, но чего-то не хватает. Добавим хорошую фоновую графику и пытаемся почувствовать разницу (слайд 6). Имеем вполне рабочую версию игры. Пусть идея не нова, но вполне подойдёт для старта, - а там куда фантазия заведёт.
Попробую сразу же обработать возможные ошибки и вопросы:
- Если у вас не вылетают пули, то скорее всего вы забыли прописать во втором кадре клипа body код _parent._parent.placeBullet(dot) или в клипе body отсутствует клип dot (или просто не назван). В любом случае сверьтесь со слайдом 2.
- Если не появляются монстры, проверьте что есть клип ground (с нулевыми координатами в левом верхнем углу).
- Если не срабатывает попадание пули, проверьте что внутри клипа spider есть клип hit по которому определяется пересечение функцией hitTest().
- Противник умирает, но не изчезает со сцены, а анимация погибания проигрывается циклически - в последнем кадре не вызывается _parent.removeMovieClip()
- Если не знаете как сделать сброс игры, есть два пути: 1) удалить всех монстров, что есть на сцене (массив spiders) и вернуть главного героя в начальное положение. По хорошему нужно и пули удалить, но этим можно пренебречь, они быстро улетят за пределы экрана и удалятся сами. 2) Сделать сброс через пустой кадр как описано в этой статье (12-13 слайд).
- Исходник потерялся.
Интересно на 78%




Хитрый, не теряйте хватку. Эта статья без хитростей, а просто для ленивых начинающих гейммейкеров. Да и по стилю написания, вам она самому не нравится.
Прекрасный сайт и отличный урок в дополнение к предыдущим. Становятся понятны многие нюансы. Спасибо за ресурс.
У меня к вам такой вопросик: Экземпляры клипов пули и пауков создаются var d = spider.duplicateMovieClip(”z” + lev, lev); затем вы работаете с переменной “d” как с клипом? А имена “z” нигде не используются? И вот еще: переменная “d” создается и для пули и для пауков. Они не перекрываются? (в смысле области видимости)? Немного сумбурно спросил, но надеюсь на понимание…
Переменная “d” объявляется как локальная для функции, она живёт только пока функция выполняется. Так что перекрытия никакого не происходит.
Буква “z” осталась от предыдущего примера с зомби. Реальные имена дубликатов не используются, работаем через ссылку на клип (переменная “d”) либо массив spiders. Получается что “d” временное имя текущего клипа.
спасибо) пригодится! вообще все Ваши темы очень интересные
Спасибо огромное за этот отличный блог. Искал то, что надо! Теперь всё ясно почему у меня не было взаимодействия с монстрами. Забавно то, то я долго ломал голову как же это реализовать, а из-за маленькой ошибочки всё не работало. Теперь картина ясна.
P.S. Теперь я пересмотрел своё мнение насчет программирования в мувиках, так как в кадре писать полегче будет, нежели в клипах.
Ещё раз спасибо
Почему то я писал в коде так, если следовать вашему примеру,
код пишется в посторонем мувике:
// тут взаимодействуют пули с монстрами.
_root.bullet.duplicateMovieClip(”b” + lev, lev);
_root.spider.duplicateMovieClip(”z” + lev, lev);
if(_root[”b”+lev].hitTest(_root[”z”+lev]);
//дальнейший код
}
Что-то вроде того писал. Почему код не работает? Видь синтаксис вроде правильный.
В чём вся соль ? Ответьте пожалуйста, буду очень благодарен.
Забыл добавить, что я это писал давно, когда у меня взаимодействие пуль и монстров не получалось =)
Я могу отвечать только за свой код
Во первых из примера выше не понятно что именно не работает, а во вторых - это вам стоит определить что и почему не получалось раньше. Возможно, потому что пуля создаётся один раз, а проверка на попадание должна выполняться каждый кадр.
А какие ещё способы есть для определения пересечения мувиклипов?
Как определить пересечение не прямоугольного мувиклипа с мувиклипом?
Да и какой способ самый экономичный к ресурсам компьютера (надо проверять пересечение одного мувика с 50 мувиклипами) ?
Зарание спасибо =)
Можно пулю рассматривать как точку с координатами X и Y. Тогда методом hitTest(x, y) можно проверить попадание точки в поверхность любой сложности. Любой объект(выстрел) можно обозначить серией таких точек по контуру и “пробивать” по ним. Можно определять расстояние от пули до цели (если меньше заданного, то попали). Можно использовать любой двухмерный физический движок.
Я не проверял какой из этих способов самый экономичный, но в серьёзной игре не стоит проверять пересечение всех со всеми. Нужна так называемая сетка и проверку нужно производить только с ближайшими объектами
2Stormit
1) Графика как всегда радует глаз
2) Еще бы на AS3 и я был бы счастлив (даешь Crimsonland 4 AS3 версия).
ЗЫ про 2 пункт я конечно же пошутил
Все очень отлично расписано в предидущих темах, и очень просто переносится на AS3. Увидеть кадры с тем как организована графика (по слоям и отдельные игровые элементы) - вот это действительно познавательно.
Спасибо, то что надо)) только не могу удалить мобов со сцены после проигрыша((((
Привет, о безымянный хозяин блога =)
Как кто-то выше справедливо отметил, видно, что этот урок сделан безо всякой любви к предмету. Даже арт в этот раз расстраивает.
Пожалуйста, не иди на поводу у ленивых унылых детей, ты же хитрый =)
Классная игрушка! Когда несколько пауков одновременно начинает появляться - просто не проходимо!
у меня проблема:
почему когда я создаю символ ground у меня пули исчезают?
У тебя координаты неправильно выставленны. Открой символ, премести левый верхний угол в середину символа.
ничего не вышло, пули летят из нижнего правого угла, и исчезают только после прохождения центра, как по y так и по x…=(
UncleBoB - спасибо получилось, только надо было тот угол не в центр, а повыше переместить…
но еще мне непонятен 3-ий скриншот (как сделан символ паука?)
ну ёмаё, застопарился на создании паука…=(
он у меня не выходит на сцену=(…..
Чтобы паук появлялся на сцене достаточно чтобы был клип с именем spider (с центром в середине графики). Пауки и пули могут появляться в неожиданных местах, если неправильно расположен символ ground - его центр должен быть в левом верхнем углу и сам клип должен по размерам и положению соответствовать флешке (полностью покрывать сцену).
Управление неудобное. Обычно практикуется WSAD + поворот мышью. То есть влево-вправо стрейфится, а не поворачивается. Как-то так.
Блин, я уже всю голову сломал, подскажите неразумному. Как после того как вражеские супостаты всё таки доберутся до тебя, их убрать????
В цикле их перебрать и у каждого вызвать removeMovieClip()
Спс))
Здравствуйте Хитрый!
Ваши статьи очень актуальны! Постоянно слежу за новостями сайта.
Вот принялся изучать вашу статью по Кримсонланд.
Но мой Флэш постоянно выдает ошибку в коде.
Моя просьба - не могли бы Вы выложить .fla файл с игрой!
Буду очень благодарен!
К сожалению нет. Я исходники удаляю сразу же после публикации статьи
А с исходником и не интересно совсем - опыта мизер и за рамки примера никто не шагает.
И всё токи .fla файлик был бы очень кстати. Честно говоря дальше создания HERO у меня ничего не получается! То враги вообще не работают не работают, то пули не летят. Хотя всё вроде-бы правильно!
Пожалуйста помогите!
Похоже у меня появился брат по разуму (я про STALKER’а)… Правда он чуть-чуть неграмотный… У меня тоже не работают и пули и враги.
Смотрите Хитрый:
Я создаю клип. Этот клип я называю ground. В нем создаю три клипа: spider, bullet, boom. Внутри клипа spider я делаю два кадра. В первом кадре создаю клип hit, во втором я создаю клип смерти паука (если это правильно – то как этот клип должен называться?).Вопрос первый: Если нет то нужно ли в клипе spider делать клип hit и прямо в нем анимацию смерти?
В клипе body я создаю анимацию выстрела из двух и более кадров. В первом я пишу команду stop(); Во втором - _parent._parent.placeBullet(dot); Вопрос второй: писать прямо так или по другому? В первом кадре клипа body я выделяю дуло и делаю из него клип dot.
Дальше я создаю четыре слоя, в каждом из которых помещаю код указанный выше.
Вопрос третий: – правильна ли хронология событий? Или же я где-то куда-то чего-то не туда поместил/написал?
Только разяъясняйте просто – разговариваете с ламером =))))))))))))))))))
Клип ground не должен содержать в себе ничего кроме шейпа, - он просто определяет своими габаритами игровую зону. Он должен лежать в той же временной линейке что и герой и пауки с пулями. Простой и универсальный способ отладки приложения - функция trace(). Трейсируйте все клипы которые вы создали но не видите на экране, если они не undefined (то есть созданы), проверяйте их координаты, прозрачность, _visible и т.д. всё с чем вы в коде работаете. На каком-то этапе обнаружится сбой, - сэтого места и нужно чинить. В вашем случае, если пули и пауки помещены в клип ground, они не должны дублироваться и при трейсе будут выдавать undefined.
trace(), trace(), trace(), trace(), trace()
Имею глюк, дфже два, но подозреваю что они как-то связаны между собой
Функция removeSpider.
У врага с 63 кадра начинается анимация смерти. Делаю так:
curS.gotoAndPlay(63);
delete curS.onEnterFrame;
Приблизительно у 1 из 20-30 врагов не запускается анимация смерти, хотя удаление Ентерфрейма срабатывает. Никак не пойму почему.
И второе:
Удаление врага из массива. Так:
splice(i, 1);
Не работает. Работает так:
spiders.splice(i, 1);
но это не главное, главное, что в массиве начинают появлятся undefined-ы. Т.е. я запускал на трейс массив, или выводил кого проверяет пуля в кадре, на выходе получал андефинеды. Сначала их нет, но со временем понемногу, 1 потом 3, потом больше, больше и больше.
К чему бы это ?
И ещё одно

Есть у меня переменная:
_root.zombs;
Когда создаю врага, проверяю _root.zombs < 30 , если меньше - создаётся новый, нет - не создаётся. Всё в той же removeSpider делаю _root.zombs -= 1, когда убиваю кого-то.
Так, вот, когда кол-во убитых доходит до 100 - 150, то на сцене ходит не больше 5 зомбей, а переменная _root.zombs == 30. К тому времени андефинедов в массиве уже около половины, и около 5-7 штук остаются на сцене не умирая (но без ЕнтерФрейма(см. прошлый пост)).
Вот такие странности…
Посчитать точно сколько врагов ходит по карте или сколько не умерших осталось проблемно, т.к. карта довольно большая, вся в экран не помащается, а эти гавнюки всё ходят, и сбивают со счёта
>>У врага с 63 кадра начинается…
Скорее всего переход в 63-й кадр перебивает gotoAndPlay(1) или типа такого который отвечает за ходьбу. Это не самая удачная практика - делать всё в одной линейке - лучше разбить на “состояния” и разнести по кадрам, как у меня в примере.
>>Удаление врага из массива…
Спасибо, ошибку в коде поправил - теперь массив противников “очищается”.
Проверил - в моём примере undefined не появляется (замедлил противников для теста) - это что-то у вас.
>>Есть у меня переменная _root.zombs;…
Это лишнее, у нас же есть массив spiders. Проверяйте на длину if (spiders.length < 30) {…}
>>У врага с 63 кадра начинается…
Надо копать дальше, что это за странность такая..
Да, скорее всего так и есть, это я протупил. Состояниями было бы надёжней, да и проще.
>>Есть у меня переменная _root.zombs;…
мне проверка на длинну не поможет, т.к. там андефинеды собираются, и кол-во будет не правильным
Спасибо за ответ и за уроки вообще
Здравствуйте Хитрый.
Помогите, пожалуйста, с такой проблемой:
В моей игре противники не создаются рандомом, а появляются из заданных мест в определенном количестве. Клипу противника я присваиваю код:
onClipEvent (load) {
speed = 2
}
onClipEvent (enterFrame) {
if (_root.Player.hitTest(this)) {
_root.gotoAndPlay(”attack”);
}
if (_root.Player._x > this._x) {
this._x += speed;
}
if (_root.Player._x < this._x) {
this._x -= speed
}
if (_root.Player._y this._y) {
this._y += speed;
}
}
Если враг умирает, его труп, по задумке, не должен исчезать. Но вот в чем проблема - после проигрывания анимации смерти врага, его тело продолжает преследовать Игрока, а по идее должно оставаться на месте =) подскажите решение, пожалуйста.
Ну так EnterFrame у вас не прекращает работать.
В таком виде как вы написали, его можно остановить только удалив сам клип.
Нужно писать примерно так:
onClipEvent(load) {
onEnterFrame = function() {…..}
}
а удалять: onEnterFrame = null;
Хм. В принципе, все получилось
Осталось только одно. У меня такая схема : внутри врага-клипа находится кнопка
// on(press) { gotoAndPlay(”Death”); }
соответственно,при клике по врагу-клипу проигрывается анимация смерти . А каким способом вышеупомянутую функцию заставить удалиться после этого самого клика??? Пробовал, пробовал, чет так толком и не получилось ничего =(
С помощью hitTest`a или как ???
Здравствуйте Хитрый.
Помогите пожалуйста!
Ваши уроки мне очень нравятся!Получается всё с 1го раза но смерть персонажа в этом уроке никак не могу зделать зделайте пожалуйста урок по смерти персонажа именно в этом уроке очень,очень нужно!!! Я ведь не прошу исходних я хочу всё сам научится!!!!
Спасибо за то что Ты есть!
//баг mc blood=mc boom.
скажите пожалуйста , почему когда я стреляю , у меня пули улетают под прямым углом от клипа body ?
Графику внутри клипа с героем нужно повернуть на 90 градусов.
По умолчанию, при _rotation = 0 у всех клипов, персонаж должен смотреть влево.
у меня все повернуто…
а..все , разобрался , надо было + hero.body._rotation убрать , у меняж чел торсом не ворочает…
управление не очень удобноедля такой игры.
if(Key.isDown(1)) — на макинтошах не работает, данное событие не отлавливается, на писи все пашет.
Я не знал. Это выражение можно заменить событием onMouseDown
Проникся… теперь сплю и вижу свои мини игры. Спасибо)
Всё получилось но почему то пули не дублируются, стреляю одной затем вслед другой и предыдущая исчезает( почему так?
Здравствуйте Sormit
у вас отличный урок, вот только пробовал писать с него игру - добавил оружие со взрывом
взрыв -
addfire = function(x,y,dmg){
var d=boom.duplicateMovieClip(’f'+lev,lev);
d._x=x;
d._y=y;
d.dmg=dmg;
d.onEnterFrame=function(){
var i = spiders.length;
while (i–) {
var curS = spiders[i];
if (curS.hit.hitTest(this)) {
curs.h+=this.dmg;
curs.rs+=this.dmg/10;
curS.gotoAndStop(curs.h);
if(curs.h>curs.mh){
removeSpider(curS);
}
}
}
}
}
createBOOM=function(tgt){
addfire(tgt._x,tgt._y,1);
addfire(tgt._x+Math.random()*50-25,tgt._y+Math.random()*50-25,1);
addfire(tgt._x+Math.random()*50-25,tgt._y+Math.random()*50-25,1);
}
вызов из onEnterFrame пули
this._x += bulletSpeed * Math.cos(this.a);
this._y += bulletSpeed * Math.sin(this.a);
if (this._x ground._x + ground._width + this._width || this._y ground._y + ground._height + this._height) {
this.removeMovieClip();
}
while (i–) {
var curS = spiders[i];
if (curS.hit.hitTest(this)) {
curs.h+=this.dmg;
curs.rs+=this.dmg/10;
if(this.t==2){createBOOM(this);}
if(this.t!=3){this.removeMovieClip();}
curS.gotoAndStop(curs.h);
if(curs.h>curs.mh){
removeSpider(curS);
}
}
}
проблема - при использовании этого оружия через какое-то время герой перестает реагировать на управление (даже башня не крутится). причем пули и враги продолжают двигаться (останавливается только onEnterFrame’ы у героя и самого фрейма)
Не получается сделать что бы пули вылетали…
все проверил, в функцию placeBullet заходит, но вот саму копию не создает, флешь кс 4, АС переключил на 2ой
символ дот есть, находиться в символе боди, вызов функции есть, и срабатывает, даже пробовал переместить его в функцию хиро и вызывать по клику, тоже все работает вызывается… но пуля не копируется
пробовал про трасировать, но не очень понимаю как трейс во флеше работает
пробовал оставить только клонирование пули и полет, без расчетов, лишь бы вылетала, все равно не получается.
уже все перепробовал… подскажите пожалуйста, код существенно не менял, но и с оригиналом пробовал.
Народ простите за тупость но скажите: Как сделать чтобы чел поворачивался в сторону мыши!!!!
Что это за программа? Дайте, название или ссылку на скачивание?
Че то у меня враги вообще не появляются. Ни хрена не могу понять че и как делать. Куда писать “_visible = false”? По тупому объясняете. И куда писать “_parent.removeMovieClip()” кто нибудь нормально обьясните
Дайте кто-нибудь свои исходник.
stmp, _visible=false пишется в кадре, и это предназначено для невидимости чего-то. _parenet.removeMoveClip() тоже пишется в кадре мувика для его же самоликвидации
если кому-то аццки нужен исходник юзните orbitdownloader а потом какой-нибудь декомпилятор
У меня получился дядька который ходит вперед, с обзором для стрельбы зади себя, и у которого пули летят в лево от уружыя… ппц блин!
У меня такой вопрос: я дал персонажу возможность бить и поместил анимацию в первом кадре, где у вас находится анимация бега. Символ бега помещаю в отдельный кадр. Создаю функцию где пишу всё, но переход к кадру осуществляется постоянно и в конечном счёте смещается картинка в сторону главного героя, но анимация не воспроизводится. Помогите, пожалуйста.