2-я физика Платформера [закрывается]

Вот решение, основанное на проблеме «Самый большой прямоугольник в гистограмме» , предложенной @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

16
задан dmckee 29 July 2010 в 18:51
поделиться

8 ответов

Сила тяжести легка:

const gravity = ... ; // pixels per timestep (eg. video frame) squared
// while in freefall, each timestep:
y_velocity += gravity;
y_pos += y_velocity;

, Обратите внимание, большинство 2-х игр платформы я играл , не делают , имеют реалистическую силу тяжести. Просто сделайте то, что делает игровую забаву!

3
ответ дан 30 November 2019 в 23:24
поделиться

Загрузите механизм FarseerPhysics, взгляните на то, как он работает http://www.codeplex.com/FarseerPhysics , я думаю, что это - лучшая вещь, доступная для XNA/Silverlight!

5
ответ дан 30 November 2019 в 23:24
поделиться

jnrdev мог бы иметь некоторую помощь. Это покрывает коллизию/ответ мозаики и наклоны. Это не лучший код, который я когда-либо видел, но это сделало задание.

2
ответ дан 30 November 2019 в 23:24
поделиться

Когда-нибудь услышанный о GameMaker?

-6
ответ дан 30 November 2019 в 23:24
поделиться

Это может быть обходом, но попробовать стартовый набор Платформера от XNA 3.0, который содержит материал как Физика и основное Обнаружение коллизий. Необходимо будет изменить материал, чтобы заставить его работать за пределами XNA, но это не аэрокосмические исследования.

загрузка XNAGS 3.0

1
ответ дан 30 November 2019 в 23:24
поделиться

Я не знаю то, что Вы используете для модели физики, но модели физики, которые используют жидкое перетаскивание, были недавно обращены в другом ТАК вопрос. Я не повторю все, что я дал в своем ответе, я просто свяжусь с ним.

Подводя итоги, OP для вопроса хотел ускорить объект от отдыха до максимальной скорости. Я прошел несколько дериваций для моделирования скорости как функция времени для двух различных типов перетаскивания. Ваша ситуация может немного отличаться, таким образом, используемые интегралы могут иметь различные формы или должны быть решены с различными начальными условиями, но надо надеяться мой ответ укажет на Вас в некоторых информативных направлениях.

0
ответ дан 30 November 2019 в 23:24
поделиться

Есть пара действительно полезных руководств по 2D-платформерам на http://www.metanetsoftware.com/technique/tutorialA.html и http: //www.metanetsoftware.com/technique/tutorialB.html. Я думаю, что на них ссылались другие в другом месте на SO. Они охватывают обнаружение столкновений и реакцию на них, прогнозирование лучей, различные методы оптимизации и т. Д. И имеют хорошее объяснение теории, лежащей в основе всего этого, для тех (вроде меня), кто менее склонен к математике. Это не доходит до таких вещей, как динамика твердого тела, но я не думаю, что вам это понадобится для игры, которую вы пишете (хотя, конечно, было бы здорово, если бы вы добавили такие вещи ... .)

2
ответ дан 30 November 2019 в 23:24
поделиться

Ваш баг с ударами нескольких блоков, вы можете исправить это, ударив только блок, который больше всего выровнен с playerprite или имеет наименьшее смещение. Убедитесь, что вы не ограничили его одним направлением. На самом деле блоки можно столкнуть с любого направления в Марио. (Выше, выполняя удар по земле в тех же играх, или упражнение с вращением) (Стороны с помощью снаряда)

0
ответ дан 30 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: