Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.06.2014, 03:16
PlutDem вне форума Посмотреть профиль Отправить личное сообщение для PlutDem Найти все сообщения от PlutDem
  № 1  
Ответить с цитированием
PlutDem
 
Аватар для PlutDem

Регистрация: Feb 2012
Сообщений: 212
По умолчанию Сбить машиной конус

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

Старый 15.06.2014, 10:35
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
А какие данные известны, скорость движения, координаты и угол поворота машины?
Можно сделать таким образом, написать скрипт который находит координаты и радиус круга по которому ездит машинка при заданных параметрах. А далее через цикл подогнать необходимые параметры, для сбития конуса.

Скрипт для нахождения координат и радиуса окружности:
Код 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);
Дело осталось за малым, напишите цикл, который проведя несколько итерации, подгонит нужные значения. Определить в нём пересечение конуса имея координаты и радиус окружности будет не сложно.
Манипулировать вы можете значениями: скорость, скорость разворота.
__________________
Дети не должны знать о своих родителях

Старый 15.06.2014, 14:22
PlutDem вне форума Посмотреть профиль Отправить личное сообщение для PlutDem Найти все сообщения от PlutDem
  № 3  
Ответить с цитированием
PlutDem
 
Аватар для PlutDem

Регистрация: Feb 2012
Сообщений: 212
Цитата:
Сообщение от Tails Посмотреть сообщение
А какие данные известны, скорость движения, координаты и угол поворота машины?
Да, именно эти данные, но к сожалению подгонять циклом - не вариант, так как дюже затратно. Мне бы формулу какую нибудь. Вообще, меня удивляет столь малое количество информации в интернете по этому вопросу, так как, ИМХО, подобная проблема возникает на начальном этапе в каждой четвертой игре.

Старый 15.06.2014, 14:44
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от PlutDem Посмотреть сообщение
Вообще, меня удивляет столь малое количество информации в интернете по этому вопросу
Тут нет ничего удивительного, ваша задача состоит из совокупности нескольких, более мелких задач.

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

Старый 15.06.2014, 18:21
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 5  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Циклом это более затратнее, чем формулой, да и точность будет меньше. Но я думаю если у вас будет одна машинка и несколько конусов, то нет вообще смысла об этом задумываться, что у вас там че-то тормозить будет или, что это "очень большая нагрузка".
__________________
Я заклинаю вас действовать иначе.

Старый 15.06.2014, 18:39
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Странный вы. Вот если бы я делал подобную игру, об оптимизации я бы задумывался в последнюю очередь.
Пусть для начала работает как надо. Пока оно действительно не затормаживает работу - всё в порядке.
__________________
There is no thing in this world that is not simple.

Старый 15.06.2014, 21:13
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 7  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

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


Последний раз редактировалось Wormhole; 16.06.2014 в 13:30.
Старый 11.07.2014, 19:03
PlutDem вне форума Посмотреть профиль Отправить личное сообщение для PlutDem Найти все сообщения от PlutDem
  № 8  
Ответить с цитированием
PlutDem
 
Аватар для PlutDem

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

Старый 11.07.2014, 21:23
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 9  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Всё верно найти радиус окружности, затем посчитать угловую скорость. Позиция шалит скорее всего потому что используешь дисплейные координаты, там точность 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 Кб)
Вложения
Тип файла: swf car.swf (1.1 Кб, 106 просмотров)


Последний раз редактировалось Nooob; 11.07.2014 в 21:52.
Старый 11.07.2014, 22:42
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 10  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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