Суббота, 27.04.2024, 10:08
Приветствую Вас Гость | RSS
Главная | algorprincip | Регистрация | Вход
Вход на сайт
Меню сайта
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
склад

Алгоритмы и принципы построения.

страница пока не доделана, качайте файл =(


скачать статью *.rar *.DOC 1,20mb

В данной литературе будут представлены советы в области игростроения. Хотя я сам не являюсь профессиональным игростроителем, но все же могу дать советы у пустить ваши мысли в нужное русло. В основном я буду стараться объяснять, что и как делается. Возможно это будут не лучшие способы, но зато будет где о них узнать. Основная идeя – как что делается и как это работает.
Первый шаг.
Зачастую, вдоволь наигравшись в различные гамы на разный платформах и тд. Нам хочется создать свой шедевр. На этом этапе люди сразу делятся на две категории:
Те, кто берется за сложный язык и большой проект. Те кто хочет сделать свой Крайсис, Диабло, СтарКрафт. Такие обречены на провал. Но даже если им это удалось, то на это были потрачены годы. Годы!
Те, кто понимает, что начинать надо с малого. И тут вовсю идут тетрисы, арканоиды, пакмены и спейсинвайдеры. Стоит сразу понять, что это не стыдливо, но и делать бесчисленные модификации тоже глупо. На этих играх учатся. Хотя путь таких людей правилен, они могут тоже быть обречены на провал.
Что надо понять сразу.
Первое и самое главное – это ощутить в себе желание. Если его нет то «нет» можно сказать и игре. Что же еще? Логика. Без нее никуда. Ну куда проще сделать игру, когда вы реально понимаете как что то работает и как это делается. Свободное время и усидчивость. Если вы собираетесь делать игры, а у вас в голове только футбол, да и все время заняты так, что за компом проводите в день только 1 час, то лучше проверить еще раз – присутствует ли у вас логика. Игры не делаются за один – два дня. На это нужно время и терпение. Посмотрите, заточены ли у вас руки. Ну что можно ожидать от тех, кто даже квадрат 10на10 пикселей ровно нарисовать не может? Еще одной важным пунктом является жажда знаний (кстати, любопытство и любознательность очень даже разные вещи). Чем больше, тем лучше, тем проще, тем быстрее.
С чего начинается.
Первой всегда появляется идея. Если нет идеи – значит ваша игра – клон. Уже при формировании идеи определяется жанр игры. Идея вполне одна из важных вещей. Только за хорошую идею вы можете получить 3 бала из 10 (если вы конечно ее не испоганите своим творением, а то вам еще скажут что такую мысль загубили и еще виноватым окажитесь).
При формировании идеи уже начинает формироваться образ игры. Персонажи, диалоги, действия, окружение, возможности игрока. После того как идея «обрела скелет» нужно понят что вы в принципе сможете сделать, а что нет. Для более четкого мышления(а это ускоряет процесс) заведите себе тетрадь и рисуйте и пишите в ней все о своей игре. Придумаете название, имена героев, напишите какой жанр, проэлюстрируйте возможности персонажа, одновременно думая как вы будите это делать. Я не даю советы составлять все в блоковые алгоритмы, как написано во многих книгах, но все же вот такая небольшая организованность вам не помешает.
Откуда брать идеи.
Идеи – это ваше воображение. Если его нет, но хочется создавать – не беда. Спросите у друга какую в какую бы он хотел поиграть игру, которой на самом деле нет. Скорее всего, вам предоставят нехилый список, хотя половина из него будет трудноосуществима. Но это уже что-то!
С чистого листа.
У меня частенько бывает такое: открыл новенькое окно ГМ и сижу тупо. А с чего начинать. Тогда я возвращаюсь к свой тетрадке и начинаю мыслить. В игре вы играете допустим за вояку. Я быстренько готовлю спрайт(на этом этапе я рисую его схематично или беру откуданить). Персонаж – это объект. Значит создаем объект и применяем спрайт. Персонаж должен ходить. Делаем управление. Он должен сталкиваться со стенами. Рисую стену, добавляю объект, дорабатываю управление. Должен стрелять – создаю патрон, делаю систему стрельбы, добавляю управление. Чуть ли не каждую строчку кода я просматриваю(то и дело сижу и щелкаю на F5 и по полчаса бегаю по совершенно пустой карте). Уже даже на этом этапе идет небольшая отладка(скорость игрока, его размеры и тд.). Добавляем врагов, украшаем мир. И играться то уже в принципе можно, но показывать это людям нет. Добавляем менюшку, призы, небольшой сюжет и ТАДА! Но доже если все правильно сделано 10 не поставишь.
Правильная идея.
Когда мы представляем себе свою будущую игру, нужно задумываться о правильности. К примеру безумие бегать с Hell Gate с мечом, когда можно с базукой! Не стоит делать кольчужку в далеком будущем. Не стоит делать водопровод как в Sacred 2. Хотя можно подумать это моя игра, это мой мир, но вы будите не правы! Игра это мир игрока, а вы только создатель. Игрок, увидев в игре здоровую дубину, захочет ей комунить перемкнуть, а не палить по всем сторонам плазменными патронами. А некоторые вещи вообще могут нервировать, как например в ГТА – обычные столбы крошим в щепки, не поцарапав машины, а в деревянные хоть из танка в упор пали, все равно толку не будет. Вот к примеру когда делали MMORG игру Conan (точно название не помню) то можно было открывать целую галерею. Командой был проделан огромный труд – они перечитали кучи книг по истории и попытались воссоздать тот мир как можно реалистичней. Даже вот во всех фэнтезийных играх действует притяжение земли =) . Так что на отточку идеи нужно потратить время.
Понятливость процесса.
Можно с кем угодно поспорить, но вы наверняка встречали такую игру в которой вы просто не знали что делать. Если мне интересно, что за игра, то многие просто удаляют ее. Да вот и в одной игре я бы врядли догадался, что нужно бегать по стенам и потолку, но разработчики придумали такой ход. Когда вы почти в самом начале бежите вы видите как ваши враги бегут по стенам. В таком случае даже самому захочется так сделать. Если к примеру ваша игра чем то уникальна(к примеру GreenTech) то должен присутствовать понятный и наглядный туториал. Всякие надписи и названия вещей и тд. в игре должны быть как можно больше «земными». Ну к примеру что понятнее: гипертехнический трэшкикер или просто электрошокер?
Закон Хика
Закон Хика гласит, что время выбора экспоненциально зависит от количества вариантов выбора, соответственно большое количество разных противников одновременно крайне затруднит принятие тактического решения. Если вы хотите предоставить игроку действительно большое количество выборов, необходимо предоставить достаточно времени на принятие решений. Примером этого может быть тактическая пауза или пошаговость. Два-три варианта решения одной ситуации являются комфортными с точки зрения восприятия, и, как правило, достаточным для того, чтобы игра была интересной.
Фичи геймплэя.
В какую космическую стрелялку интереснее играть: в обычный спэйсинвадерс или быстренькую стрелялочку с кучей призов и оружия? Это самые обычные фичи. Добавляйте наглядность в свои игры. Ведь оружие хочется купить то которое с виду покруче! Когда в игре все проходит быстро, спрайты призов должны говорит о назначении самого приза. Можно сделать приз такого же цвета, только он будет наоборот вредить. В игре то вроде похожи можно и спутать, но и различие между ними есть. Добавьте неожиданность – пусть враг, пока прячется в кустах, будет еле различим среди листвы. Интересно играть когда есть несколько выходов из одной ситуации(взять штурмом или незаметно подкрасться). Не стоит делать процесс монотонным. Пускай хоть и первый уровень, но пару раз вылетит враг посильней. Тогда игрок будет постоянно в напряге и будет ждать их в следующем уровне. Разнообразность врагов не должна состоять только в их виде. Как минимум должна различаться скорость, урон, жизни. Было бы интересно, если каждый враг обладает своей тактикой. Обратите внимание на Diablo II. Количество бутылочек, которые можно поставить на горячие кнопки, ограничено. Да и само здоровье восстанавливается не сразу. Это не дает игроку прорываться на пролом. Хороший геймплэй – хорошая игра.
Интерфейс.
Интерфейс это не только кнопочки и картинки, а еще и сам процесс диалога пользователя и программы. С непонятливым и неудобным интерфейсом вы далеко не уедите. Опять тоже Diablo II. Здоровье и манна расположены по краем, красиво оформлены и хорошо дают визуальное представление. Когда вы получаете уровень то слышите звук и кнопки для быстрого повышения становятся яркого цвета. Шкала опыта расположена на панели и не сливается с ней и задним фоном. Активные способности визуально отображены по краям, и глядя на них вы уже знаете что игрок будет делать. Также присутствует небольшая выдвижная панелька для доступа к различным меню и подписями(название и горячая клавиша). Сама нижняя панель не мешает обзору. Сам главный герой всегда в центре экрана. Можно просмотреть имя и жизни каждого врага. Даже один тип врага визуально распределен на сильных и слабых. В меню характеристик размещено достаточно много информации, но когда вы играете вы знаете где что находится. А почему, ведь запомнить где что в каждой игре это не реально?! Все дело в упрощении. Информация визуально разбита на типовые группы. Поэтому когда вы открываете меню, вы знаете куда бросить взгляд чтобы просмотреть данные о своем уроне, защите и тд. Хотя вот щас попробуйте вспомнить каждый пункт. Врядли удастся, но играя, вы об этом не задумываетесь.
Когда вам хочется уместить много кнопок которые так нужны, не забываете что быстрее нажать на большую, чем на маленькую. Перенасыщать тоже нельзя. К примеру, почему многие не любят фотошоп. Да там кнопок дохрена. Хотя они все разбиты на группы. И если приглядеться то все запомнится. Там же вынесены только часто используемые функции и некоторые было бы не логично размещать еще гденить(представьте что чтобы включить карандаш или кисть вы куда то там лазите по менюшкам, заместо того чтобы раз щелкануть мышкой). Интерфейс нужно делать дружелюбным. Ну кому понравится что вас матерят когда вы жмете на кнопку. Должна быть визуальная и звуковая активность. Нажатые кнопки надо выделять, при срабатывании проигрывать звук. Ведь отметьте – пользователь жмет на кнопку и визуально ничего не происходит, тогда он жмет ее еще раз, думая что ничего не получилось. Если что-то недоступно в данный момент, но потенциально рабочее, то стоит сделать это на данный момент «серым». Сразу будет понятно, что нажимать не следует, потому что толку не будет. Не стоит делать больших новшеств, только для того чтобы было не как у всех. Красочное оформление всегда приятно, но не стоит делает его слишком ярким, или наоборот тусклым. Пользователь не должен щурится и настраивать яркость монитора. Интерфейс вполне тесно связан с геймплэем в каких то областях и тоже сильно влияет на оценку со стороны.
Дизайн.
А вот это точно тесно связано с интерфейсом и геймплэем. Из меня дизайнер плохой, но как я думаю если у вас удался геймплэй и интерфейс, то здесь проблем не будет. Данный аспект я рассматривать не буду.
Графика.
Многие спорят что графика – это самая важная часть в игре. Это не так, но кто будет играть в большие квадраты бегающие по экрану. Хорошая графика сильно влияет на успех. И мы как одиночки игростроители вряд ли умеем хорошо рисовать. Поэтому постоянно рыскаем в сети и тыбрим ресы из игр. Но порой интереснее играть когда присутствует авторская графика, а не всем известные и наскучившие картинки. Порой что у нас даже игра немного меняется из-за графики, но все же как ее делать да попроще:
Одним довольно быстрым и простым способом является видоизменение. Мы находим подходящую картинку и перекрашиваем ее, немного изменяем форму и получаем неплохой результат.
 - персонажа для игры CosmoDesant я делал из спрайта игрока 2дКонтры. Примитивно, но ведь что-то.
