Показать сообщение отдельно
Старый 07.02.2011, 18:56
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 25  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Упрощенная трехвекторная физика для самолета. Код примерный и нуждается в дополнительной настройке и призван просто показать суть метода. Для просторы наблюдения самолет фиксирован по оси х.
Код AS3:
package
{
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.geom.Point;
    import flash.ui.Keyboard;
 
    [SWF(width="640", height="480")]
 
    public class airplane extends Sprite
    {
        private static const TO_RADIAN:Number = Math.PI / 180;
 
        //тяга двигателя
        private var propellingForce:Point;
        //гравитация
        private var gravitation:Point;
        //подъемная сила
        private var lift:Point;
        //суммарный вектор
        private var force:Point;
 
 
 
        private var upFlag:Boolean = false;
        private var downFlag:Boolean = false;
        private var leftFlag:Boolean = false;
        private var rightFlag:Boolean = false;
 
        //самолет
        private var plane:Sprite;
 
        //рисунок самолета
        private var planeGraphics:Sprite;
 
        //отображение векторов
        private var vectorsGraphics:Sprite;
 
 
        public function airplane()
        {
            //начальная скорость 10
            propellingForce = new Point(10, 0);
 
            //сила гравитации 10
            gravitation = new Point(0, 10);
 
            plane = new Sprite();
            plane.x = 30
            plane.y = stage.stageHeight * .5;
 
            planeGraphics = new Sprite();
            drawPlane(planeGraphics.graphics);
            plane.addChild(planeGraphics);
 
            vectorsGraphics = new Sprite();
            plane.addChild(vectorsGraphics);
 
            addChild(plane);
 
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardHandler);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyboardHandler);
        }
 
        private function drawPlane(gr:Graphics):void
        {
            gr.beginFill(0x694246);
            gr.drawRect(0, 0, 30, 10);
            gr.endFill();
        }
 
        private function enterFrameHandler(event:Event):void
        {
            if (upFlag)
            {
                planeGraphics.rotation -=2;
            }
            if (downFlag)
            {
                planeGraphics.rotation +=2;
            }
            if (rightFlag)
            {
                propellingForce.normalize(propellingForce.length * 1.02);
            }
            if (leftFlag)
            {
                propellingForce.normalize(propellingForce.length * 0.98);
            }
 
            //поворачиваем вектор тяги по оси самолета
            propellingForce = Point.polar(propellingForce.length, planeGraphics.rotation * TO_RADIAN);
 
            /*поворачиваем вектор подъемной силы перпендикулярно оси самолета,
              длина вектора является проекцией тяги на ось x (такое вот нехилое упрощение)
            */
            lift = Point.polar(propellingForce.x, planeGraphics.rotation * TO_RADIAN - Math.PI * .5);
 
            //считаем суммарный вектор
            force = propellingForce.add(gravitation).add(lift);
 
            plane.y += force.y;
 
            //раскомментировать для полета
            //plane.x += force.x;
 
            drawVectors();
        }
 
        private function drawVectors():void
        {
            var gr:Graphics = vectorsGraphics.graphics;
 
            gr.clear();
 
            var liftPos:Point = vectorsGraphics.globalToLocal(lift);
            var gravitationPos:Point = vectorsGraphics.globalToLocal(gravitation);
            var propellingPos:Point = vectorsGraphics.globalToLocal(propellingForce);
            var forcePos:Point = vectorsGraphics.globalToLocal(force);
 
 
            //подъемная сила
            gr.lineStyle(1, 0xFF0000);
            gr.lineTo(lift.x, lift.y);
            gr.moveTo(0,0);
            gr.lineStyle(1, 0x00FF00);
            gr.lineTo(gravitation.x, gravitation.y);
            gr.moveTo(0,0);
            gr.lineStyle(1, 0x0000FF);
            gr.lineTo(propellingForce.x, propellingForce.y);
            gr.moveTo(0,0);
            gr.lineStyle(2, 0xFFFF00);
            gr.lineTo(force.x, force.y);
        }
 
        private function keyboardHandler(event:KeyboardEvent):void
        {
            var value:Boolean = event.type == KeyboardEvent.KEY_DOWN;
 
            switch (event.keyCode)
            {
                case Keyboard.UP:
                    upFlag = value;
                    break;
                case Keyboard.DOWN:
                    downFlag = value;
                    break;
                case Keyboard.LEFT:
                    leftFlag = value;
                    break;
                case Keyboard.RIGHT:
                    rightFlag = value;
                    break;
            }
        }
    }
}