![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jul 2010
Сообщений: 14
|
Столкнулся с такой проблемой: по нажатии ПРОБЕЛА игрок стреляет. Направление определятся положением носа. Все бы ничего, стреляет правильно, НО если я зажму пробел, и уменьшу интервал до определенной степени, ТО во врема поворота коробля меняется направление самой пули...
Я так понял, так как проблема возникает при зажатом пробеле, то начинайте смотреть с 33 строчки, там где: if (Key.isDown(Key.SPACE)) попробуйте написать напрмиер fire+200 а не fire+900, зажать пробел, и начать крутится на одном месте Помогите плз =) Я б мог сделать две ветки, чтоб одна через 1 сек пускалась, второя через 1,5 но это не оптимально =) ПС Весь код находится в клипе functions |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 560
|
Если во время поворота меняется направление пули - то вы не фиксируете ее направление во время выстрела. Во время выстрела пуля должна "запомнить" свое направление (направление пушки) и далее двигаться по этой траектории, не обращаясь к пушке.
|
|
|||||
|
Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
|
Во превых, пишите в кадре а не в клипах!
Проблема заключается в том, что созданная пуля в этой же функции получает координаты куда лететь и в этой же функции она у вас летит и в этой же функции она же обнавляет координаты относительно поворота корабля. Решение проблемы: Вынесите движение пули в отдельную функцию. 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; } |
|
|||||
|
Регистрация: Jul 2010
Сообщений: 14
|
Не работает. Анологичный код. Результат тот же самый. Что я упустил?
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; } } Более того, _root.attachMovie у меня вообще не обладает ни каким эффектом Последний раз редактировалось KipSyS; 03.07.2010 в 19:56. |
|
|||||
|
Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
|
Цитата:
Что такое bullets и как она связана с дублированными клипами? следуя вашему коду, bullets появилась ни откуда. почему дублированным клипам не даете ссылку типа того: var bullets = duplicateMovieClip(_root.bullet, "bullet"+nextBullet,nextBulle+9999); в таком случае в переменной bullets будет храниться ссылка на копию клипа и все должно работать. вместо надо в первом случае со скобками вы вызываете как обычную функцию, во втором случае как обработчик событий вместо надо Цитата:
Последний раз редактировалось NoCD; 04.07.2010 в 02:34. |
|
|||||
|
Модрон-ветеринар
|
NoCD, маленькое уточнение: обработчик событий или нет - это не причем.
В первом случае просто происходит однократный вызов функции update_p(), никакого приравнивания не происходит. Во втором случае все верно - на событие назначается функция по объектной ссылке с помощью имени функции. Последний раз редактировалось mooncar; 04.07.2010 в 02:07. |
|
|||||
|
Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
|
Цитата:
![]() |
|
|||||
|
Регистрация: Jul 2010
Сообщений: 14
|
Хм...понятно...Я просто не особо дружу с ООП, так как раньше программил на процедурных языках.
bullets сдесь-это массив пуль. bullets.push(nextBullet) ; тоесть меняя параметры _x и _y этого массива мы меняем координаты. Само движение проходит в этом цикле: 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;} } |
|
|||||
|
Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
|
Цитата:
Цитата:
Похоже вы не очень в АС2 разбираетесь. Как массив bullets вдруг приобрел свойства dx1 и dy2 ? К тому же вот эта строка меня вводит в ступор: bullet =_root["bullet"+bullets[i]]; если имя пули хранится в массиве, то зачем вы таким образом восстанавливаете ее имя? не мучайте себя массивом с пулями, почему бы просто не восстановить имя клипа вместо bullet =_root["bullet"+bullets[i]]; сделать так: bullet =_root["bullet"+i]; создавайте пули под именем name = "bullet"+i; и присваивайте его аттаченому клипу. Таким же образом в цикле восстанавливайте имя. Последний раз редактировалось NoCD; 04.07.2010 в 16:39. |
|
|||||
|
Регистрация: Jul 2010
Сообщений: 14
|
Я вообще книгу AS 2.0 не открывал, обучался методом тыка на какомто исходнике =))
Поэтому для меня это пока не переваремая куча информации... =) Посоветуйте учебник...И вообще, что лучше, АС 2 или АС 3, с точки зрения программинга, читабельности, и "граблей"? |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:38. |
|
|
« Предыдущая тема | Следующая тема » |
|
|