Форум 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=208193)

PlutDem 15.06.2014 03:16

Сбить машиной конус
 
Вложений: 1
Здравствуйте, предположим, что машина движется и поворачивает с максимальной скоростью, наматывая круги вокруг конуса. Как узнать на сколько нужно сбросить/увеличить скорость, что бы сбить конус. Пока не будем брать в расчет ускорение, так как я и сейчас даже не знаю с какого бока подступиться к проблеме.

Tails 15.06.2014 10:35

А какие данные известны, скорость движения, координаты и угол поворота машины?
Можно сделать таким образом, написать скрипт который находит координаты и радиус круга по которому ездит машинка при заданных параметрах. А далее через цикл подогнать необходимые параметры, для сбития конуса.

Скрипт для нахождения координат и радиуса окружности:
Код AS3:

var posX:Number                        = 100;                // Позиция машинки X
var posY:Number                        = 100;                // Позиция машинки Y
var speed:Number                = 4;                // Скорость машинки
var angle:Number                = 0;                // Текущий угол поворота машинки в радианах
var angularVel:Number        = -0.1;                // Изменение угла машинки за 1 кадр, радианы
 
var radius:Number                = Math.abs((Math.PI * 2) / angularVel * speed) / (Math.PI * 2);
var circleX:Number                = 0;
var circleY:Number                = 0;
if(angularVel > 0){
        circleX                                = posX + Math.cos(angle + Math.PI / 2) * radius;
        circleY                                = posY + Math.sin(angle + Math.PI / 2) * radius;
}else if(angularVel < 0){
        circleX                                = posX + Math.cos(angle - Math.PI / 2) * radius;
        circleY                                = posY + Math.sin(angle - Math.PI / 2) * radius;
}
 
trace("radius", radius);
trace("circleX", circleX);
trace("circleY", circleY);

Дело осталось за малым, напишите цикл, который проведя несколько итерации, подгонит нужные значения. Определить в нём пересечение конуса имея координаты и радиус окружности будет не сложно.
Манипулировать вы можете значениями: скорость, скорость разворота.

PlutDem 15.06.2014 14:22

Цитата:

Сообщение от Tails (Сообщение 1167852)
А какие данные известны, скорость движения, координаты и угол поворота машины?

Да, именно эти данные, но к сожалению подгонять циклом - не вариант, так как дюже затратно. Мне бы формулу какую нибудь. Вообще, меня удивляет столь малое количество информации в интернете по этому вопросу, так как, ИМХО, подобная проблема возникает на начальном этапе в каждой четвертой игре.

Tails 15.06.2014 14:44

Цитата:

Сообщение от PlutDem (Сообщение 1167862)
Вообще, меня удивляет столь малое количество информации в интернете по этому вопросу

Тут нет ничего удивительного, ваша задача состоит из совокупности нескольких, более мелких задач.

Я не говорю что моё решение единственное и идеальное, наверняка можно вывести какую-то формулу, если посидеть и подумать подольше. Я описал вам один из путей возможного решения. Для подгонки нужных значений циклом понадобится от силы 10 итераций. Это абсолютно ничтожная нагрузка для одной машинки. Если-бы вам нужно было найти значения сразу для 300 зомби, вот тогда бы ещё стоило задуматься над производительностью.

Bletraut 15.06.2014 18:21

Циклом это более затратнее, чем формулой, да и точность будет меньше. Но я думаю если у вас будет одна машинка и несколько конусов, то нет вообще смысла об этом задумываться, что у вас там че-то тормозить будет или, что это "очень большая нагрузка".

ZackMercury 15.06.2014 18:39

Странный вы. Вот если бы я делал подобную игру, об оптимизации я бы задумывался в последнюю очередь.
Пусть для начала работает как надо. Пока оно действительно не затормаживает работу - всё в порядке.

Wormhole 15.06.2014 21:13

Пусть m - это изменение угла машинки за кадр, n - ваша частота кадров (к/с). Тогда выводимое на экран изменение скорости будет равно V-mn*((xмашинки - xконуса)2 + (yмашинки - yконуса)2)
Если что, то a2 - это a в квадрате.
Скорость по идее измеряться должна в пикселях в секунду(пиксель/секунда). Может, я ошибаюсь.
Необходимо создать условие для положительного значения выражения выше, при котором будет выводиться + перед изменением скорости (в случае с отрицательным и так будет минус)

PlutDem 11.07.2014 19:03

Я много почерпнул из этого видео http://youtu.be/7YwBNRuBvjw в частности формулу ω = vr Из нее нашел радиус окружности пути. Центр окружности нашел путем поворота вектора скорости на 90 градусов в строну поворота, нормализовал его, умножил на радиус окружности и прибавил позицию ТС. Хоть окружность и отражает проделываемый путь, но почему то она "гуляет" туда-суда.
https://www.youtube.com/watch?v=1p_4...ature=youtu.be
Так и должно быть? Это какая то допустимая погрешность вычислений или просто баг? ТС точно движется по правильной траектории это именно позиция окружности шалит

Nooob 11.07.2014 21:23

Вложений: 2
Всё верно найти радиус окружности, затем посчитать угловую скорость. Позиция шалит скорее всего потому что используешь дисплейные координаты, там точность 0.2 или потому что ты рисуешь окружность после того как посчитал положение машинки.

Код AS3:

var carAngle:Number = (car.rotation - 90) * Math.PI / 180;
var carX:Number    = car.x;
var carY:Number    = car.y;
var coneX:Number    = cone.x;
var coneY:Number    = cone.y;
var v:Number        = 2;
 
stage.addEventListener(MouseEvent.CLICK, onClick);
stage.addEventListener(Event.ENTER_FRAME, onFrame);
 
function onClick (event:MouseEvent):void
{
        coneX = cone.x = stage.mouseX;
        coneY = cone.y = stage.mouseY;
}
 
function onFrame (event:Event):void
{
        var dx:Number = coneX - carX;
        var dy:Number = coneY - carY;
        var f:Number  = Math.sqrt(dx * dx + dy * dy);
 
        if(f >= v)
        {
                var d:Number  = carAngle - Math.PI / 2;
                var r:Number  = f / 2 / Math.cos(d - Math.atan2(dy, dx));
 
                graphics.clear();
                graphics.lineStyle(1);
                graphics.drawCircle(car.x + r * Math.cos(d), car.y + r * Math.sin(d), r);
 
                carAngle -= v / r;
                car.x = carX += v * Math.cos(carAngle);
                car.y = carY += v * Math.sin(carAngle);
                car.rotation = carAngle * 180 / Math.PI + 90;
        }
}

car.swf   (1.1 Кб)

LifeIsRhythm 11.07.2014 22:42

Цитата:

Так и должно быть? Это какая то допустимая погрешность вычислений или просто баг?
Это особенность флешевых вычислений. Если Вы будете крутить вокруг произвольной точки объект,
то рано или поздно произойдет то, что на видео. И чем больше скорость вращения, тем быстрее будет ЭТО.
Решение - постоянно пересчитывать.

Добавлено через 4 минуты
И ещё первым делом, при работе с вращением, нужно откинуть все понятия "динамичности".
Точка сместилась, рассчитал радиус, сохранил и на его основе всегда пересчитываешь.
А если радиус после каждого витка рассчитывать, то вот такой слет с орбиты и будет.


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

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