Для второй же части игры я отрендерил модель Arctic из обычной КС:
Изменил форму, перекрасил и получил следующие:
Совершенно новый игрок и довольно не плохо выглядит(вы бы не за что не узнали что он из контры =) ).
Оружие рисовалось таким же типом. Сначала рендерил, уменьшал, видоизменял, красил.
А последнее вообще собрал из деталей (3-2) причем вид сбоку рендерил:
Вот такие вот уловки!
Хеалсбары делать вообще легко:
Создаем спрайт небольшой ширины и нужной высоты заливаем градиентом и все!. В самой игре перекрашиваем спрайт в нужный цвет и получаем довольно красивый эффект.
Первого монстра для игры я сделал из главного персонажа:. Разнообразил игру кровью:благодаря таки маленьким картинкам можно получать очень красивые эффекты.
Для создания анимации врагов я использовал программу Skeleton. Разрезал врага на составные, насохранял картинок и чуть поправил баги.
Авторская графика это даже прикольно:


Это несколько спрайтов которые я рисовал сам(ну да я коряво рисую). Но их делал я!
Фон для CosmoDesant я рисовал на уроке ОБЖ в тетради, а потом сканил, обводил(в paint.net это делать удобнее всего) и потом раскрашивал:

Это был мой первый арт. Его я рисовал без болванчика(теперь я знаю что я был не прав!).
Хотя рисовать графику самому порой бывает довольно не просто. Вам сильно повезло если у вас богатое воображение и вы можете себе представить что угодно. Представили и нарисуйте на листе(у каждого это получается лучше чем сразу на компе).
Кнопки в играх и программах.
Во первых у кнопки есть несколько состояний: просто на экране, наведен курсор, нажата и неактивна. Вполне логично для каждого состояния ее как то выделить. Как же сделать самые простые жмакалки? Казалось бы взял и нарисовал квадрат с надписью… Но лучше приукрасить. Разрабатываем вид кнопки и по форме создаем спрайт. Заливаем одним цветом. А далее на выбор:
Можно превратить ее в объемную(как Windows 98). Для этого взять оттенок посветлее и обвести по краю верх и левую сторону, потом аналогично взять цвет потемней и обвести другие стороны. 
Все. Можно добавить выемку. Тоесть такими же цветами сделать рамку внутри.
Рисуем вокруг рамку с одним узором, внутри другой узор. Добавляем объемности проводя полупрозрачной кистью по внешним краям внутренней части. - вот вам типичный пример. Смотрится не так плоско.
А без тени?Но тоже разнообразие. Берется градиент двух цветов и проводится по диагонали из угла в угол. В области чуть поменьше делаем тоже самое только теперь из другого угла.
Активность кнопки можно разнообразить цветом, а добавление звуков при взаимодействии придаст хороший эффект!
Как я делаю кнопки:
Для начала создаю спрайт, содержащий в себе нужное кол-во изображений. Рассмотрим самое простое. В событии CREATE установим скорость анимации на 0. В событии MOUSE LEFT RELEASED(обычно делают на событии отпускании) проигрываем звук и выполняем действие кнопки. В событии MOUSE ENTER(когда наводим мышь)ставим image_index на 1, а в событии MOUSE LEAVE ставим на 0(тобиш обратно). В этом варианте есть один минус – когда мышь при создании кнопки окажется на этой кнопке, то ваш бутон не будет «выделен»(ведь не произойдет события MOUSE ENTER). Для избавления от этого надо делать точную проверку положения мыши.
Как делается панелька как в РПГ’шках?
Сама панель это картинка. А вот поверх нее рисуются объекты(кнопки, шкалы и тд.). Чтобы нарисовать и закрепить эту панель в событии рисования пропишите draw_sprite(spr_panel,image_index,view_xview,view_yview+n) где n это та высота на которой находится ваша панель. Далее уже можно размещать все остальное. Важно: панель должна быть выше кнопок по глубине, иначе вы просто не увидите ее. 
Процесс стрельбы с паузами(с разными патронами).
Выстрелы должны происходить с какой-то временной паузой. Значит, будем использовать таймер. В событии CREATE:
atack = true // эта переменная будет отвечать может ли игрок(/враг)стрелять
b_speed = 20 // это скорость патрона
damage = 10 // это урон от пули
wait = 5 // это время между выстрелами
bullet = noone // переменная для создания патрона
Далее создаем ALARM[0]и пишем в нем
atack = true// когда таймер закончился то можем снова 
Теперь в том событии где стрельба:
if atack = true {
atack = false // тепрь больше не может выстрелить
bullet =instance_create(x,y,obj_bullet) // создаем патрон
// применяем свойства
bullet.speed = b_speed
bullet.direction = direction // это надо писать если вы хотите чтобы патрон летел
// в ту сторону куда смотрит игрок
Bullet.damage = damage // таким образом для разного оружия можно использовать только один патрон
Bullet.image_angle = direction // это если у вас изображение патрона не круглое(/точечное)
alarm[0]=wait // ставим через сколько можно еще раз выстрелить
}
Такой образ стрельбы очень подходит для TDS игр, но принцип стрельбы остается везде.
Патрон попал в врага(бей их!).
Рассмотрим это действие с указанными выше свойствами. Из всех свойств нам нужно только damage. Во первых у врага тогда должны быть жизни. В событии CREATE врага укажем:
heals = 20 // слово написано неправильно, потому что в ГМ есть стандартная глобальная переменная health
В событии столкновения (у врага) с патроном поставьте стандартное действие instance_destroy() и примените OTHER. В скрипте же:
heals -= other.damage
if heals < 0 then instance_destroy() // проверяем сразу не умер ли враг
Теперь вы можете разбавить свою игру различным оружием, которое будет убивать врагов по разному.
ИИ врагов. Каково это.
ИИ – искусственный интеллект. Тоесть когда враг сам выполняет какие то действия(типа думает). Зачастую это одна из самых сложных частей при создании. Но все же как он делается.
Для самого начала надо определится на том, а что ваш враг в игре вообще делать будет. Определить при каких условиях он будет выполнять те или иные действия. Тоесть создать алгоритм. А потом все это перевести в код.
Пример алгоритма:












