PDA

Просмотр полной версии : Вращающийся мувик и его "дети"


ndiezel
06.05.2013, 21:50
Всем привет.

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

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

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

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

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

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

Wolsh
06.05.2013, 22:34
А что, угол поворота дула отличается от угла поворота башни? Так сложно задать снаряду тот же rotation, что и у башни? (ну, если у Вас дуло в башне как-то еще повернуто, прибавить и эту разницу. Если снаряд в своем мувике летит не в ту сторону, в которую смотрят дула внутри мувика башни, то и эту разницу добавить). При чем тут синусы и радианы, не совсем понятно.

bav
06.05.2013, 22:45
Вот небольшой пример, посмотрите, что и как.
TestProject.swf

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);
}
}
}

}

}

Wolsh
06.05.2013, 22:48
Я не силён в математике, да и запутался я там.
180° это Math.PI в радианах.
1° в радианах это Math.PI / 180.
1 радиан в градусах это 180 / Math.PI

ndiezel
08.05.2013, 16:09
А что, угол поворота дула отличается от угла поворота башни? Так сложно задать снаряду тот же rotation, что и у башни? (ну, если у Вас дуло в башне как-то еще повернуто, прибавить и эту разницу. Если снаряд в своем мувике летит не в ту сторону, в которую смотрят дула внутри мувика башни, то и эту разницу добавить). При чем тут синусы и радианы, не совсем понятно.
Если так сделать, то мувик просто разворачивается, но в полёте наклон не учитывается.
В общем - не работает так.

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