PDA

Просмотр полной версии : Несколько выстрелов.


sinigr
25.06.2010, 06:36
Решил создать небольшую флеш игрушку. В ней чел ходит, стреляет монстров, собирает бонусы и.т.д. Из пистолета, по 1 пуле стреляет норм, но вот как сделать чтобы вылетало например не более 3 пуль через небольшой промежуток времени?(это когда из автомата стреляет) По возможности объясните пожалуйста поподробнее, потому что я только начал разбиратся в AS. Пробывал dublicateMovieClip, но копия почему то зависает((
Выкладываю кусок кода, где собствнно происходит выстрел:


if (Key.isDown(Key.SPACE))
{
if (_root.gotgun == true && !_root.shooting == true)
{
if (this._xscale == 100)
{
_root.attachMovie("bullet","bulleter",1,{_x:_root.char._x + 40, _y:_root.char._y - 55});
}
if (this._xscale == -100)
{
_root.attachMovie("bullet","bulleter",1,{_x:_root.char._x - 40, _y:_root.char._y - 55});
}
_root.shooting = true;
with (_root.bulleter)
{
onEnterFrame = function ()
{
if (_root.timer > _root.maxshoottime)
{
_root.shooting = false;
unloadMovie(this);
}
_root.timer++;
_x += _root.mvsp;
}
}
}
}

p.s за основу взял исходник, разобрался что к чему, и полностью его перелопатил, оставил только самое основное.

p.p.s А, и еще один вопрос. как определить место где пуля попадает в тело врага, чтобы потом добавить брызги крови) А то щас попадаю например в ноги а брызги из головы))

udaaff
25.06.2010, 08:55
Для оформления своего кода надо использовать теги (http://www.flasher.ru/forum/showthread.php?t=122539)

Бармалейкин
25.06.2010, 14:48
Я отвечу не вполне конкретно а по логинке:
пусть каждая пуля это новый объект, который создаётся копией графического элемента из библиотеки. Создав пулю, которая куда-то летит нужно дождаться её "долёта" до препятствия, края экрана. После чего удалить этот объект. И нужно иметь общий счётчик таких объектов, который будут менять они сами - при создании счётчик увеличивать а при разрушении уменьшать. Т.е. тут налицо ООП, но думаю можно ограничиться одними событиями.
Вставив в код создающий новые объекты-пули простейший ограничитель по проверке этого счётчика, можно делать разные виды оружия, с разным количеством пуль :) Как-то так.

sinigr
25.06.2010, 15:05
Я примерно так и пытался делать, но ведь каждой пуле надо своё имя чтобы этот код работал. Просто создать несколко пуль недостаточно. Как сделть я что бы например получались пули bulleter1 bulleter2 и.т.д и соответсвенно прописать чтобы все взаимадействовало с такими пулями я не знаю:( Или можно как то все проще сделать, например создать пулю и уже на нее как нибудь можно прицепить код?

Jitakuzu
25.06.2010, 22:56
Я делал это следующим образом: при стрельбе из автоматического оружия первой выстреленной пуле передается значение, которое означает сколько пуль еще надо будет выстрелить. Для персонажа код остается таким же, как и при стрельбе из пистолета - то есть одну пулю выстрелил и колдаун несколько секунд. Сама же пуля создает новую пулю и передает ей новое значения кол-ва пуль (свое - 1). Пули будут создаваться, пока это значение >0. Кстати, исли еще задавать пуле время, через которое она должна создать новую пулю (сразу как только вылетела, или через несколько десятых секунды), то можно имитировать не только автомат, но и дробовик, задав ожидание равное нулю(все 5-10 пуль одновременно вылетят) =)))
Таким образом мы имеем:
Пистолет - кол-во пуль = 1
Автомат - кол-во пуль = 3, ожидание = 1/10 секунды
Дробовик - кол-во пуль = 5, ожидание = 0

sinigr
26.06.2010, 06:48
Спасибо, мысль понял . Остался один ньюансю Как на пулю привесить код? Где это прописать? Ее ведь нету на экране изначально.

Jitakuzu
26.06.2010, 18:38
У тебя же в примере собственного кода это есть ;)
Сначала _root.attachMovie("bullet","bulleter",1...);
//Кстати, я бы советовал называть вновь созданную пулю не просто "bulleter", а прибалять некий идентификатор. То есть "bulleter"+_root.bull_num, который потом увеличивать на 1. А глубину задавать функцией _root.getNextHighestDepth().
Потом пишешь:
_root["bulleter"+_root.bull_num].onEnterFrame=function() {
//И тут код для самой пули))
}

teror132
27.06.2010, 11:47
в attachMovie вместо номера слоя нужно написать _root.getNextHighestDepth() и он будет класть пули на новые слои, но есть одна проблемма... персонаж не сможет сделать более 256 выстрелов, потомучто 256 - максимальное количество слоёв...

