Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание компьютерных игр


Информационный Канал Subscribe.Ru

Cоздание компьютерных игр.
Рассылка Евгения Казеко.
Выпускается еженедельно по средам.

Выпуск 5. (от 16 апреля 2003 года)
Создаем игрового персонажа.

------------------------------------------------------------------------

Когда был закончен прошлый выпуск рассылки, мне пришлось серьезно
задуматься. С одной стороны, для того, чтобы научиться делать игры,
нужно научиться программировать. С другой, рассылка называется не
"Программирование на С++", а "Создание компьютерных игр". А это значит,
что я уже не могу просто знакомить вас, уважаемые читатели, с основами
программирования, потому что вы обязательно спросите:"А какое это имеет
отношение к созданию игр?". И будете совершенно правы.

Поэтому уже сейчас, при изучении основ, мы будем не просто рассматривать
какие-то отвлеченные понятия, "учить язык С". Мы будем тут же применять
полученные знания для создания тех или иных игровых элементов.

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

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

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

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

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

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

Представьте себе, что переменная это контейнер для хранения данных. Для
нашего персонажа нам понадобится три таких контейнера - для хранения
имени персонажа, количества его здоровья и золота. А теперь вдумайтесь
в слово "переменная". Переменная величина, что-то, что изменяется...
Именно так все и есть, в переменной, как и в любом контейнере, можно
хранить данные и изменять их. И мы, разумеется, захотим изменять
характеристики нашего персонажа, в зависимости от игровых действий.

Разыграем простую "игровую сцену". Предположим, что наш персонаж пришел
"подлечиться" к лекарю, магу или к кому-нибудь еще. Лечение стоит денег,
за один золотой восстанавливается одна единица здоровья. Реализуем эту
сцену на С, закрепив при этом наши знания о переменных, а заодно узнаем,
как можно вводить информацию с клавиатуры.

Если вы работаете в Visual C++, то создайте новый проект - консольное
приложение Windows, как мы это делали в предыдущем выпуске, и подключите
к нему новый файл, куда скопируйте текст идущей ниже программы. Если же
вы используете другой компилятор, то вероятно, ваши действия будут
несколько иными, но программа, я полагаю, при этом не изменится.

Вот текст программы, который я снабдил кое-какими комментариями.
Комментарии не влияют на выполнение программы, то есть мы можем поставить
две косые черты вот так // и после них писать все что угодно. В хорошей
программе всегда много комментариев, такую программу легче прочитать
и понять. В Visual C++ комментарии будут выделены зеленым цветом.

---------------------------------------------------------------------

// Сцена подлечивания персонажа

// Начинаем как всегда с подключения стандартного заголовочного файла.
#include <stdio.h>


