Слои карты
Для игр, не использующих прокрутку, создать карту не так уж и сложно. Для этого можно использовать фоновые клетки (с возможностью сохранять объекты вроде бонусов и ключей) и, по возможности, передний слой, который закрывает игрока, когда он идёт позади него. Это нужно для придания эффекта глубины.
Так что можно начать с использования трёхслойной карты. Я бы предложил использовать трёхмерный массив, потому что к массивам, в отличие от списков и подобных структур, можно обращаться напрямую. К тому же работать с ними гораздо проще, и Вы будете избавлены от лишнего труда. И еще понадобится дополнительный байт на каждую клетку (или четвёртый слой), где будет храниться дополнительная информация.
Спрайты в воздухе
Вам нужно регулярно проверять, является ли клетка под спрайтом землёй или нет. В последнем случае ваш спрайт должен начать падать до тех пор, пока под ним не встретиться «твёрдая» клетка. Вот псевдокод:
если (твердая_клетка)
{
если (падает)
{
падает = ЛОЖЬ;
// Вы можете добавить здесь повреждения спрайту,
// в зависимости от скорости падения (скорость.y)
}
}
иначе
{
падает = ИСТИНА;
скорость.y += гравитация;
}
позиция.x += скорость.x;
позиция.y += скорость.y;
Если Вы хотите больше узнать об использовании гравитации, читайте FAQ по гравитации. Теперь разобраться с прыжками и падениями не составит для вас труда, но что же делать с наклонными поверхностями? Об этом пишет Jim Boulton в своей статье ". Where's the Ground " (к сожалению, эта статья не сохранилась).
От ходьбы к бегу
Во многих современных аркадах герои переходят на бег через некоторое время после ходьбы в одном направлении. Этот эффект достаточно просто реализовать. Всё, что Вам понадобиться – это одна дополнительная переменная, которая содержит число кадров с того времени, как игрок стал двигаться в одну сторону. Каждый кадр Вы увеличиваете это значение и сравниваете с порогом. Если он достигнут, то переходим на бег.
если (направление != старое_направление)
{
// Направление изменилось, прекращаем бег,
// сбрасываем счётчики
пройдено_кадров = 0;
старое_направление = направление;
бег = ЛОЖЬ;
}
иначе если (! бег) // Не нужно увеличивать счетчик, если мы и так бежим
{
// пока не изменилось направление
пройдено_кадров++;
если (пройдено_кадров = порог)
{
// переходим на бег
бег = ИСТИНА;
}
}
Вы можете пойти дальше, если будете учитывать различные скорости бега. Так спрайт мог бы сначала ходить, затем разгоняться (совершать толчок) и бежать.
Вот и всё на данный момент.
Верстка и поддержка Lennart Steinke