Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.07.2010, 12:29
KipSyS вне форума Посмотреть профиль Отправить личное сообщение для KipSyS Найти все сообщения от KipSyS
  № 1  
Ответить с цитированием
KipSyS

Регистрация: Jul 2010
Сообщений: 14
По умолчанию Незовисимое поведение двух МувиКлипов

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

Старый 03.07.2010, 16:47
rainbowrussia вне форума Посмотреть профиль Отправить личное сообщение для rainbowrussia Найти все сообщения от rainbowrussia
  № 2  
Ответить с цитированием
rainbowrussia
 
Аватар для rainbowrussia

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

Старый 03.07.2010, 16:52
NoCD вне форума Посмотреть профиль Отправить личное сообщение для NoCD Найти все сообщения от NoCD
  № 3  
Ответить с цитированием
NoCD
 
Аватар для NoCD

Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
Во превых, пишите в кадре а не в клипах!
Проблема заключается в том, что созданная пуля в этой же функции получает координаты куда лететь и в этой же функции она у вас летит и в этой же функции она же обнавляет координаты относительно поворота корабля.

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

Код 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;
}

Старый 03.07.2010, 19:53
KipSyS вне форума Посмотреть профиль Отправить личное сообщение для KipSyS Найти все сообщения от KipSyS
  № 4  
Ответить с цитированием
KipSyS

Регистрация: Jul 2010
Сообщений: 14
Не работает. Анологичный код. Результат тот же самый. Что я упустил?
Код 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 у меня вообще не обладает ни каким эффектом


Последний раз редактировалось KipSyS; 03.07.2010 в 19:56.
Старый 04.07.2010, 01:55
NoCD вне форума Посмотреть профиль Отправить личное сообщение для NoCD Найти все сообщения от NoCD
  № 5  
Ответить с цитированием
NoCD
 
Аватар для NoCD

Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
Цитата:
Не работает. Анологичный код. Результат тот же самый. Что я упустил?
Вы сделали не аналогично, а все наоборот.

Что такое 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 у меня вообще не обладает ни каким эффектом
Не понял про что вы. К тому же ваш код наврядли будет работать, там есть ошибки


Последний раз редактировалось NoCD; 04.07.2010 в 02:34.
Старый 04.07.2010, 02:01
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 6  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
NoCD, маленькое уточнение: обработчик событий или нет - это не причем.
В первом случае просто происходит однократный вызов функции update_p(), никакого приравнивания не происходит.
Во втором случае все верно - на событие назначается функция по объектной ссылке с помощью имени функции.


Последний раз редактировалось mooncar; 04.07.2010 в 02:07.
Старый 04.07.2010, 02:48
NoCD вне форума Посмотреть профиль Отправить личное сообщение для NoCD Найти все сообщения от NoCD
  № 7  
Ответить с цитированием
NoCD
 
Аватар для NoCD

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

Старый 04.07.2010, 12:18
KipSyS вне форума Посмотреть профиль Отправить личное сообщение для KipSyS Найти все сообщения от KipSyS
  № 8  
Ответить с цитированием
KipSyS

Регистрация: Jul 2010
Сообщений: 14
Хм...понятно...Я просто не особо дружу с ООП, так как раньше программил на процедурных языках.
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 падает, наверно из за того, что массив не очищается?

Старый 04.07.2010, 16:27
NoCD вне форума Посмотреть профиль Отправить личное сообщение для NoCD Найти все сообщения от NoCD
  № 9  
Ответить с цитированием
NoCD
 
Аватар для NoCD

Регистрация: Jan 2006
Адрес: Novosibirsk
Сообщений: 353
Цитата:

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; и присваивайте его аттаченому клипу. Таким же образом в цикле восстанавливайте имя.


Последний раз редактировалось NoCD; 04.07.2010 в 16:39.
Старый 04.07.2010, 18:07
KipSyS вне форума Посмотреть профиль Отправить личное сообщение для KipSyS Найти все сообщения от KipSyS
  № 10  
Ответить с цитированием
KipSyS

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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