Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   физика самолетика (http://www.flasher.ru/forum/showthread.php?t=150156)

Vansimar 07.02.2011 13:25

физика самолетика
 
люди,делаю 2д самолетную леталку стрелялку,хочу получше написать физику взлетов,падений ускорений,не могли бы дать ссылки по этому вопросу?или подсказать как лучше это реализовать?

cleptoman 07.02.2011 13:28

Цитата:

физику взлетов,падений ускорений
дык ответ в вопросе )

читаем физику, пробуем, пишем здесь что не получилось.. тут как-то так и живут )

Vansimar 07.02.2011 13:52

ну так то я написал,он у меня летает,и ускоряется и замедляется,но я хочу сделать чтоб он если летит к земле то летел быстрей,если летит наверх томедленней,взлетал более плавно

Tails 07.02.2011 14:23

манипулируйте значением
Код AS3:

_x += speed;
_y += speed;

Как ? учебник геометрий вам подскажет.

samana 07.02.2011 14:24

Всё зависит от того, как вы сделали ускорение и замедление. Вы сделали для самолёта гравитацию?

Fillini 07.02.2011 14:34

физика 7 класса, вам в помощь. Там было что то про ускорение свободного падения (9,81) и синус угла.

Vansimar 07.02.2011 15:06

гравитация есть,она постоянное значение,но когда летишь ровно по х то он падает

Tails 07.02.2011 15:07

Добавь условие, чтоб падал только когда скорость самолёта слишком маленькая.

cleptoman 07.02.2011 15:12

2 закон Ньютона, если не ошибаюсь.
находите суммарную силу всех приложенных сил..если она меньше нуля - самолетик падает, если больше - взлетает. из силы вычисляем ускорение (я навскидку..по формулам не помню, и вообще, можно ли). ускорение применяем в своем вычислении скорости, высоты и т.д.

alatar 07.02.2011 15:12

Цитата:

гравитация есть,она постоянное значение,но когда летишь ровно по х то он падает
Подъемную силу забыли ввести.

Vansimar 07.02.2011 15:14

ну тогда если включать ее когда скорость маленькая то он будет летать вверх без замедления и вниз без ускорения

cleptoman 07.02.2011 15:17

когда все силы уравняются, то самолет будет в покое или двигаться с неизменной скоростью..как то так.

alatar 07.02.2011 15:17

Цитата:

ну тогда если включать ее когда скорость маленькая то он будет летать вверх без замедления и вниз без ускорения
Подъемная сила, в упрощенном случае, будет функцией от скорости. И направлена всегда перпендикулярно крыльям. Плюс, для реализма, можно добавить сопротивление воздуха (будет меняться от угла атаки), которое будет влиять на горизонтальную скорость.

Добавлено через 3 минуты
http://physel.ru/mainmenu-4/eainmenu-15/197-s-192-.html

Добавлено через 4 минуты
http://kurs3.as-club.ru/aero/html/kurs_1197_0.html

Vansimar 07.02.2011 15:22

ну а если проще сделать,допустим сделать такое условие,если самолет летит по оси х то гравитацию отключать?

alatar 07.02.2011 15:24

Цитата:

допустим сделать такое условие,если самолет летит по оси х то гравитацию отключать?
При подъеме или опускании он тоже, как бы, летит по оси x.

Vansimar 07.02.2011 15:33

блин,я имел ввиду чтоесли координата по х не меняется

samana 07.02.2011 15:36

Цитата:

Сообщение от Vansimar (Сообщение 971217)
блин,я имел ввиду чтоесли координата по х не меняется

Тогда ещё проще! Вам нужно только добавлять силу подъёма к гравитации. Но скорость по "x" всё же придётся делать, ведь я думаю фон будет и он должен двигаться.

cleptoman 07.02.2011 15:36

вертикальный взлет? )

alatar 07.02.2011 15:42

В упрощенной схеме у вас получится четыре вектора:
1. Тяга двигателя. Направлен вперед по оси самолета. Управляется пользователем.
2. Сила тяжести. Постоянный вектор. Всегда напрален вниз.
3. Сопротивление воздуха. Зависит от угла поворота.
4. Подъемная сила. Всегда направлена вверх. Зависит от угла поворота.

Сумма векторов дает скорость горизонтального и вертикального полета.

Vansimar 07.02.2011 15:43

а еще хотел спросить, у меня управление в 3 кнопки ,газ разворот влево и вправо,когда жмешь влево ,он св-во .rotation меняет,но он поворачивает относительно своего центра,это выглядит ужасно,и также если вправо жмешь,как сделатьчтоб он разворачивался не относительно центра?

Добавлено через 2 минуты
и еще как реализовать поъемную силу?

bav 07.02.2011 16:31

Цитата:

как сделатьчтоб он разворачивался не относительно центра?
Измените положение точки регистрации клипа.

Vansimar 07.02.2011 17:08

а как это сделать лучше?

derhab 07.02.2011 18:04

самолетик у вас в контейнере?
тогда сдвиньте его внутри контейнера так чтобы нулевые координаты в контейнере совпадали с нужной вам точкой на самолетике...

Vansimar 07.02.2011 18:53

ну допустим, тогда в одну сторну он будет поворачиваться хорошо, а в другую хрен знает как!фигня получиться!

alatar 07.02.2011 18:56

Упрощенная трехвекторная физика для самолета. Код примерный и нуждается в дополнительной настройке и призван просто показать суть метода. Для просторы наблюдения самолет фиксирован по оси х.
Код 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;
            }
        }
    }
}


samana 07.02.2011 18:58

alatar не выдержал )

alatar 07.02.2011 19:07

Цитата:

