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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.05.2013, 21:50
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 1  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
По умолчанию Вращающийся мувик и его "дети"

Всем привет.

Есть мувик, который крутится при каждом EnterFrame. Это пушка у космического корабля. У этой пушки - четыре дула. Из каждого где-то раз в пару секунд должен вылетать снаряд. Вопрос - как это сделать?
Сложность именно в градусе поворота каждого дула.

Первый вариант, который я попробовал был прост и он даже, типа сработал - просто аттачить мувики снарядов к мувику пушки. rotate у них уже будет задан, угол просчитывать не надо и движение простое +1 к x или y.
Заработало на ура, вылетало откуда надо, летело под тем углом, что был в момент выстрела, но, поскольку мувик с пушкой продолжал крутиться - снаряды крутились вместе с ним.
Отказался.

Потом пробовал посчитать угол, как-то там его передать в функцию движения снаряда и прилепить уже под нужным углом. Не получилось. Я не силён в математике, да и запутался я там. Вроде как rotation указывается в градусах, а sin и cos считаются в радианах...
Сейчас попробовал это сделать ещё раз - всё равно не получилось.

Потом пробовал прилепить мувик к пушке и цепять снаряды на него. И как прицеплю - каким-то образом его отцеплять. Но и снаряды летели не оттуда и как "перецепить" мувик не придумал.

В общем - подскажите кто решал подобные задачи, как можно сделать ещё или если у кого есть - поделитесь рабочим примером из мною перечисленных.

Заранее спасибо.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А что, угол поворота дула отличается от угла поворота башни? Так сложно задать снаряду тот же rotation, что и у башни? (ну, если у Вас дуло в башне как-то еще повернуто, прибавить и эту разницу. Если снаряд в своем мувике летит не в ту сторону, в которую смотрят дула внутри мувика башни, то и эту разницу добавить). При чем тут синусы и радианы, не совсем понятно.
__________________
Reality.getBounds(this);

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Вот небольшой пример, посмотрите, что и как.
TestProject.swf   (2.2 Кб)

Код AS3:
package 
{
	import flash.display.Graphics;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
 
	/**
	 * ...
	 * @author bav
	 */
	public class Main extends Sprite 
	{
		private static var MAX_BULLET_DISTANCE:Number = 200;
		private static var GUN_ROTATE_STEP:Number = 0.2;
		private static var BULLET_STEP:Number = 5.0;
		private static var GUNS_COUNT:uint = 4;
		private var guns:Vector.<Sprite>;
		private var bullets:Vector.<MovieClip>;
		private var megaGun:Sprite;
 
		private var generateBulletsTimer:Timer;
		private var moveBulletsTimer:Timer;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			createGuns();
			initTimers();
		}
 
		private function createGuns():void
		{
			megaGun = new Sprite();
			var g:Graphics = megaGun.graphics;
			g.lineStyle(1);
			g.beginFill(0x999999);
			g.drawCircle(0, 0, 10);
			g.endFill();
 
			megaGun.x = stage.stageWidth / 2;
			megaGun.y = stage.stageHeight / 2;
			addChild( megaGun );
 
			guns = new Vector.<Sprite>();
			for (var i:int = 0; i < GUNS_COUNT; ++i)
			{
				var s:Sprite = new Sprite();
				g = s.graphics;
				g.lineStyle(1);
				g.beginFill(0x999999);
				g.drawRect(0, -5, 30, 10);
				g.endFill();
				s.rotation = -180 + Math.random() * 360;
 
				megaGun.addChild( s );
				guns.push( s );
			}
			addEventListener(Event.ENTER_FRAME, rotateMegaGun);
		}
 
		private function rotateMegaGun(e:Event):void 
		{
			megaGun.rotation += GUN_ROTATE_STEP;
		}
 
		private function initTimers():void 
		{
			generateBulletsTimer = new Timer(1000);
			generateBulletsTimer.addEventListener(TimerEvent.TIMER, generateBullets);
			bullets = new Vector.<MovieClip>();
			moveBulletsTimer = new Timer(50);
			moveBulletsTimer.addEventListener(TimerEvent.TIMER, moveBullets);
 
			generateBulletsTimer.start();
			moveBulletsTimer.start();
		}
 
		private function generateBullets(e:TimerEvent):void 
		{
			for (var i:int = 0; i < guns.length; ++i)
			{
				if (Math.random() > 0.3)
				{
					var gun:Sprite = guns[i];
					var bullet:MovieClip = new MovieClip();
					var g:Graphics = bullet.graphics;
					g.lineStyle(1);
					g.beginFill(0xFF0000);
					g.drawCircle(0, 0, 5);
					g.endFill();
					var angleInRadians:Number = (gun.rotation + megaGun.rotation) / 180.0 * Math.PI;
					bullet.dx = BULLET_STEP * Math.cos(angleInRadians);
					bullet.dy = BULLET_STEP * Math.sin(angleInRadians);
					bullet.distance = 0;
					bullet.x = megaGun.x;
					bullet.y = megaGun.y;
					addChildAt(bullet, 0);
					bullets.push( bullet );
				}
			}
		}
 
		private function moveBullets(e:TimerEvent):void 
		{
			for (var i:int = 0; i < bullets.length; ++i)
			{
				var bullet:MovieClip = bullets[i];
				bullet.x += bullet.dx;
				bullet.y += bullet.dy;
				bullet.distance += BULLET_STEP;
				if (bullet.distance > MAX_BULLET_DISTANCE)
				{
					removeChild( bullet );
					bullets.splice(i, 1);
				}
			}
		}
 
	}
 
}
Вложения
Тип файла: swf TestProject.swf (2.2 Кб, 90 просмотров)

Старый 06.05.2013, 22:48
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Я не силён в математике, да и запутался я там.
180° это Math.PI в радианах.
1° в радианах это Math.PI / 180.
1 радиан в градусах это 180 / Math.PI
__________________
Reality.getBounds(this);

Старый 08.05.2013, 16:09
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 5  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
Цитата:
Сообщение от Wolsh Посмотреть сообщение
А что, угол поворота дула отличается от угла поворота башни? Так сложно задать снаряду тот же rotation, что и у башни? (ну, если у Вас дуло в башне как-то еще повернуто, прибавить и эту разницу. Если снаряд в своем мувике летит не в ту сторону, в которую смотрят дула внутри мувика башни, то и эту разницу добавить). При чем тут синусы и радианы, не совсем понятно.
Если так сделать, то мувик просто разворачивается, но в полёте наклон не учитывается.
В общем - не работает так.

bav - благодарю.
Это было то, что надо. Благодаря вам заработала первая пушка в игре ))

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

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

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


 


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


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