Пятница, 22 Ноября 2024, 09:51

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Создание ООП движка браузерной игры
likerДата: Понедельник, 10 Декабря 2012, 20:14 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Создание ООП движка-фреймворка для браузерный игры
Кому полезен могут быть эти уроки?
Людям, которые знают основы php, включая ООП.
Что необходимо знать(основы) для понимания того, что здесь будет написано?
PHP, Mysql, JS, HTML, CSS, AJAX
Что будет написано в конечном итоге?
  • Движок(фреймворк) - каркас, на котором можно писать браузерные игры и, возможно, сама игра(с вашими идеями). Движок будет модульным, т.е. необходимые файлы будут подключаться по мере необходимости.
  • Сами модули - авторизация/регистрация, добыча ресурсов и тд
  • Защита от инъекций(PDO - подробнее далее), защита от межсайтовых атак и от скриптинга
  • i10n - интернациональность - возможность быстрого переключения между языками игры(т.е. в настройках указываем к примеру english или russian, и у нас движок подгружает соответствующий файл перевода)
  • Визуальная часть(не уверен что красиво сделаю, я не дизайнер :))
  • Чат с командами для модераторов и админов
    Чего точно не будет?
    Не будет шаблонизатора - скрипта, который позволяет красиво вписывать php код в html(кто захочет, сам легко это сделает)
    Что особенного будет в данных уроках?

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


    Программное обеспечение:


    • В качестве сборки сервера я использую OpenServer(У вас может быть Denwer, XAMPP),
      OS Windows 7 x64(не принципиально)
    • PHP 5.3
    • Mysql 5.5
    • Программа, где пишу код - NetBeans IDE(не принципиально)
    • Веб-сервер Apache 2.2
    • Интерфейс подключения к бд - PDO(не пугайтесь там все очень просто). Функции mysql_query и mysql_connect использовать не будем, это устарелый подход и они признаны разработчиками устаревшими.

    Урок 1. Введение и теория.
    Что же, начнем со структуры:
    Файловая структура:
    Папка, которую читает веб-сервер - public_html(у вас может быть www, public, htdocs, html, htmls, publics) - не принципиально
    Содержание папки public_html

    • Главный файл - index.php - именно он ВСЕГДА будет первым вызывается сервером
    • .htaccess - настройки для веб-сервера, которые нам необходимы
    • папка assets - в ней будут наши стили(css), javascript, и картинки

    Остальные папки, которые лежат на одном уровне с public_html

    • Папка App(от Application)- в ней лежат controllers, models, views(тоже не пугайтесь, ничего сложного)
    • Папка App/Data - в ней лежат, квесты, итемы, информация об игроках
    • Папка Sessions - в ней лежат файлы сессии
    • Папка Logs - в ней лежат логи
    • Папка System - собственно папка, в которой лежит наш фреймворк(движок)
    • Папка Users в ней лежат данные об игроках(ресурсы и тд). Это не значит что данные мы не будем хранить в бд smile Подробнее в след. уроках
    • Папка public_html/Assets - в ней лежат, как видно на скриншоте, js, css, i(картинки)
    • Папка App/i10n(international) - языковые файлы(перевод надписей и тд)

    Скриншот - как это выглядит:

    У веб-сервера есть доступ только к папке public_html, поэтому папки application, system, logs, sessions, data, users не доступны извне (Веб-сервер смотрит только папку public_html)

    Немного теории, ничего сложного:
    MVC- model view controller - схема, при которой мы наш код разделяем на 3 части: запросы к бд+вычисления(model), вывод html/js - view, controller - объект, который обеспечивает взаимодействие между model и view.
    Не бойтесь названий, это просто названия smile
    Мы просто делим код на 3 части:
    Запросы к бд(model) - mysql
    Вывод информации(view) - html/js
    "Главный файл", который объединяет запрос и вывод(controller)
    Схема MVC, применительно для нашего движка:

    Controller - это файл, в котором происходят основные действия(принятие данных, подготовка данных к запросу бд, передача данных в html-файл(view))
    У контроллера есть action(действие), т.е. это метод класса, (action всегда public), который мы вызываем из браузерной строки
    Имя класса = Controller_Имя контроллера,
    т.е. скажем у нас есть адрес http://test.ru/game/inventory
    game - это имя контроллера, класс будет называться Controller_Game, action - inventory(показать инвентарь игрока)
    Model - это файл с запросами к бд(+возможно, вычиления)
    View - это html файл формата .php, в котором мы с помощью php кода выводим данные
    Файлы(Классы) из которых будет состоять движок:
    index.php - главный входной файл
    Папка System:
    core.php - ядро
    request - принятые данные, ip-адрес юзера, очистка принятых данных от опасных данных
    response - исходящие данные, установка заголовков, перенаправление, 404 ошибка
    session - работа с сессией
    router - сопоставление имени файлов и классов в зависимости от параметров строки браузера(роутер)
    databasel - бд
    filemanager - работа с файлами
    lang - класс работы с языком
    logger - запись критических действий пользователя
    view - класс работы с представлениями(view)
    Все остальные файлы - чат, добыча ресурсов, прокачка перса и тд являются классами и хранятся в папке app/classes
    Последовательность работы движка:

    • Файл index.php устанавливает необходимые настроки (язык, временная зона, константы, конфиги, включает буферизацию вывода) и загружает файл core.php(require)
    • В файле core.php содержатся основные действия. Класс Core загружает остальные необходимые файлы: Session, Request, Response, Logger, Router, Database.. и тд, которые находятся в других файлах в той же папке(system)
    • Класс Router берет данные из браузерной строки, и в зависимости от того, что там, загружает нужный файл(контроллер)
    • В зависимости от написанного нами кода, вызванный контроллер обращается к модели(бд), берет данные и выводит их в View(html)
    • Скрипт заканчивается тем, что движок посылает заголовки ответа(Response) в браузер клиента

    А теперь все это визуально

    Итак, теперь как это ОКОНЧАТЕЛЬНО будет выглядеть:


    • Папка application - в ней содержатся наши controllers, models, view, modules
    • Папка data - квестый, файлы игроков
    • Папка logs - логи
    • Папка sessions - сессии
    • Папка system - классы движка, внимание классы Core, Controller, Model, View содержатся в файле core.php!(так удобнее мне, но можно вынести и в отд файлы)
    • Папка public_html - папка, которую "смотрит" веб-сервер, в ней наш файл index.php

    index.php

    .htaccess - все запросы направляются на файл index.php (т.е. запросы типа site.ru/index.php; site.ru/index; site.ru/just.php будет обрабатывать всегда файл index.php)

    Строка RewriteCond %{REQUEST_URI} !\.(css|gif|ico|jpg|js|png)$ обязательна, если вы перенаправляете любой запрос на index.php(ну или другой файл), т.к. современные браузеры
    запрашивают favicon.ico(маленькая иконка сайта) и этот запрос на favicon тоже перенаправляется на index.php, соответственно проходит 2 запроса вместо одного, изза этого могут возникнуть проблемы работы(я 3 дня мучался один раз), + лишняя нагрузка никому не нужна.


    Урок 2. Mysql(PDO)
    Итак, для работы с бд мы будем использовать интерфейс PDO для работы с базой данных.
    У него есть преимущества перед функциями mysql_connect, mysql_query и т.п.:
    - он поддерживатся разработчиком
    - в нем теоретически невозможна SQL-инъекция(на практике не сталкивался)
    - работает быстрее
    Итак, внешне от mysql_connect и т.п. особо не отличается, пишем такие же запросы, просто немного меняется синтаксис команд
    Класс mysql
    mysql.php(находится в папке system)


    Singleton
    Вы наверно уже заметили, что в коде постоянно фигурируют функции getInstance() и объекты нигде не создаются напрямую через Cat = new Cat()//пример
    Такой прием(шаблон, паттерн) называется Singleton(одиночка)
    Это означает, что у класс может быть ТОЛЬКО ОДИН экземпляр объекта. Это нужно для того, чтобы не размножать объекты:
    например, мы по ошибке создали 2 объекта типа mysql, тогда у нас получится 2 соединения с бд, а это не есть хорошо.
    Пример Синглтон предотвращает от этого. Если объекта нет, то он его создает, если есть, то просто возвращает на него ссылку
    Методы private function __construct(){} private function __clone(){} становятся private(закрытыми) и теперь нельзя напрямую создать объект, а только через функцию getInstance();
    Таким образом мы создадим большинство классов.

    Уроки буду делать дальше

    Сообщение отредактировал liker - Понедельник, 11 Марта 2013, 10:51
  • TalcoДата: Понедельник, 10 Декабря 2012, 23:09 | Сообщение # 2
    почетный гость
    Сейчас нет на сайте
    Отлично!!! Это уже похоже на урок, а не на куски кода! Продолжайте в том же духе! только мне кажется, структура далека от идеальности, попробуйте думать "на шаг вперед", хотя... я не знаю, что у вас на уме.
    Пользуясь случаем скажу, если вы хотите быть программистом, то изучайте, долго и усердно, математику! В противном случае, называйте себя не программистом, а кодером!


    xNova: Революция
    likerДата: Понедельник, 10 Декабря 2012, 23:40 | Сообщение # 3
    почетный гость
    Сейчас нет на сайте
    ТЕМУ прошу прикрепить
    Если есть вопросы, задавайте


    Сообщение отредактировал liker - Вторник, 11 Декабря 2012, 14:00
    RioluДата: Вторник, 11 Декабря 2012, 20:40 | Сообщение # 4
    почетный гость
    Сейчас нет на сайте
    Quote (liker)
    Защита от инъекций(PDO - подробнее далее), защита от межсайтовых атак и от скриптинга.

    +1 Защита необходима всегда =)
    Кстати сделай защиту cookie просто их через cURL и т.п, поделать можно =)


    Рoke-x (ММОRPG про покемонов)

    DoGGyДата: Четверг, 13 Декабря 2012, 17:08 | Сообщение # 5
    был не раз
    Сейчас нет на сайте
    Урок отличный! Продолжай в том же духе!
    Оформление мне понравилось и по информации всё понятно, так что замечаний нет.
    likerДата: Четверг, 13 Декабря 2012, 17:13 | Сообщение # 6
    почетный гость
    Сейчас нет на сайте
    хорошо, скоро продолжу smile
    RomantikДата: Четверг, 13 Декабря 2012, 17:16 | Сообщение # 7
    Lost and Forgotten
    Сейчас нет на сайте
    Достаточно подробно, плюс =)
    likerДата: Суббота, 15 Декабря 2012, 09:22 | Сообщение # 8
    почетный гость
    Сейчас нет на сайте
    тему прикрепите уже smile

    Добавлено (15.12.2012, 09:22)
    ---------------------------------------------
    больше почему то не могу в тему дописывать, видно тут лимит на количество символов, надо новую тему сделать

    DreamOffДата: Воскресенье, 15 Сентября 2013, 20:30 | Сообщение # 9
    был не раз
    Сейчас нет на сайте
    Жаль что автор забросил идею. Действительно хороший урок .
    TiendilДата: Понедельник, 16 Сентября 2013, 00:45 | Сообщение # 10
    участник
    Сейчас нет на сайте
    php-шники, у вас же есть фреймворки, которые умеют делать шаблонизацию, разного рода защиты и прочее.
    Начинание хорошее, но зачем учить делать велосипеды, которые будут заведомо хуже качеством, вместо того чтобы взять надёжную либу и сконцентрироваться на игровой логике.


    Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

    Текущий проект: the-tale.org - indie mmozpg
    lvovandДата: Понедельник, 16 Сентября 2013, 00:58 | Сообщение # 11
    старожил
    Сейчас нет на сайте
    Tiendil, новичкам прежде чем пользоваться готовым фреймворком, хорошо бы изучить кухню изнутри, да и при правильном подходе велосипед будет не хуже, а может в чем-то и лучше

    Разработка и продвижение сайтов. Дизайн
    TiendilДата: Понедельник, 16 Сентября 2013, 01:18 | Сообщение # 12
    участник
    Сейчас нет на сайте
    Цитата (lvovand)
    Tiendil, новичкам прежде чем пользоваться готовым фреймворком, хорошо бы изучить кухню изнутри, да и при правильном подходе велосипед будет не хуже, а может в чем-то и лучше

    В документации фреймворков обычно уделено время их внутренней работе, особенно аспектам безопасности, разъяснение там будет куда качественне.
    В данном случае велосипед никогда не будет лучше, чем библиотека написанная и поддерживаемая сообществом. В особенности это касается безопасности, за которой один человек уследит с большим трудом (а точнее всё равно не уследит за каждым аспектом). Базовая безопасность — это как раз то, что в первую очередь следует передоверить проверреной библиотеке, которой доверяет более одного человека. И это именно то, что следует объяснять новичкам в первую очередь, т.к. любая их попытка обойти это правило может обернуться большими проблемами.


    Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

    Текущий проект: the-tale.org - indie mmozpg
    lvovandДата: Понедельник, 16 Сентября 2013, 01:49 | Сообщение # 13
    старожил
    Сейчас нет на сайте
    Tiendil, не берусь обсуждать именно пример ТС.
    Пользование фреймворком предполагает достаточно хорошее владение языком, а в некоторых случаях уже просто установка может вызвать сложности.
    И что остается новичку - смотреть всевозможные фреймворки, пересмотреть кучу холиваров по темам, какой фреймворк лучше или хуже?
    А так разбираясь понемногу в основах, можно уже будет дальше разбираться, и код фреймворка уже пугать не будет, и знаешь в случае чего где, что и для чего в нем.


    Разработка и продвижение сайтов. Дизайн
    likerДата: Суббота, 05 Октября 2013, 23:14 | Сообщение # 14
    почетный гость
    Сейчас нет на сайте
    эх, нету времени уроки писать sad
    higashiДата: Пятница, 15 Августа 2014, 18:27 | Сообщение # 15
    уже был
    Сейчас нет на сайте
    Цитата liker ()
    эх, нету времени уроки писать


    походу и не появиться такой урок шикарный...


    Жить только по кафу
    comcor2014Дата: Среда, 26 Апреля 2017, 08:04 | Сообщение # 16
    был не раз
    Сейчас нет на сайте
    Жалко что такие хорошие идеи не доводятся до конца (
    • Страница 1 из 1
    • 1
    Поиск:

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