2d физика платформера

Это были длинные выходные, поэтому я снова получил ошибку в коде и начал играть:

http://gfilter.net/junk/tileengine.jpg

Я написал базовый движок плиток, но никогда прежде не пытался сделать это, я действительно борюсь с обнаружением столкновений спрайтов и реализацией реалистичной физики для гравитации.

Для любого другого автора игрового хобби, не могли бы вы указать мне на некоторые пошаговые руководства о том, как лучше всего подойти к этому?

Обновить:

Я думал, что поделюсь отчетом о проделанной работе:

http://www.youtube.com/watch?v=-RKNQ2UiiLY <- Игра в действии

Он все еще действительно глючит, но обнаружение столкновений в основном работает, я начал работать над некоторыми другими функциями (такими как удары по блокам (обратите внимание на ошибку) и взаимодействие с врагами).

Марио все еще ходит, как будто он на Луне, я использую эти константы, есть какой-нибудь совет, как настроить их для большего реализма?

    const float AirDrag = 1.00f;
    const float GroundFriction = .97f;
    const float Gravity = 0.8f;

9 ответов

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

Гравитация проста:

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

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

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

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

Это может быть обходным путем, но попробуйте стартовый набор Platformer из XNA 3.0, который содержит такие вещи, как физика и базовое обнаружение столкновений. Вам нужно будет изменить материал, чтобы он работал вне XNA, но это не ракетостроение.

XNAGS 3.0 скачать

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

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

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

    UIGraphicsBeginImageContext(images.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIColor *color = [UIColor whiteColor];
    [color setFill];

    CGContextTranslateCTM(context, 1, images.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, kCGBlendModeDestinationOver);
    CGRect rect = CGRectMake(0.0, 0.0, images.size.width, images.size.height);
    CGContextDrawImage(context, rect, images.CGImage);
    CGContextClipToMask(context, rect, images.CGImage);
    CGContextAddRect(context, rect);
    CGContextDrawPath(context, kCGPathFill);
    images = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

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

Другие вопросы по тегам