Вот решение, основанное на проблеме «Самый большой прямоугольник в гистограмме» , предложенной @j_random_hacker в комментариях:
[Алгоритм] работает путем итерации по строкам сверху вниз, для каждой строки, решающей эту проблему , где «бары» в «гистограмме» состоят из всех непрерывных восходящих траекторий нулей, которые начинаются с текущей строки (столбец имеет высоту 0, если он имеет 1 в текущей строке).
blockquote>Входная матрица
mat
может быть произвольной итерируемой, например, файлом или сетевым потоком. Одновременно требуется только одна строка.#!/usr/bin/env python from collections import namedtuple from operator import mul Info = namedtuple('Info', 'start height') def max_size(mat, value=0): """Find height, width of the largest rectangle containing all `value`'s.""" it = iter(mat) hist = [(el==value) for el in next(it, [])] max_size = max_rectangle_size(hist) for row in it: hist = [(1+h) if el == value else 0 for h, el in zip(hist, row)] max_size = max(max_size, max_rectangle_size(hist), key=area) return max_size def max_rectangle_size(histogram): """Find height, width of the largest rectangle that fits entirely under the histogram. """ stack = [] top = lambda: stack[-1] max_size = (0, 0) # height, width of the largest rectangle pos = 0 # current position in the histogram for pos, height in enumerate(histogram): start = pos # position where rectangle starts while True: if not stack or height > top().height: stack.append(Info(start, height)) # push elif stack and height < top().height: max_size = max(max_size, (top().height, (pos - top().start)), key=area) start, _ = stack.pop() continue break # height == top().height goes here pos += 1 for start, height in stack: max_size = max(max_size, (height, (pos - start)), key=area) return max_size def area(size): return reduce(mul, size)
Решение -
O(N)
, гдеN
- количество элементов в матрице. Это требуетO(ncols)
дополнительной памяти, гдеncols
- количество столбцов в матрице.Последняя версия с тестами находится в https://gist.github.com/776423
Сила тяжести легка:
const gravity = ... ; // pixels per timestep (eg. video frame) squared
// while in freefall, each timestep:
y_velocity += gravity;
y_pos += y_velocity;
, Обратите внимание, большинство 2-х игр платформы я играл , не делают , имеют реалистическую силу тяжести. Просто сделайте то, что делает игровую забаву!
Загрузите механизм FarseerPhysics, взгляните на то, как он работает http://www.codeplex.com/FarseerPhysics , я думаю, что это - лучшая вещь, доступная для XNA/Silverlight!
jnrdev мог бы иметь некоторую помощь. Это покрывает коллизию/ответ мозаики и наклоны. Это не лучший код, который я когда-либо видел, но это сделало задание.
Это может быть обходом, но попробовать стартовый набор Платформера от XNA 3.0, который содержит материал как Физика и основное Обнаружение коллизий. Необходимо будет изменить материал, чтобы заставить его работать за пределами XNA, но это не аэрокосмические исследования.
Я не знаю то, что Вы используете для модели физики, но модели физики, которые используют жидкое перетаскивание, были недавно обращены в другом ТАК вопрос. Я не повторю все, что я дал в своем ответе, я просто свяжусь с ним.
Подводя итоги, OP для вопроса хотел ускорить объект от отдыха до максимальной скорости. Я прошел несколько дериваций для моделирования скорости как функция времени для двух различных типов перетаскивания. Ваша ситуация может немного отличаться, таким образом, используемые интегралы могут иметь различные формы или должны быть решены с различными начальными условиями, но надо надеяться мой ответ укажет на Вас в некоторых информативных направлениях.
Есть пара действительно полезных руководств по 2D-платформерам на http://www.metanetsoftware.com/technique/tutorialA.html и http: //www.metanetsoftware.com/technique/tutorialB.html. Я думаю, что на них ссылались другие в другом месте на SO. Они охватывают обнаружение столкновений и реакцию на них, прогнозирование лучей, различные методы оптимизации и т. Д. И имеют хорошее объяснение теории, лежащей в основе всего этого, для тех (вроде меня), кто менее склонен к математике. Это не доходит до таких вещей, как динамика твердого тела, но я не думаю, что вам это понадобится для игры, которую вы пишете (хотя, конечно, было бы здорово, если бы вы добавили такие вещи ... .)
Ваш баг с ударами нескольких блоков, вы можете исправить это, ударив только блок, который больше всего выровнен с playerprite или имеет наименьшее смещение. Убедитесь, что вы не ограничили его одним направлением. На самом деле блоки можно столкнуть с любого направления в Марио. (Выше, выполняя удар по земле в тех же играх, или упражнение с вращением) (Стороны с помощью снаряда)