Понимая, что враг должен делать и когда, уже становится проще создать код. Узнать, достаточно ли хорош ваш код, можно «натравив» врагов друг на друга. Тогда можно будет увидеть некоторые недочеты.
Разнообразие окружения.
Игра сразу станет яркой и красочной если в ней будут присутствовать различные визуальные объекты. К примеру ваши кустарники будут смотреться красивее если их делать не из одной картинки, а из нескольких. Тут покажется что придется делать много объектов. Можно но не обязательно. При создании того же куста достаточно в спрайте сделать несколько кадров и в событии CREATE написать две строчки:
Image_speed = 0
Image_index = choose(0,1,2,3,…,n,n+1) // указываем кол-во кадров изображения начиная с нуля.
Тогда при создании куста выберется случайная картинка.
Использование PARENT.
 Если у вас в игре кустов должно быть много и разного размера, а всякие действия не хочется писать для каждого, то можно упростить себе жизнь
Нужно создать один объект, который будет отвечать за все действия. К примеру звук шелеста при столкновении с игроком. Будем и рассматривать это. В событии столкновения пишем нужное действие:
If not sound_isplaying(sound) then sound_play(sound)
Далее создаем первые куст, применяем к PARENT наш базовый объект, который мы создали. А в событии CREATE пишем:
sound = snd_zvuk1// звук данного куста
Таким же образом можно размещать кучу кустов с разными звуками. В самой игровой комнате надо размещать сам куст, а не базовый объект.
Чем это полезно? Таким образом вы можете создать кучу врагов у которых будут разные свойства(жизни, скорость…) и при этом не надо будет писать код ИИ для каждого.
Использование маски.
Зачем ее вообще использовать? Столкновения проверяются либо по bounding box(невидимая квадратная рамка в которой размещен спрайт). Но иногда хочется(а порой и требуется) чтобы столкновения происходили как с кругом(к примеру когда игрок квадратный). Вот это и помогает сделать маска. Использование довольно простое: рисуем новый спрайт, который теперь будет отвечать за столкновения. После применяем в объекте маску и вуаля! Сама маска в игре не рисуется.
Простой пример когда может пригодится:
Допустим игрок имеет форму овала, а стена в игре квадратная.
Когда игрок подойдет к стене то все нормально,


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




