Среда, 25 Декабря 2024, 05:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Урок №2. Иерархия классов движка.
kirix820Дата: Среда, 05 Мая 2010, 16:25 | Сообщение # 1
участник
Сейчас нет на сайте
Привет всем! Простите, что так долго не писал - было очень много дел, связанных с работой в Shooters Inc.
Итак, в этом уроке я расскажу про иерархию классов и все, что с этим связано. Для начала разберемся, для чего же нужна иерархия классов. Как вы знаете, любой движок представляет собой сборку модулей, работающих по отдельности, но зависящих друг от друга. Таким образом, если в одном модуле косяк, не запустится и другой. Чтобы такого не происходило нужна иерархия классов. По сути, это дерево (очень ветвистое) классов вашего движка. И каждый класс имеет "детей" (child), тоесть подклассы, имеющие свойства родителя, но также имеющие свойства, предназначенные для конкретной цели. Если у вас будет такая иерархия, то вы, обнаружив баг, сразу сможете быстро отыскать участок кода, где произошла ошибка. А баги во время разработки неизбежное зло. Простейшая иерархия может выглядеть так:

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

Code

TMovableObj= class
public
Coord: TGLCoordinates;
Speed: integer;
procedure Move
procedure MoveTo(to: TGLCoordinates);
end;

Давайте разберемся в этом коде. Строка TMovableObj= class обьявляет новый класс - TMovableObj, причем этот класс не имеет родителя. Если бы у этого класса был родитель, то строка выглядела бы так: TMovableObj= class (имя класса-родителя). Строка public указывает на то, что сейчас начнется публичный раздел из которого другие функции и классы могут брать переменные (или процедуры). Собственно, Coord и Speed - переменные, а Move и MoveTo - процедуры. Строка end; указывает на окончание описания класса. Таким образом реализуются всевозможные классы. И в завершение урока я бы хотел рассказать о такой интересной вещи, как списки (Tlist). Этот класс включен в дельфи и занимается он составлением списков. Если вы делаете стратегию или другую игру, в которой приходится управлять одновременно несколькими обьектами, списки вам очень пригодятся.
Реализуются списки таким образом:
1.Обьявляем переменную класса Tlist;
2.Добавляем элементы в список командой Название списка.Add[индекс элемента](Название обьекта, который хотите добавить);
3.Теперь вы можете исполнить одну команду для нескольких элементов (если они того позволяют). Например, пишете. Название списка[индекс элемента (или индексы)].Move; Так вы можете отправить несколько обьектов одной строкой (а это очень сильно экономит код).

На этом второй урок подошел в концу. Ждите моих следующих уроков. Еще раз пардон за то, что не писал))))




Да будет роцк! Навсегда!
wernherДата: Среда, 05 Мая 2010, 22:53 | Сообщение # 2
Only God is Perfect
Сейчас нет на сайте
kirix820, не пинай, скажу правду... Слабовато...

Попробую чуток поправить smile

В современном мире есть несколько разных "парадигм" программирования. Сейчас самой модной считается именно объектно-ориентированное программирование (ООП).
Базовое понятие в нем "Класс".
Класс - это данные+функции. Объясню попроще. Представим себе того-же орка. Какие у него характеристики и что он может делать?
Во первых ХП(HP), а также урон(Damage), ну и пожалуй его координаты (Coord).
Что он умеет делать? Ходить (Move) и бить (Attack).
Вот как это описать отдельным классом:

Code

type
      TOrk = class
        private
          FHP:integer;         //Это поля класса
          FDamage:integer;//
        public
          property HP:integer read FHP write FHP;                             //Свойство ХП
          property Damage:integer read FDamage write FDamage;   //Свойство Урон
          procedure Move;                    //процедура Ходить
          procedure Attack(Target:TGameObject);                             //процедура атаковать
      end;

Разберем код.
По рекомендации компании Borland, все названия классов в Delphi должны начинаться с заглавной буквы Т, поэтому мы назвали наш класс TOrk.
Ключевое слово class указывает, что это класс собственно класс.
Ключевые слова private и public определяют область видимости переменных и функции. Т.е. все функции и переменные объявленные после слова public будут "видны" всем и вся, а ко всему что после слова private будет можно обратиться только внутри класса. Возникает вопрос: "Зачем?". Например, пользователь случайно (или специально) попробует дать свойству HP не числовое значение, а текстовое. Программа в этом случае выдаст ошибку.
Поэтому и сокрытие есть один из "постулатов" ООП.
Ключевое слово property объявляет свойство объекта. В этом свойстве как раз и можно "фильтровать" и обрабатывать данные, прежде чем записать и сохранить.
Например:

Code

property Damage:integer read FDamage write FDamage;

в данной строке позволяется записывать прямо в поле в обход "фильтрации". Это не есть "гуд". В идеале записать так:
Code

property Damage:integer read GetDamage write SetDamage;

где GetDamage - это функция возвращающая значение урона, а SetDamage - устанавливает новое. Сами процедуры объявляем в области private. Не зачем остальным знать о их существовании smile
Code

function GetDamage():integer;
procedure SetDamage(val:integer);

Как воспользоваться своим классом?
Очень просто.
После слова var в модуле объявляем новую переменую типа TOrk.

Code

var
Uruk : TOrk;

Вот к примеру отрезок кода по созданию группы орков:

Code

var
Skuad : array[0..9] of TOrk; //Объявляем отряд

procedure CreateOrk();
var
    i:integer;
begin
    for i:=0 to 9 do
    begin
      Skuad[i]:=TOrk.Create; //Создаем нового орка
      Skuad[i].Damage:=10; //И назначаем ему урон
    end;
end;

Вот так просто. Конечно я не описал такую вещь как наследование, динамические "отряды" орков, и конечно не оветил на главный вопрос: "Зачем оно мне?".
Но если будут читатели, то я могу и описать/ответить.

С уважением Wernher von Braun.




Сообщение отредактировал wernher - Пятница, 07 Мая 2010, 18:57
kirix820Дата: Пятница, 07 Мая 2010, 14:34 | Сообщение # 3
участник
Сейчас нет на сайте
Я просто не стал вдаваться в подробности вроде хп и.т.д. Но спасибо за информацию)



Да будет роцк! Навсегда!
wernherДата: Пятница, 07 Мая 2010, 18:59 | Сообщение # 4
Only God is Perfect
Сейчас нет на сайте
Могу выпустить отдельной статьей тему объектно-ориентированного программирования. Очень интересная тема. smile

Добавлено (07.05.2010, 18:59)
---------------------------------------------
Я сам своим дополнением не доволен...
Можно было все расписать еще проще...

Но как говориться: "Умная мысля приходит опосля"....


  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг