![]() |
|
||||||||||
|
|||||
|
Всем привет.
Есть мувик, который крутится при каждом EnterFrame. Это пушка у космического корабля. У этой пушки - четыре дула. Из каждого где-то раз в пару секунд должен вылетать снаряд. Вопрос - как это сделать? Сложность именно в градусе поворота каждого дула. Первый вариант, который я попробовал был прост и он даже, типа сработал - просто аттачить мувики снарядов к мувику пушки. rotate у них уже будет задан, угол просчитывать не надо и движение простое +1 к x или y. Заработало на ура, вылетало откуда надо, летело под тем углом, что был в момент выстрела, но, поскольку мувик с пушкой продолжал крутиться - снаряды крутились вместе с ним. Отказался. Потом пробовал посчитать угол, как-то там его передать в функцию движения снаряда и прилепить уже под нужным углом. Не получилось. Я не силён в математике, да и запутался я там. Вроде как rotation указывается в градусах, а sin и cos считаются в радианах... Сейчас попробовал это сделать ещё раз - всё равно не получилось. Потом пробовал прилепить мувик к пушке и цепять снаряды на него. И как прицеплю - каким-то образом его отцеплять. Но и снаряды летели не оттуда и как "перецепить" мувик не придумал. В общем - подскажите кто решал подобные задачи, как можно сделать ещё или если у кого есть - поделитесь рабочим примером из мною перечисленных. Заранее спасибо. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А что, угол поворота дула отличается от угла поворота башни? Так сложно задать снаряду тот же rotation, что и у башни? (ну, если у Вас дуло в башне как-то еще повернуто, прибавить и эту разницу. Если снаряд в своем мувике летит не в ту сторону, в которую смотрят дула внутри мувика башни, то и эту разницу добавить). При чем тут синусы и радианы, не совсем понятно.
__________________
Reality.getBounds(this); |
|
|||||
|
Вот небольшой пример, посмотрите, что и как.
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); } } } } } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
1° в радианах это Math.PI / 180. 1 радиан в градусах это 180 / Math.PI
__________________
Reality.getBounds(this); |
|
|||||
|
Цитата:
В общем - не работает так. bav - благодарю. Это было то, что надо. Благодаря вам заработала первая пушка в игре )) |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:10. |
|
|
« Предыдущая тема | Следующая тема » |
|
|