Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Незовисимое поведение двух МувиКлипов (http://www.flasher.ru/forum/showthread.php?t=141731)

KipSyS 03.07.2010 12:29

Незовисимое поведение двух МувиКлипов
 
Вложений: 1
Столкнулся с такой проблемой: по нажатии ПРОБЕЛА игрок стреляет. Направление определятся положением носа. Все бы ничего, стреляет правильно, НО если я зажму пробел, и уменьшу интервал до определенной степени, ТО во врема поворота коробля меняется направление самой пули...
Я так понял, так как проблема возникает при зажатом пробеле, то начинайте смотреть с 33 строчки, там где:
if (Key.isDown(Key.SPACE))
попробуйте написать напрмиер fire+200 а не fire+900, зажать пробел, и начать крутится на одном месте
Помогите плз =) Я б мог сделать две ветки, чтоб одна через 1 сек пускалась, второя через 1,5 но это не оптимально =)
ПС Весь код находится в клипе functions

rainbowrussia 03.07.2010 16:47

Если во время поворота меняется направление пули - то вы не фиксируете ее направление во время выстрела. Во время выстрела пуля должна "запомнить" свое направление (направление пушки) и далее двигаться по этой траектории, не обращаясь к пушке.

NoCD 03.07.2010 16:52

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

Решение проблемы: Вынесите движение пули в отдельную функцию.

Код AS1/AS2:

 
var cooldown:Number = 2;
 
корабль.onEnterFrame = создаем_пули;
 
function создаем_пули(){
 
if(cooldown > 0){cooldown--}else{
 
var clip:Movieclip = _root.attachMovie("пуля_клип","пуля",1)
    clip._x = корабль._x;
    clip._y = корабль._y;
    clip.скорость_пули = 5;
 
    var angle:Number = (корабль._rotation + или - 90) * Math.PI / 180;
    clip.xmov = clip.скорость_пули * Math.cos(angle);
    clip.ymov = clip.скорость_пули * Math.sin(angle);
    clip.onEnterFrame = движок_для_пули;
cooldown = 2;
}
}
 
function движок_для_пули(){
 
this._x += this.xmov;
this._y += this.ymov;
}


KipSyS 03.07.2010 19:53

Не работает. Анологичный код. Результат тот же самый. Что я упустил?
Код AS1/AS2:

if (Key.isDown(Key.SPACE))
                {
                        if (fire+900 < getTimer())
                        {
                                fire=getTimer();
                        duplicateMovieClip(_root.bullet, "bullet"+nextBullet,nextBulle+9999);
                        // Устанавливаем ее координагы.
                        _root["bullet"+nextBullet]._x = _root.shot._x+2;
                        _root["bullet"+nextBullet]._y = _root.shot._y;
                        // Добавляем новую пулю к массиву.
                        bullets.push(nextBullet) ;
                        // Изменяем значение переменных, отвечающих
                        //за появление пуль.
                        nextBullet++;
                        bullets._x-=_root.shot._x;
                        bullets._y-=_root.shot._y;
                        ShotAn=(_root.shot._rotation-90)* Math.PI / 180;
                        bullets.dx1 = 10.0*Math.cos(ShotAn);
                        bullets.dy2 = 10.0*Math.sin(ShotAn);
                        bullets.onEnterFrame=update_p();

                        }
                }
                function update_p():Void
                {
                bullets._x=bullets.dx1;
                bullets._y=bullets.dy2;

                      }
 
                }

Добавлено через 18 минут
Более того, _root.attachMovie у меня вообще не обладает ни каким эффектом

NoCD 04.07.2010 01:55

Цитата:

Не работает. Анологичный код. Результат тот же самый. Что я упустил?
Вы сделали не аналогично, а все наоборот.

Что такое bullets и как она связана с дублированными клипами?

следуя вашему коду, bullets появилась ни откуда.

почему дублированным клипам не даете ссылку типа того: var bullets = duplicateMovieClip(_root.bullet, "bullet"+nextBullet,nextBulle+9999);

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

вместо
Код AS1/AS2:

bullets.onEnterFrame = update_p();

надо
Код AS1/AS2:

bullets.onEnterFrame = update_p;

в первом случае со скобками вы вызываете как обычную функцию, во втором случае как обработчик событий

вместо
Код AS1/AS2:

bullets._x = bullets.dx1;
bullets._y = bullets.dy2;

надо
Код AS1/AS2:

this._x += this.dx1;
this._y += this.dy2;

Цитата:

Более того, _root.attachMovie у меня вообще не обладает ни каким эффектом
Не понял про что вы. К тому же ваш код наврядли будет работать, там есть ошибки

mooncar 04.07.2010 02:01

NoCD, маленькое уточнение: обработчик событий или нет - это не причем.
В первом случае просто происходит однократный вызов функции update_p(), никакого приравнивания не происходит.
Во втором случае все верно - на событие назначается функция по объектной ссылке с помощью имени функции.

NoCD 04.07.2010 02:48

Цитата:

Сообщение от mooncar (Сообщение 919738)
NoCD, маленькое уточнение: обработчик событий или нет - это не причем.
В первом случае просто происходит однократный вызов функции update_p(), никакого приравнивания не происходит.
Во втором случае все верно - на событие назначается функция по объектной ссылке с помощью имени функции.

Как раз это я и имел ввиду:)

KipSyS 04.07.2010 12:18

Хм...понятно...Я просто не особо дружу с ООП, так как раньше программил на процедурных языках.
bullets сдесь-это массив пуль.
bullets.push(nextBullet) ;
тоесть меняя параметры _x и _y этого массива мы меняем координаты.
Само движение проходит в этом цикле:
Код AS1/AS2:

for(i=bullets.length-1;i>=0;i--) 
                {
                // Выбираем элемент.
                bullet =_root["bullet"+bullets[i]];
                bullet._x += bullets.dx1;
                bullet._y += bullets.dy2;
                //Удаляе пулю, если она выходит за экран
                if (bullet._y<0) {bullet.removeMovieClip();}
                if (bullet._x<0) {bullet.removeMovieClip();}
                if (bullet._y>500) {bullet.removeMovieClip();}
                if (bullet._x>700) {bullet.removeMovieClip();}
                dx = bullet._x - _root.station._x;
                dy = bullet._y - _root.station._y;
                res=Math.sqrt(dx*dx+dy*dy);
                dmg=50*((100+_root.damages)/100)/_root.level;
                if (res < _root.station._width/2) { bullet.removeMovieClip(); _root.bar_rob._xscale-=dmg; _root.score+=10;}
                if (res < _root.station._height/2) { bullet.removeMovieClip(); _root.bar_rob._xscale-=dmg;}
                }

Там же и определяется поподание...Так как я не особо дружу с ООП, то на время оставлю это идею-ускорю скорость пули. Хотя остается проблема-при длительной игре FPS падает, наверно из за того, что массив не очищается?

NoCD 04.07.2010 16:27

Цитата:


bullets сдесь-это массив пуль.
bullet =_root["bullet"+bullets[i]];
Цитата:

bullet._x += bullets.dx1;
bullet._y += bullets.dy2;
Вы пишите не совместимые вещи.
Похоже вы не очень в АС2 разбираетесь.

Как массив bullets вдруг приобрел свойства dx1 и dy2 ?
К тому же вот эта строка меня вводит в ступор: bullet =_root["bullet"+bullets[i]]; если имя пули хранится в массиве, то зачем вы таким образом восстанавливаете ее имя?

не мучайте себя массивом с пулями, почему бы просто не восстановить имя клипа
вместо bullet =_root["bullet"+bullets[i]]; сделать так: bullet =_root["bullet"+i];

создавайте пули под именем name = "bullet"+i; и присваивайте его аттаченому клипу. Таким же образом в цикле восстанавливайте имя.

KipSyS 04.07.2010 18:07

Я вообще книгу AS 2.0 не открывал, обучался методом тыка на какомто исходнике =))
Поэтому для меня это пока не переваремая куча информации...
=) Посоветуйте учебник...И вообще, что лучше, АС 2 или АС 3, с точки зрения программинга, читабельности, и "граблей"?


Часовой пояс GMT +4, время: 19:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.