Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.02.2011, 22:14
Новичок

Отправить личное сообщение для Minorko Посмотреть профиль Найти все сообщения от Minorko
 
Регистрация: 15.02.2011
Сообщений: 5

Ищу алгоритм к игре Zuma
Здравствуйте, пытаюсь написать клон игры Зума(кто не знает по центру жаба плюет шарики, а из норы толпа таких же шариков движутся по опр траектории к идолу, который пытаются разрушить, а этого надо не допустить) Так вот, ищу алгоритм движения шариков. Как заставить всю эту цепочку двигаться по опр траектории? Я думал о том, что шарики не должны знать куда им двигаться, они всегда движутся вперед(согласно своему представлению), а угол поворота пусть задается дорожкой(но опять-же в виде чего её представить?). Следующие же шарики могли бы просто повторять траекторию предыдущего(но как тогда решить проблему когда мы попадаем жабьим шариков в одноцветные на полосе, тогда ведь эти шары исчезают, соотв и никакой траектории быть не может). Может у кого есть идеи?
  #2  
Старый 16.02.2011, 20:07
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

Наглядным будет представить путь в виде кривой Безье, на руку то, что можно рассчитать положение шара в любой момент времени, не высчитывая предыдущие. Остается расставить контрольные точки так, чтобы шары катились равномерно и не отставали / не налезали на друг-друга.
  #3  
Старый 17.02.2011, 00:58
Новичок

Отправить личное сообщение для Minorko Посмотреть профиль Найти все сообщения от Minorko
 
Регистрация: 15.02.2011
Сообщений: 5

А не подскажете формулу для вычисления координат х и у в момент времени ? Как я понял время изменяется от 0 до 1 всегда? А шаг мы тогда выбираем относительно размера экрана, т.е 1/x где х-большая сторона.
  #4  
Старый 17.02.2011, 12:07
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

Прошу прощения, я забыл добавить ссылку
http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D0%91%D0%B5% D0%B7%D1%8C%D0%B5
Тут скорее не время, а "на сколько прошел весь путь"; 0 - в самом начале, 0,5 - половина, 1 - завершил путь.

Для выбора шага можно прикинуть, сколько времени должен шарик тратить на весь путь, а потом просто увеличивать путь на время прошедшее с предыдущей отрисовки экрана, деленное на вот это самое время полного пути.
  #5  
Старый 17.02.2011, 12:58
Новичок

Отправить личное сообщение для Minorko Посмотреть профиль Найти все сообщения от Minorko
 
Регистрация: 15.02.2011
Сообщений: 5

Спасибо, разобрался:
Код:
    private int x0=10,y0=10,x1=50,y1=400,x2=600,y2=450,x3=700,y3=50;
    private float t = 0;
    private float h = (float) 0.001;
Затем просто в нужный цикл вставляем:
Код:
        if (t<1){
            mPoint.x = (float) (Math.pow((1-t),3)*x0+3*t*Math.pow((1-t),2)*x1+3*Math.pow(t,2)*(1-t)*x2+Math.pow(t,3)*x3);
            mPoint.y = (float) (Math.pow((1-t),3)*y0+3*t*Math.pow((1-t),2)*y1+3*Math.pow(t,2)*(1-t)*y2+Math.pow(t,3)*y3);
            t+=h;
        }
  #6  
Старый 17.02.2011, 20:21
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

Советую посмотреть в сторону этого кода. Тут, правда, я порчу исходный массив, но ты ведь и копию можешь сделать. Результат оказывается первым элементом массива.

Код:
public struct FloatPoint
{
    public float x, y;
}

FloatPoint pts[] = { { 10, 10 }, { 50, 400 }, { 600, 450 }, { 700, 50 } };
float t;

for( int j = ptr.Length - 1; j; j-- )
{
	for( int i = 0; i < 3; i++ )
	{
		pts[ i ].x = t * pts[ i + 1 ].x + ( 1 - t ) * pts[ i ].x;
		pts[ i ].y = t * pts[ i + 1 ].y + ( 1 - t ) * pts[ i ].y;
	}
}
  #7  
Старый 18.02.2011, 22:50
Новичок

Отправить личное сообщение для Minorko Посмотреть профиль Найти все сообщения от Minorko
 
Регистрация: 15.02.2011
Сообщений: 5

Возникла некоторая проблема: в разных участках пути элементы движутся с разной скоростью, хотя шаг 1 и тот-же, это нормально?
Прошу прощения, моя вина, не запомнил что размер не в пикселях измеряется а в dpi =)

Последний раз редактировалось Minorko, 18.02.2011 в 23:27.
  #8  
Старый 19.02.2011, 11:27
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

Бог с ними, с пикселями, скорость меняется как раз от того, что при равномерно растущем времени скорость отличается, можно это сделать фишкой игры, а можно стараться угадать расположение точек x0, y0, x1, y1 ... . dpi - dots per inch, сколько нужно точек, чтобы заполнить один дюйм (2,54 сантиметра, в ширину или в высоту, всё равно). Так что, продолжай мерять в пикселях, это ок.
  #9  
Старый 22.02.2011, 19:41
Новичок

Отправить личное сообщение для Minorko Посмотреть профиль Найти все сообщения от Minorko
 
Регистрация: 15.02.2011
Сообщений: 5

А нет ли где готовых точек для построения различных путей? Запарился уже спираль изображать
  #10  
Старый 22.02.2011, 20:20
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

Советую, набросать построение в excel / calc и править динамически, плюс можно ограничить степень и строить только по трем-четырем точкам, внахлест. То есть кусок по точкам 1, 2, 3, 4 кусок по точкам 3, 4, 5, 6, еще один по 5, 6, 7, 8... Правда, тут сложнее будет считать t.
Подбирать точки стоит того, ты вносишь в проект самобытность и уникальность.
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
физика в игре. незарегистрированный Математические алгоритмы 3 05.04.2008 14:20
Проверка на существование/отсутствие предыдущего поколение в игре "Жизнь" гость Сортировка и поиск 0 02.12.2007 00:31