Дата: Вторник, 02.03.2010, 23:53 | Сообщение # 161
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Оке, оке, Благодарю! А как лучше строить? Каждая кривая в одной клетке? Похоже я чего-то не понимаю, но подсознательно думаю, что это не так. И ещё один момент, я может что-то прослушал и не понял, как их в редактор сам задавать?
Fast, like fire!
Сообщение отредактировал Bercut - Среда, 03.03.2010, 00:06
Похоже я чего-то не понимаю, но подсознательно думаю, что это не так.
Правильно думаешь, не так. Вот на твою картинку достаточно 4-5 кривых 4 степени. А ты опять предлагаешь наплодить под сотню.
Quote (Bercut)
И ещё один момент, я может что-то прослушал и не понял, как их в редактор сам задавать?
Кривая Безье строится по точкам. Кривая 3 степени имеет 3 вершины, 4 степени 4 вершины и т.д. Тебе нужно разместить только эти точки, остальное построится само. Потом только, зная Х персонажа и расположение точек кривой, по уравнению находим У. Profit!
Добавлено (03.03.2010, 01:05) --------------------------------------------- Просто открой любой векторный редактор, да попробуй нарисовать кривую по картинке. Обычно они называются path (пути), но может и bezier-curves.
Правильно думаешь, не так. Вот на твою картинку достаточно 4-5 кривых 4 степени. А ты опять предлагаешь наплодить под сотню.
Отличненько, знал, что есть не такое громозкое решение.
Quote (Ang3L)
Кривая Безье строится по точкам. Кривая 3 степени имеет 3 вершины, 4 степени 4 вершины и т.д.
Понял, тогда я сделаю так, допустим подгрузили картинку, и теперь нам вдруг захотелось построить кривую, выбираем когого порядка она будет, жмакаем на экран, и потом издеваемся над ней, механизм нахождения кривой в определённой клетке как-нибудь придумаю.
Quote (Ang3L)
Потом только, зная Х персонажа и расположение точек кривой, по уравнению находим У. Profit!
Рисуем карту. Делаем кривую безье (поверхность по которой будет ходить персонаж) по этой карте. Находим высоту персонажа.
т.е. персонаж будет ходить не по картинке как ты задумывал в начале, а по заранее построенной линией. Можно прямыми, как ты уже сделал, а можно кривыми, как предстоит сделать. Это решает проблему с производительностью. Кстати, если найти Y пола, то при падений рассчитывать положение персонажа можно как y = max(floor_y, y); , тогда он никогда не будет проваливаться и не надо никаких коллизий. Это будет работать с 1 "этажом", с более надо думать...
Ну я сразу сообразил, правда сначала ну врубился как строить эти кривые, немного пошаманил и оно заработало.
Добавлено (03.03.2010, 04:24) --------------------------------------------- Немного пошаманил, и оно получилось, точнее построение безье третьего порядка. На это не стоит обращать внимание, ну всё равно, подтверждение тому: Link 10кб
Fast, like fire!
Сообщение отредактировал Bercut - Среда, 03.03.2010, 04:42
Дата: Вторник, 09.03.2010, 06:49 | Сообщение # 169
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Ну ты не о этом, как объяснить, например рассмотрим такой случай: В этом случае персонаж будет бегать гораздо быстрее слева, чем справа, хотя логично, если бежать с горки, то так быстрее.
Дата: Четверг, 22.07.2010, 15:31 | Сообщение # 171
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Трям! Доброго дня всем! Наконец-то проснулся, там сессия и бла-бла-бла, теперь третий курс ждёт. Так вот в тот раз мы остановились на линиях, для того чтобы делать практически любые поверхности, а не складывать из уже созданых блоков, работающих по заранее задным законам, как это было у Дрима. Ну то есть, для каждой клетке координаты меняют своё положение (y = f(x)), будь то передвижение по дуге, хоть под углом и т.д. Так вот у меня практически тоже самое, но всё такое чудо состоит из линий, и эти линии могут лежать в клетках, так вот, так как размах велик, то есть вопрос. Если клетки небольшого размера (36 х 36), то можно спокойно разместить все эти линии таким образом, что в одной клетке будет хранится одна прямая, но не всегда, возможно, что будет переход. А можно и увеличить клетки, тогда в одной клетки будет больше линий, но количество самих ячеек уменьшится. От сюда следует, что надо делать сложную структуру данных, то есть каждая клетка сетки хранит список прямых. Как это скажется на производительности, и как лучше хранить списки? Просто допустим на Си можно было храниить указатель на первый элемент в списке.
Дата: Пятница, 06.08.2010, 02:35 | Сообщение # 173
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Как сделать зум? Я конечно понимаю, что можно взять несколько суфров и их растягивать, но как же быть с проверками координат (там же всё уменьшается или увеличивается)?
Дата: Пятница, 06.08.2010, 07:38 | Сообщение # 174
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
все проверки так и останутся в 1:1, просто ты приблизишь отрисованный сурф. Конечно если ты при этом хочешь тыкать мышой в экран, то может проще через изменение размера вида?
Дата: Пятница, 06.08.2010, 12:44 | Сообщение # 175
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Да дело в том, что у меня есть рабочая область и меню с кнопочками В этом случае задавать два вида?
И ещё один вопросик =-) Рыскал рыскал на просторах интернета один алгоритм, короче надо чтобы (желательно эффективно) искались номера прямых, которые лежат в той или иной клетки. То есть существует сетка, размер каждой клетки 64Х64. Имеется список прямых, мы знаем их порядковые номера и принадлежность к тому или иному объекту. Короче я сделал массив списков, который равен размеру всего поля. Нужно, чтобы туда правильно записывались номера прямых и т.д., потому что встречаются разные случаи, мб вы с таким сталкивались и находили подобные алгоритмы. Если же нет, то какие возможны идеи? Писать за меня что-то и так далее не надо, не хотелось бы вас отвлекать по пустякам. Заранее спасибо!
Fast, like fire!
Сообщение отредактировал Bercut - Пятница, 06.08.2010, 12:55
Дата: Пятница, 06.08.2010, 13:21 | Сообщение # 177
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Тут всё видно =-)
З.Ы.: Вопрос отпал, но всё-таки актуален. Я же сделал так:
number_of_line = 0; for (i = 0; i < ds_list_size (oNewPolygon.Lines) - 3; i += 4) { x1 = ds_list_find_value (oNewPolygon.Lines, i); y1 = ds_list_find_value (oNewPolygon.Lines, i + 1); x2 = ds_list_find_value (oNewPolygon.Lines, i + 2); y2 = ds_list_find_value (oNewPolygon.Lines, i + 3); number_of_line = i div 4; if (x1 > x2) { t = x1; x1 = x2; x2 = t; } point_x_line = round(x1 div 64); point_y_line = round (y1 div 64); _ind = point_x_line*24 + point_y_line; ds_list_add(oSystemSurf.lines[_ind], oNewPolygon.id); ds_list_add(oSystemSurf.lines[_ind], number_of_line); point_x_line = round(x2 div 64); point_y_line = round (y2 div 64); _ind = point_x_line*24 + point_y_line; ds_list_add(oSystemSurf.lines[_ind], oNewPolygon.id); ds_list_add(oSystemSurf.lines[_ind], number_of_line); point_x1_line = (round(x1 div 64) + 1)*64 + 1; point_x2_line = (round(x2 div 64) - 1)*64 + 1; for (current_x = point_x1_line; current_x <= point_x2_line; current_x += 64) {
a = x2 - x1; b = 0; c = current_x - x1; d = y2 - y1; e = d; f = 0; det = (a * e) - (b*d); dt = (c * e) - (f * b); ds = (a * f) - (c * d); t = (dt / det); s = (ds / det); if ((0 <= s) && (s <= 1) && (0 <= t) && (t <= 1)) { current_x1 = (x1 * (1-t)) + (x2 * t); current_y1 = (y1 * (1-t)) + (y2 * t); point_x_line = round(current_x1 div 64); point_y_line = round (current_y1 div 64); _ind = point_x_line * 24 + point_y_line; ds_list_add(oSystemSurf.lines[_ind], oNewPolygon.id); ds_list_add(oSystemSurf.lines[_ind], number_of_line); } } if (y1 > y2) { t = y1; y1 = y2; y2 = t; } point_y1_line = (round(y1 div 64) + 1)*64 + 1; point_y2_line = (round(y2 div 64) - 1)*64 + 1; for (current_y = point_y1_line; current_y <= point_y2_line; current_y += 64) {
a = x2 - x1; b = a; c = 0; d = y2 - y1; e = 0; f = current_y - y1; det = a * e - b * d; dt = c * e - f * b; ds = a * f - c * d; t = dt / det; s = ds / det; if ((0 <= s) && (s <= 1) && (0 <= t) && (t <= 1)) { current_x1 = x1*(1-t)+x2*t; current_y1 = y1*(1-t)+y2*t; point_x_line = round(current_x1 div 64); point_y_line = round (current_y1 div 64); _ind = point_x_line * 24 + point_y_line; ds_list_add(oSystemSurf.lines[_ind], oNewPolygon.id); ds_list_add(oSystemSurf.lines[_ind], number_of_line); } } }
Код мб вам будет неочень понятен, но попытаю объяснить, рассматриваем множ-во прямых, которые лежат на сетке, для каждой прямой сначала записываем какие точки начала и конца отрезка, а потом находим точки пересечения с линиями сетки ( в ограниченном пространстве), вроде много не хапает (у меня постоянный 100 фпс и загрузка проца 4-6%, оччень радует посравнению с прошлой версой, где всё хапапло 50%!. Если есть ещё более быстрые варианты, то предлагайте. Собственно, если интересно, то вот можете ознакомится(код сороват конечно -_-):
Дата: Суббота, 07.08.2010, 14:57 | Сообщение # 179
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
А как сделалать изменяющаяся строку, ну допустим выделение переметров мышью (ну как в чате, однострочная штука), просто прописывать не хочется, мб есть где-то библиотека? Вообще ща посмотрюб пример чата -_-
Дата: Суббота, 04.09.2010, 13:24 | Сообщение # 180
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Наконец-то сделал отладочный пример. Его конечно можно подуменьшить, но мне это не особо надо это делать. Решил добавить ещё разные примитивы, будут идти как отдельные модули. Круги и всякие кривые (например Безье) упрощать до совокупности прямых, нa память не тестировал, но думаю немного будет занимать, хотя будут большие уровни -_- Первую вершину передвигать (w, a, s, d), а вторую стрелками.