Как не проходить сквозь стены?
Этот вопрос мучает всех новичков Хотя на каждом сайте есть наиогромнейшая куча всеразличных уроков, примеров и статей, все равно каждый да создаст тему на форуме. А теперь это не просто сделаем а поймем как это работает.
Одним из способов является остановка игрока, тоесть сделать его скорость нулевой. Это сделать просто: в событии игрока при столкновении со стеной поставить скорость равной 0. Минус – игрок не сможет «скользить» по стенке. Также этот метод бесполезен, если вы в качестве перемещения игрока используете не speed и тому подобное.
Второй способ(который я активно использую) это просто не дать игроку даже столкнуться с самой стеной. Тоесть перед тем как перейти в новую позицию, надо проверить а не стоит ли там стена, не находится ли там враг и тд. Пример в виде строки:
If keyboard_check(right) and not collision_point(x+3,y,obj_wall) { x+=3}
Минус метода в том что это может вылиться в большую строку. Но я не унываю т.к. при добавлении твердого объекта я просто копирую not collision_point(x+3,y,obj_wall) и заменяю имя объекта на нужное. Если будете делать таким образом то лучше при создании стен использовать parent и тогда в качестве имя объекта надо будет вписать имя базового.
Есть и другие способы, но я не стану их рассматривать.
Вариации написания кода и некоторые упрощения.
If условие then действие// одно значение в действие
If условие действие// одно значение в действие
If условие {действие}// в скобках можно писать n действий
If (условие) {действие}// в скобках можно писать n действий
If условие then begin действие end // и нафига здеся паскалевская форма?
При вкладке нового условия в действие лучше делать отступ(я два раза жму на пробел), тогда читабельность кода возрастает и пропадает путаница со скобками:
If условие {
действие
  If условие {
  действие
  }
}
And заменять на &&
Not заменять на !
Когда все действие происходит в одном условии можно избавиться от пары скобок:
Было 
If условие=true {
}
Стало:
If условие != true then exit
Если выполнить EXIT, то все что дальше не будет даже проверяться.



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


скачать статью *.rar *.DOC 1,20mb

Copyright Бирюков Дмитрий aka ***DeMoN*** © 2024