Добавлено через 11 минут
Я отвечу не вполне конкретно а по логинке:
пусть каждая пуля это новый объект, который создаётся копией графического элемента из библиотеки. Создав пулю, которая куда-то летит нужно дождаться её "долёта" до препятствия, края экрана. После чего удалить этот объект. И нужно иметь общий счётчик таких объектов, который будут менять они сами - при создании счётчик увеличивать а при разрушении уменьшать. Т.е. тут налицо ООП, но думаю можно ограничиться одними событиями.
Вставив в код создающий новые объекты-пули простейший ограничитель по проверке этого счётчика, можно делать разные виды оружия, с разным количеством пуль :) Как-то так.

помоему всё гораздо проще:) :
/*Это пишем в руте*/q=1
/*Это пишем в мувике*/
on(keyPress"<Space>"){
_root.q=0
_root.attachMovie(/*это ссылка на объект в библиотеке*/"n",/*это новое имя с изменяющимся числовым значением"q"*/"b"+q,/*это номер слоя*/q)
_root.q++
}


таким образом мы получим дофига объектов с названием "b+номер слоя, на котором объект находится"
на данной основе работает вот эта фигня. (http://narod.ru/disk/22247592000/untitled.rar.html) Там ездит объект, как ему захочется и если кликнуть на него мышкой, то он раздваивается, но как я уже говорил этих объектов максимум 256.
вот ещё один пример (http://narod.ru/disk/22247645000/game.fla.html) только там сверху летят ракеты, работает на томже принцыпе.

mooncar
27.06.2010, 12:06
в attachMovie вместо номера слоя нужно написать _root.getNextHighestDepth() и он будет класть пули на новые слои, но есть одна проблемма... персонаж не сможет сделать более 256 выстрелов, потомучто 256 - максимальное количество слоёв...
Что за бред? Какие слои? Не путайте слои в авторской среде программы и глубины в готовом ролике.
Слои есть только в программе Adobe Flash, в готовом ролике слоев нет.
В ролике есть глубины или уровни (depths), это z-координата, положительное значение которой может достигать очень больших величин.
Именно они и используются при аттаче мувиков на сцену.
А при компиляции из программы тамошние "слои" просто автоматически преобразуются в глубины сообразно взаимному положению объектов - по этим слоям и друг в друге.
При этом объектам, созданным в авторской среде, автоматически присваиваются отрицательные глубины (чтобы не было конфликтов с программно созданными), начиная с -16384, а программно добавляемым объектам задаются значения от 0 и до очень больших значений - либо по алгоритму кода, либо автоматически.

Jitakuzu
27.06.2010, 14:33
teror132:
Он, ведь, хочет, чтоб у него три пули вылетало, а потом была пауза неск. секунд... Ему очередь реализовать надо. А у тебя шквальный огонь получается))
Тока зачем ты пишешь _root.q=0?? Это не лишнее??))

NoCD
27.06.2010, 16:01
Есть полуавтомат, например м16, который выстреливает три пули за раз, а есть автоматы, которые стреляют пока не закончится вся гашетка.

Вот реализация автомата м16


function init(){
flag = true;
numb_bullet = 0;
cannon_f()
}

function cannon_f(){

cannon = _root.attachMovie("cannon_mc","cannon",1000)
cannon._x = Stage.width/2
cannon._y = Stage.height;


}
onMouseDown = function(){

if(flag){
onEn = _root.createEmptyMovieClip("onEn",1200)
//--------------------------первый выстрел
onEn.cooldown = 3;
//--------------------------интервал между выстрелами
onEn.cooldown2 = 5;
//--------------------------максимальное количество выстрелов за раз
onEn.number_bullet = onEn.number_bullet2 = 4;
onEn.onEnterFrame = prefire;
flag = false;
}

}
onMouseUp = function(){
flag = true;
delete onEn.onEnterFrame;
}

function prefire(){
if(this.cooldown > 0){this.cooldown --;}else{
//trace("Boom");
if(this.number_bullet > 0){fire_f();this.number_bullet--;}
this.cooldown = this.cooldown2;
}
}
//------------------------Создаем пули
function fire_f(){

if(numb_bullet < 50){numb_bullet++;}else{numb_bullet = 0;}
var name = "bullet" + numb_bullet;
var clip = _root.attachMovie("bullet_mc",name,1300 + numb_bullet)
clip._x = cannon._x;
clip._y = cannon._y;
clip.speed = 10;
clip.onEnterFrame = bullet_engine;
}
//---------
function bullet_engine(){

this._y -=this.speed;
}
//----------
init();


где

cannon_mc - это MovieClip пушки
bullet_mc - это - MovieClip пули

sinigr
27.06.2010, 16:21
че то не совсем получается, пули не летят(( Я имею ввижу где их бесконечно. Просто на месте зависают

NoCD
27.06.2010, 16:41
че то не совсем получается, пули не летят(( Я имею ввижу где их бесконечно. Просто на месте зависают

Ничего не понял с ваших слов.

teror132
28.06.2010, 15:37
ой, я _root.q=0 стереть забыл)