Сообщение от samana (Сообщение 971286)
alatar не выдержал )

Так нагляднее :)

Vansimar 07.02.2011 19:27

у меня что то не получается его запустить(

alatar 07.02.2011 19:33

Так и думал, что следующим вопросом будет как это скомпилировать.
Судя по-всему вы компилируете в Flash Professional CSx.
Создайте новый документ, создайте рядом с ним текстовый файл airplane.as. Скопируйте код в airplane.as. Подключите airplane.as как documentClass к вашему документу.

Vansimar 07.02.2011 19:53

как домой приеду выложу свой исходник кода,посмотрите что да как дописать

derhab 07.02.2011 21:05

Цитата:

Сообщение от Vansimar (Сообщение 971282)
ну допустим, тогда в одну сторну он будет поворачиваться хорошо, а в другую хрен знает как!фигня получиться!

не понял.. отцентруйте

Vansimar 07.02.2011 21:28

Код AS3:

var plane1:plane=new plane();
plane1.x=50;
plane1.y=50;
addChild(plane1);//Добавление самолета на сцену
var up:Boolean=false;
var left:Boolean=false;//флаги
var right:Boolean=false;
//38 - газ  37 - влево  39 - вправо
var X:Number;
var gravNum:Number=0;
var gravity:Number=2;
var power:Number=0.2;
var friction:Number=0.95;
var speed:Number=0;
var gradus:Number=0;
var radian:Number;//определение переменных
var gradusRot:Number=4;
var speedX:Number;
var speedY:Number;
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);//слушатели событий на нажатие кнопки
stage.addEventListener(KeyboardEvent.KEY_UP, key_up);//слушатели событий на отпускание кнопки
 
function key_down(e:KeyboardEvent):void {
        if (e.keyCode==38) {
                up=true;
        }
        if (e.keyCode==37) {
                left=true;
        }
        if (e.keyCode==39) {
                right=true;
        }
 
}
function key_up(e:KeyboardEvent):void {
        if (e.keyCode==38) {
                up=false;
        }
        if (e.keyCode==37) {
                left=false;
        }
        if (e.keyCode==39) {
                right=false;
        }
}
 
 
stage.addEventListener(Event.ENTER_FRAME, moves);
 
 
 
function moves(e:Event):void {
        X=plane1.x;
        if (plane1.x==X) {
                gravity=0;
        }
        if (up) {
                plane1.gotoAndPlay(2);
 
                if (speed<5) {
                        speed+=power;
                }
                /*if (gravity>0) {
                gravity-=gravNum;
                }
                gravNum=0.04;*/

 
        }
        if (up==false) {
                plane1.gotoAndPlay(1);
                if (speed>0) {
                        speed-=power;
                }
 
        }
 
        if (left) {
                gradus-=gradusRot;
 
        }
        if (right) {
                gradus+=gradusRot;
        }
 
        radian= (gradus* Math.PI)/180;
        speedX=speed*Math.cos(radian);
        speedY=speed*Math.sin(radian);
        plane1.rotation=gradus;
        plane1.y+=gravity;
        plane1.x+=speedX;
        plane1.y+=speedY;
 
 
        if (plane1.x>551) {
                plane1.x=0;
        }
        if (plane1.x<0) {
                plane1.x=550;
        }
        if (plane1.y>401) {
                plane1.y=0;
        }
        if (plane1.y<0) {
                plane1.y=400;
        }
 
}

Добавлено через 7 минут
ну вот собственно и код мой

Добавлено через 9 минут
Цитата:

Сообщение от derhab (Сообщение 971327)
не понял.. отцентруйте


ну в смысле он будет влево вращаться по одной окружности а вправо по другой окружности

Vektor 07.02.2011 21:37

Цитата:

Сообщение от Vansimar (Сообщение 971282)
ну допустим, тогда в одну сторну он будет поворачиваться хорошо, а в другую хрен знает как!фигня получиться!

Центрировать клип нужно в хвосте самолета.

Рулевой механизм у самолета, вертолета и корабля находятся в задней части.

derhab 07.02.2011 22:23

Цитата:

ну в смысле он будет влево вращаться по одной окружности а вправо по другой окружности
разобрались уже?

alatar 07.02.2011 22:31

Код AS3:

X=plane1.x;
if (plane1.x==X) {
        gravity=0;
}

Vansimar, вас тут ничего не смущает?

Vansimar 07.02.2011 22:43

Цитата:

Сообщение от alatar (Сообщение 971358)
Код AS3:

X=plane1.x;
if (plane1.x==X) {
        gravity=0;
}

Vansimar, вас тут ничего не смущает?

блин и правда какую то хрень написал, я хотел тут написать, что если самолет летит по оси х то гравитацию на 0 ,а получилась ересь,только щас понял((а как переделать лучше?

Добавлено через 2 минуты
Цитата:

Сообщение от derhab (Сообщение 971357)
разобрались уже?

с этим уже разобрался)спасибо)

alatar 07.02.2011 22:50

Код AS3:

if (plane1.rotation == 0)
{
    gravity = 0;
}

Как-то так.

Добавлено через 2 минуты
И вот это еще перл:
Код AS3:

if (up==false)

Про else забыли? В любом случае, если вам надо проверить переменную на false и перед этим вы не проверяете на true, пишите:
Код AS3:

if (!up)


Vansimar 07.02.2011 23:02

и вобще,скажите пожалуйста,стоит ли мне дорабатывать свой код,или стоит делать по вашему примеру?

alatar 07.02.2011 23:14

Ну тут уж дело ваше.

Vansimar 08.02.2011 22:54

а как написать скроллинг ,чтоб он следил за перемещением самолета?


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

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