// Создаем функцию main. Без нее программу на С не написать.
void main()
{

        /*       А вот тут начинается самое интересное. Здесь мы создаем
                 наши три "контейнера" - переменные для имени игрока,
                 его здоровья и золота. Конечно же, для хранения текста
                 и чисел, используются различные типы переменных. Типы
                 переменных находятся перед именами переменных и выделены
                 синим цветом. Сегодня мы будем использовать тип char для
                 хранения набора символов, и тип int для хранения целых
                 чисел.

                 Вы наверное заметили, что комментарии можно записывать
                 и таким способом - между "/*" и "* /" (без пробела).
        /

        char name[25];  // Число означает максимальное количество символов,
                        // которое способна хранить переменная (в нашем
                        // примере 25).

        int health, gold;

        int pay; // Для чего нам нужна эта переменная, мы узнаем позже.


        /      Теперь необходимо сделать так, чтобы в памяти компьютера
                оказалось имя персонажа. Как это можно сделать? Очень просто -
                ввести его с клавиатуры. Для этого используется функция
                scanf(). Но сперва нужно сообщить игроку, что нужно вводить
                имя. Для этого воспользуемся уже знакомой нам функцией
                printf().
        /

        printf("Enter player's name: ");  // Запрашиваем ввод имени.


        scanf("%s", &name);

        /      Так мы вводим данные с клавиатуры и записываем их в переменную.
                Сперва мы указываем, что вводимые данные - это строка. Для этого
                используем символ "%s". А затем, указываем имя переменной, куда
                будут записываться вводимые данные. Для того, чтобы функция
                могла изменить значение переменной, записав в нее имя персонажа,
                нам нужно использовать перед именем переменной знак &.
                Что это значит, мы подробно рассмотрим в следующих выпусках.
                А пока что запомните, что так мы используем указатели.

                То, что указывается в скобках после имени функции, называется
                параметрами, которые передаются в функцию. Таким образом, в
                функцию scanf мы передаем два параметра, разделяя их запятой.


                А теперь предположим, что в начале игры персонажу дается 10
                золотых и 20 единиц здоровья. Как записать эту информацию
                в переменные? Гораздо проще, чем ввод с клавиатуры. Мы
                просто присвоим эти значения переменным, используя оператор
                присваивания, вот так:
        /

        gold = 10;
        health = 20;

        /      Не путайте оператор присваивания с выражением равенства, которое
                записывается вот так: ==. И запись gold = 10, означает не
                "gold равно 10", а "присвоить переменной gold значение 10".
                Или, проще говоря, записать число 10 в переменную с именем gold.


                Только что мы создали с вами игрового персонажа. У него есть имя,
                есть жизненная энергия, и даже немного золота в кошельке.

                Выведем эту информацию на экран. /

        printf("\n");

        printf("Name: %s\n", name);

        /      Что означает такая запись? Все очень просто. Мы выводим на
                экран текст, который находится между кавычек, при этом
                знак %s заменяется значением переменной name.

                Знак \n, как мы уже знаем, означает переход на новую строку.

                А теперь посмотрим, как выводить на экран числовые значения.
        /

        printf("Gold: %d\nHealth: %d\n\n", gold, health);

        /      Как мы видим, все точно так же. Только для целых чисел
                используется знак %d. Я специально записал вывод этих
                строк одним оператором, чтобы показать, как работает
                printf. Первый знак %d заменится значением переменной
                gold, второй же заменится следующей переменной по порядку,
                т.е. health. Так мы можем выводить одним оператором
                любое количество переменных.


                Теперь мы можем приступить к реализации нашей "игровой сцены".
                Мы стоим перед лекарем и он говорит нам: "Я могу вылечить тебя.
                1 единица здоровья стоит 1 золотой. Сколько золота ты платишь?".
        /

        printf("\n");
        printf("Healer says:\n");
        printf("Hello, %s! I can heal you.\n", name);
        printf("1 health for 1 gold. How much gold do you pay?\n");

        /      А теперь поработаем с арифметическими действиями. Нам нужно вычесть
                количество золота и прибавить это число к количеству здоровья.
                При этом нужно проверить, чтобы игрок не потратил золота больше,
                чем он имеет. Для этого нам и пригодится переменная pay /

        scanf("%d", &pay);


        /      Далее идет оператор if - условный оператор. Хммм, похоже сегодняшний
                выпуск рассылки будет просто огромным... Вот как работает этот
                оператор. Сперва проверяется условие в скобках. Если оно истинно,
                т.е. золота больше, чем нужно заплатить лекарю, то выполняются действия,
                идущие после ключевого слова if (в фигурных скобках). Если же условие
                ложно, то выполняется действие после слова else. Фигурные скобки в
                этом операторе используются для группировки операторов - это так
                называемый составной оператор. Если после ключевых слов нужно
                выполнить одно действие, то фигурные скобки не нужны (как в нашем
                случае после слова else),
        */

        if (gold >= pay)                // Если золота больше, чем нужно заплатить
                                        // (или столько же).
        {
                gold = gold - pay;      // Отнимаем это число от количества золота
                                        // и записываем результат в переменную gold.
                health = health + pay;  // Точно так же увеличиваем здоровье и
                                        // записываем результат.
        }

        else                            // Если же условие не было выполнено
                printf("Not enough gold!\n");  // Выводим сообщение "Недостаточно золота!"



        // И наконец, выводим изменившиеся характеристики на экран.
        printf("Gold: %d\nHealth: %d\n\n", gold, health);


}       // Конец программы.



---------------------------------------------------------------------

Вот мы и "подлечили" нашего персонажа, а заодно узнали много нового.
Чтобы сделать нормальный процесс "оплаты", мне пришлось задействовать
условный оператор if, который мы не планировали рассматривать.
И все же, я вкратце объяснил, как он работает. В следующих выпусках
мы рассмотрим подробнее эту и другие темы, расширяя возможности
нашего персонажа.

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

Всего доброго!

Евгений Казеко.




------------------------------------------------------------------------

Поскольку я программист, выпуски моей рассылки будут ориентированы в основном
на программирование. Но я буду уделять немало внимания и общим вопросам создания
игр. И кроме того, кто знает, возможно читатели захотят прочесть рассказ о создании
компьютерной графики, музыки... Уважаемые читатели, пишите ваши пожелания на
kazeko@list.ru - они непременно будут учтены.

Евгений Казеко.
kazeko@list.ru
www.gamecoder.nm.ru
-----------------------------
Рассылка "Создание компьютерных игр", выпуск 5.
Выпускается еженедельно по средам.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное