1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Объектно-ориентированный язык на службе у игр

Тема в разделе "Мастерская", создана пользователем Dimouse, 28 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.170
    Я тут для дискмага решил написать статейку, связанную с гейммейкингом и программированием. Можно расценивать это как своеобразный туториал, но, чтобы интересно было, я пишу про создание игры. Пока только одна часть, если понравится, выложу еще (только сначала надо написать дальше:))
    ---
    Речь пойдет о том как полезны классы вообще и в частности в играх. Конечно можно писать для каждого объекта свою функцию и копи-пастить с небольшими исправлениями, но во-первых, это долго, во-вторых, размер кода разрастается до неимоверных размеров, в-третьих, неудобно, особенно когда нужно исправить ошибки, ну и наконец, мы же не в каменном веке! Теперь программировать на C это значит программировать на C++! Как-то недавно пришлось немного по-программить на Turbo C 2.01, блин как же это не удобно! Там даже нет комментариев слеш-звездочка [тут на форуме оказывается просто слеш со звездочкой если написать то он не рисуется], приходится все двумя слешами комментировать. Отвыкли в общем уже, еще раз подтверждая пословицу что к хорошему быстро привыкаешь.
    Так вот я хотел бы поговорить немного про классы, надеюсь будет полезно начинающим, да и тем кто программит на других языках программирования хотелось бы показать, насколько удобен и понятен С. Я буду показывать это на примере пошаговой РПГ игры, которую делал 5 лет назад, часть кода игры тоже будет приводиться. Итак сначала нам нужно сделать карту. С чего начать? Конечно с создания разных видов клеточек, трава, камень, деревья, враги, персонажи, дома, мебель в домах, сундуки, в общем все что может нам понадобиться в игре. Конечно самое трудное, это нарисовать все это, но к счастью у меня остался файлик от тех стародавних времен со всеми этими объектами и заново их рисовать мне не пришлось. А вот вам придется:)) Итак создаем класс объектов:
    Код:
    class object{
    public:
    char name[15];
    int moveble;
    int fire;
    int num;
    void decl();
    load_ddd(BITMAP*,const char*);
    draw(BITMAP*,BITMAP*,int,int,int);
    };
    name - это название объекта, movable - можно ли по нему ходить (например, по траве - можно, через стенку - нет. fire - у меня пока не использовалось, но теоретически оно означает, можно ли сжечь объект, например дерево можно, а каменную преграду - нет. num - номер объекта, самый главный параметр, как мы увидем дальше. Далее идут функции: decl() - декларация объекта. У меня она делается из файла discr.dat устроенного следующим образом:
    Код:
    &
    None
    0
    0
    0
    1
    &
    Grass
    1
    1
    1
    1
    &
    Desert
    1
    1
    1
    1
    &
    Swamp
    1
    1
    1
    1
    &
    Snow
    1
    1
    1
    1
    &
    Field
    1
    1
    1
    1
    &
    Lava
    1
    1
    1
    1
    &
    Stone
    0
    1
    1
    1
    Смотрим саму функцию decl():
    Код:
    void object::decl(){
    fstream myfile;
    myfile.open("discr.dat",ios::in);
    char q;
    int n=0;
    for(;;){
    myfile>>q;
    if (myfile.eof()) break;
    if (q=='&') n++;
    if (n==num+1) break;
    }
    myfile>>name;
    myfile>>moveble;
    myfile>>fire;
    //myfile>>mult;
    //myfile>>read;
    myfile>>q>>q>>q;
    myfile.close();
    }
    Все просто, не так ли? Два последних числа для каждого объекта в discr.dat я уже и сам забыл зачем были нужны:) Теперь посмотрим функцию main(), как мы инициализируем объекты:
    Код:
    int i;
    for(i=0;i<63;i++){
    z[i].num=i;
    z[i].decl();
    z[i].load_ddd(sprites,"pic.dat");
    }
    Самые внимательные наверное еще раньше обратили внимание на функцию load_ddd, конечно же, ведь надо сами картинки этих объектов загрузить, не так ли? В принципе, то как это у меня делается для других пользы практической не представляет, поскольку грузит из собственного формата ddd, так что код я приводить не буду, скажу только что функция рисует объект в определенном квадрате на виртуальной странице, координаты квадрата определяются номером
    объекта по следующей формуле:
    Код:
    int x=(object::num)%20,y=(object::num)/20;
    Потом еще каждый надо умножить на 20 (квадраты 20 на 20 пикселей). В классе есть еще функция draw. Она тоже подходит только для моего частного случая, а точнее для библиотеки Аллегра. Но поскольку она очень короткая, то приведу ее:
    Код:
    object::draw(BITMAP* source,BITMAP* dest, int x, int y,int mode){
     if(mode==0)blit(source,dest,20*((object::num)%20),20*((object::num)/20),x*20,y*20,20,20);
     if(mode==1)masked_blit(source,dest,20*((object::num)%20),20*((object::num)/20),x*20,y*20,20,20);
    }
    Здесь в случае mode=0 рисуется поверх всего, при mode=1 накладывается на уже нарисованное (нужно чтобы можно было одновременно нарисовать поверхность и врага на одном месте например).
    Почему я сделал такую сложную инициализацию, а не написал одну фунцкию, которая просто загружает картинки из файла в виртуальную страницу? Ответ на этот вопрос оставляю вам в качестве домашнего задания, мои маленькие создатели игр:)
    А в следующий раз я расскажу о реальном C++, когда классы используются на всю катушку, на примере NPC, главного героя и врагов, которые все наследуются от одного класса hero.
     
    Последнее редактирование: 29 сен 2006
    Vladar, ~ Lost Hero ~, kis и 5 другим нравится это.
  2.  
  3. beyl

    beyl

    Регистрация:
    9 май 2006
    Сообщения:
    341
    Вот это замечательно. Будет хорошо, если начинающие программисты побыстрее придут к этому. Пусть и не своим умом, но быстрее :) Как раз неплохо будет, если в пару к этой статье у меня дойдут руки написать про свой скроллер, где буквально всё построено на объектах.
     
  4. VadimJ

    VadimJ

    Регистрация:
    8 фев 2007
    Сообщения:
    51
    Интересно, а такие игры создают на Java?
    Понимаю про все эти войны насчет производительности, но все же. Последние версии Java хорошо развиваются в этом направлении.
     
  5. [no]name

    [no]name

    Регистрация:
    5 июн 2005
    Сообщения:
    2.629
    VadimJ, советую взглянуть на Bang! Howdy.
     
  6. The_ShadoW

    The_ShadoW

    Регистрация:
    4 мар 2007
    Сообщения:
    187
    Как показала практика, на java уже можно писать всё, что угодно за минусом крутой 3D-графики. В частности, со спрайтами любой сложности Ява на более-менее не древних машинах управляется на ура.

    А вообще в тему сабжа, прилично-ООПшные игрушки пишутся по стандартной схеме:
    1) Движок a.k.a. та самая фигня, где описана собссно начинка игры;
    2) Сервер a.k.a. кусок, который разруливает сообщения от клиентов движку и от движка клиентам;
    3) Клиент a.k.a. то самое, что видит на экране геймер. То есть кусок общения с пользователем и отрисовки ему на монитор картинки.

    Для случаев, когда сетевой режим заведомо отпадает, клиент и сервер объединяются.
    Такая схема позволяет успешно работать над одним куском относительно независимо от других. Т.е. движок должен реализовывать все правила игры, тестить его можно и без красивой графики; клиент должен рисовать клёвую картинку и принимать команды геймера, опять же протестировать его можно на статичных (без движка) данных.
     
    Последнее редактирование: 18 июн 2007
  7. dimanche13

    dimanche13

    Регистрация:
    12 мар 2007
    Сообщения:
    18
    beyl, а будь добр опиши свой скроллер, мне очень интересно. Я тоже делаю скроллер с ООП. Особый интерес у меня к сохранению карты.
    Решил дополнить: интересно про сохранение триггеров. Так например есть триггер Trigger(x,y,obj) где obj это любой объект от двери до платформы. Просто интересно как сохранить в файле привязку конкретного триггера к конкретному объекту.
     
    Последнее редактирование: 25 сен 2007
  8. ~ Lost Hero ~

    ~ Lost Hero ~

    Регистрация:
    7 июл 2007
    Сообщения:
    352
    оч. полезно. буду ждать продолжения.
    единственный вопрос, почему в классе object используются именно int, а не логические переменные?
     
    Последнее редактирование: 25 сен 2007
  9. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.170
    ~ Lost Hero ~, продолжение было, в каком-то из номеров моего дискмага.
    int используется потому что у меня такой стиль программирования:)
     
  10. dimzon

    dimzon

    Регистрация:
    21 сен 2007
    Сообщения:
    23
    графику тоже можно ;) вот например Quake2 под Java
    на самом деле 95% графики рендерит видеокарта поэтому издержки не высоки ;)
     
  11. ~ Lost Hero ~

    ~ Lost Hero ~

    Регистрация:
    7 июл 2007
    Сообщения:
    352
    Dimouse, как всегда не посмотрел на дату.
     
  12. Wotar <FONT COLOR="#ff0033">Олдгеймер</FONT>

    Wotar

    Регистрация:
    12 авг 2007
    Сообщения:
    407
    dimzon если ты так хорошо разбираешься в различных java проектах, может подскажешь и приличный java фреймворк/библиотеку который используется в серьезных разработках, желательно не для мобильных телефонов :)
     
  13. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    А мне вспомнилось про наследование в играх с ООП , как группировка деревьев или коров сбила из стингеров самолёт в насовском авиасимуляторе
     
  14. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.170
    John Freeman, насколько я помню это были кенгуру.
     
  15. Wotar <FONT COLOR="#ff0033">Олдгеймер</FONT>

    Wotar

    Регистрация:
    12 авг 2007
    Сообщения:
    407
    John Freeman, может напомнишь всем(ссылку), кто не в курсе о чем речь?
    А наследование это всего навсего принцип ООП, и оно не виновато что у программеров руки не оттуда ростут.
     
  16. kkolyan

    kkolyan

    Регистрация:
    22 май 2007
    Сообщения:
    62
    Насколько я понял, GM базируется на объектно-ориентированном языке, это так?
     
  17. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Ссылку? Не кажется что старовата история для ссылки, уже в легенды переросла...
     
  18. Wotar <FONT COLOR="#ff0033">Олдгеймер</FONT>

    Wotar

    Регистрация:
    12 авг 2007
    Сообщения:
    407
    Все равно непонятно зачем винить наследование и т.п. принципы там где виноваты программисты.
     
  19. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.170
    Wotar, а кто-то кого-то в чем-то обвинял?
     
  20. Wotar <FONT COLOR="#ff0033">Олдгеймер</FONT>

    Wotar

    Регистрация:
    12 авг 2007
    Сообщения:
    407
    из собщения John Freeman, коровы наследовали суперкласс который мог стрелять из стингера, так?
    Если да, то такую функциональность не нужно было наследовать и все,
    если неправ, поправьте.
     
  21. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    По простому наследованию не наследовать что то нельзя - можно только оверрайдить ненужную функцию.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление