Главная страница
Навигация по странице:

  • GLRenderPoint [Нет данных] GLImposterSprite [Нет данных] GLOpenGLFeedBack [Нет данных] GLScene руководство

  • Создание нового класса

  • procedure

  • GLScene руководство новичка , Jat-Studio, 2009 Проба пера : 3D Тетрис

  • GLScene руководство новичка , Jat-Studio, 2009 var

  • Класс 3DTBlock

  • Домашнее задание

  • GLScene руководство новичка , Jat-Studio, 2009

  • GLScene руководство новичка , Jat-Studio, 2009 Ссылки

  • GLScene руководство новичка , Jat-Studio, 2009 Заключение

  • Руководство новичка by JatStudio 2009 glscene руководство новичка, JatStudio, 2009


    Скачать 0.63 Mb.
    НазваниеРуководство новичка by JatStudio 2009 glscene руководство новичка, JatStudio, 2009
    Дата26.02.2019
    Размер0.63 Mb.
    Формат файлаpdf
    Имя файлаGLSceneRUS.pdf
    ТипРуководство
    #68935
    страница5 из 5
    1   2   3   4   5
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    Эта техника используется с
    набором объектов с
    различным количеством полигонов
    , но схожей геометрией
    Низкокачественные объекты ставятся дальше от камеры
    , высококачественные ближе
    GLRenderPoint
    [
    Нет данных
    ]
    GLImposterSprite
    [
    Нет данных
    ]
    GLOpenGLFeedBack
    [
    Нет данных
    ]
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    Создание
    объектов
    во
    время
    выполнения
    приложения
    (Runtime)
    До сих пор мы говорили только о
    функциях и
    особенностях работы с
    GLScene только во время создания проекта
    (design time).
    Но
    , как только вы углубитесь в
    изучении
    GLScene, перед вами встанет необходимость создания объектов динамически во время работы приложения
    (run time).
    Компоненты создаются обычным для
    Delphi путем
    – директивой
    Create.
    Но объекты сцены создаются по
    - другому
    Объекты должны быть зарегистрированы в
    GLScene, проще говоря
    , должно быть указано место создаваемого объекта в
    общей иерархии сцены
    Если мы хотим
    , к
    примеру
    , создать сферу с
    именем
    MyGLSphere как потомка
    GLCube1, то корректный код будет выглядеть примерно так
    :
    var
    MyGLSphere: TGLSphere;
    begin
    MyGLSphere := TGLSphere(GLCube1.AddNewChild(TGLSphere));
    end;
    Этим путем новая сфера будет корректно размещена в
    иерархии сцены
    , как последний потомок
    GLCube1.
    Если же вы хотите сделать эту сферу первым потомком
    GLCube1, то вызывайте функцию
    AddNewChildFirst вместо
    AddNewChild.
    Любой объект может быть перемещен по иерархии сцены с
    помощью функций
    MoveUp и
    MoveDown или изменяя своего родителя через свойство
    Parent.
    Чтобы убрать созданный объект со сцены вызывается функция
    MyGLSphere.Free.
    Создание
    нового
    класса
    Вы также найдете очень полезной возможность унаследовать ваш собственный класс от уже существующего в
    GLScene.
    Этот процесс имеет те же самые правила
    , что и
    для любого другого объекта
    Delphi.
    Давайте
    , к
    примеру
    , создадим ваш собственный класс вращающийся куб
    (spinning cube).
    type
    TGLSpinningCube = class(TGLCube)
    private
    FSpinSpeed: single;
    published
    property SpinSpeed read FSpinSpeed write FSpinSpeed;
    public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure DoProgress(const progressTime: TProgressTimes); override;
    end;
    constructor TGLSpinningCube.Create(AOwner: TComponent);
    begin
    inherited;
    FSpinSpeed := 1000;
    end;
    destructor TGLSpinningCube.Destroy;
    begin
    inherited;
    end;
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    procedure TGLSpinningCube.DoProgress(const progressTime: TProgressTimes);
    begin
    inherited;
    TurnAngle := TurnAngle + progressTime.DeltaTime * FSpinSpeed;
    end;
    Отличие от стандартного способа
    Delphi здесь только в
    присутствии события onProgress. ProgressTime используется вместе с
    DeltaTime.
    Вы также должны вызвать директиву inherited, иначе объект не будет реагировать на события вообще
    Чтобы создать объект
    , описанный вашим классом
    , используйте технику
    , описанную ранее в
    этой главе
    , или регистрируйте класс в
    GLScene и
    добавляйте его с
    помощью
    GLSceneEditor.
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    Проба
    пера
    : 3D
    Тетрис
    В
    этой главе мы рассмотрим основы создания простой игры
    Тетрис с
    помощью
    GLScene.
    Я
    не буду писать лишь только код
    , сосредоточимся в
    основном на структуре проекта игры
    Попробую излагать все как можно проще
    Я
    сразу сообщаю вам
    , что описанный здесь способ создания
    3D
    Тетриса не самый лучший
    У
    меня нет рабочего кода игры
    , это скорее мини дизайн
    - документ
    Дизайн
    Чтобы нам было проще
    , мы будем создавать клон старого доброго
    Тетриса
    Третье измерение здесь будет добавлено только ради внешнего вида
    Фактически это будет
    2.5D
    Тетрис
    Камера будет смотреть на сцену с
    интересного ракурса
    Блоки будут составлены из кубов
    , вместо квадратов
    Не будет никаких меню
    Игра начнется сразу после того
    , как приложение будет запущено и
    будет ждать нажатия определенной кнопки для начала
    В
    течение игры метка
    (Label) будет указывать количество достигнутых очков
    После окончания игры на экран будет выведена информация о
    результатах
    В
    классическом
    Тетрисе количество фигур и
    блоков фиксировано
    Мы сделаем случайную форму фигуры при создании
    Блок будет иметь фиксированную скорость спуска
    Игрок может двигать блок влево
    , вправо и
    вращать его как по часовой стрелке
    , так и
    против
    Управление будет организовано с
    клавиатуры
    Структура
    Мы будем использовать компоненты
    GLScene, GLSceneViewer, GLCadencer, и
    GLWindowsBitmapFont.
    Игровая площадка будет размером
    11 единиц в
    ширину по оси
    X и
    21 единицу в
    высоту по оси
    Z.
    Поместим камеру на отрицательную ось
    Z.
    Чтобы сцена отображалась видом сверху справа
    Одна плоскость сформирует пол игровой площадки на позиции
    [0, 0, -0,5], а
    два высоких
    GLCube образуют ее боковые границы на позициях
    [-6, 0,
    10] и
    [6, 0, 10] соответственно
    , высота
    10 единиц
    Все эти объекты легко создаются во время design time.
    Не забудьте также установить источник света на сцену
    Вы можете разместить его так
    , как вам больше нравиться
    Будем использовать игровую логику
    , чтобы определить столкновения падающих объектов
    Игровое поле будет представлено как массив параметров типа single.
    var
    FloodLevels: array [-5..5] of single;
    Каждый элемент этого массива определяет
    , до какой высоты произошло заполнение стека уже упавших кубиков по столбцам в
    течение игры
    Каждый блок
    , таким образом
    , будет надежно размещен в
    игровом поле и
    не провалится неожиданно сквозь какой
    - нибудь ниже лежащий блок или не зависнет в
    пространстве над ним
    Так как позиции надежно закреплены в
    стеке массива
    И
    только после того
    , как блок остановит свое падение
    , произойдет увеличение стека массива
    FloodLevels и
    будет рассчитана новая высота для падения на нее других блоков
    В
    начале игры значения массива равны нулю
    , так как на игровом поле нет ни одного упавшего блока
    Значения
    , сохраненные в
    массиве
    FloodLevels обозначают центры кубов
    Фактически позиции граней кубиков будут на
    0,5 единиц больше сохраненных в
    массиве значений
    Чтобы определить нажатые пользователем клавиши будем использовать функцию
    IsKeyDown из модуля
    GLScene – Keyboard.pas.
    Это довольно простой метод
    , используемый чтобы засекать нажатие клавиш
    Мы определим пять возможных действий пользователя
    :
    T3DTInput = (inpNone, inpMoveL, inpMoveR, inpRotateL, inpRotateR);
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    var
    UserInput: T3DTInput;
    Состояние клавиатуры будет зафиксировано в
    событии onProgress GLCadencer и
    сохранено в
    глобальной переменной
    UserInput.
    UserInput := inpNone;
    If IsKeyDown(VK_LEFT) then UserInput := InputMoveL;

    Я
    бы хотел сказать пару слов о
    фиксировании ввода клавиатуры и
    мыши
    Всегда необходимый минимум кода для фиксирования ввода с
    управляющего устройства
    (
    контроллера
    ) приводит к
    использованию глобальной переменной
    Особенно событие
    OnMouseMove может вызвать большое замедление
    , если вы пишете в
    нем слишком много кода
    . Windows наделяет первоприоритетной задачей обработку событий мыши
    , перед другими процедурами
    И
    если вы пишете сложный код в
    этих событиях
    , то система переполняется попытками обработать малейшее движение мыши
    Поэтому для обработки события
    OnProgress GLCadencer остается недостаточно системных ресурсов
    Большинство в
    основном прописывают в
    OnMouseMove Mouse.X := X; и
    Mouse.Y := Y.
    Информация о
    текущем счете обновляется каждый шаг
    GLCadencer через объект
    GLHUDText, расположенный в
    левом верхнем углу сцены
    Класс
    3DTBlock
    В
    основе нашего приложения используем новый класс
    , создав его из
    GLDummyCube.
    Этот класс будет представлять конкретные собранные блоки
    . GLDummyCube будет отвечать за вращение и
    движение всего блока
    , как единого целого
    В
    потомках у
    него будут
    GLCube – составные части блока
    У
    каждого куба будем сравнивать его координату
    Z со значениями
    FloodLevels, чтобы засечь столкновение
    Будем использовать функцию
    Round, чтобы считывать значение координаты
    X кубиков
    Блок первоначально будет создан в
    позиции
    [0, 0, 0].
    Один центральный кубик
    GLCube будет добавлен к
    каждому блоку в
    позицию
    [0, 0, 0].
    Случайное количество кубиков
    GLCube будет добавлено по разные стороны от центрального
    Таким образом
    , блок сформируется в
    виде креста
    , L- линию или прямую
    Пять кубов в
    ряду
    – максимальное значение
    Размер кубиков будет
    0,95 единиц
    Они будут размещены в
    позиции
    [1, 0, 0], [2, 0, 0], [0, 0, 1], [0, 0,
    2], [-1, 0, 0] и
    так далее
    Координата
    Y у
    всех кубов будет неизменной все время и
    будет равна
    0.
    После того
    , как все кубы будут созданы
    , блок будет помещен в
    стартовую позицию
    – ровно над игровым полем со случайной координатой
    X.
    Статус
    (
    переменная типа
    Boolean) созданного и
    размещенного на стартовой позиции блока будет изменен
    Active := True.
    Блок будет активен во время спуска
    , но
    , как только он приземлиться на основание или другой блок
    , мы изменим его переменную
    Active на
    False.
    Если куб активен
    , то перемещаем его потихоньку вниз по оси
    Z, в
    течение события
    OnProgress этого куба
    :
    Position.Z := Position.Z – deltaTime * speed;
    Теперь проверим столкновения
    Мы должны проверить все потомки и
    сравнить их абсолютные позиции с
    обеими сторонами
    (X < -5 и
    X > 5) и
    основанием
    (Z < 0) игровой площадки
    Мы также должны проверить столкновения с
    блоками
    , уже существующими в
    игровой площадке
    var
    absPos: TVector;
    setVector(absPos, Children[i].AbsolutePosition);
    if (absPos[2] - 1) < FloodLevels[Round(absPos[0])] then
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    Этот фрагмент кода обнаруживает
    , проверяя все
    Children[i], ниже параметры куба
    , сохраненных в
    FloodLevels или нет
    Абсолютная позиция куба сохранена в
    переменной absPos.
    Это важный момент
    , так как абсолютная позиция
    – это реальная позиция объекта в
    мировой системе координат
    В
    то время как просто позиция
    – позиция объекта относительно родителя
    При сравнении с
    компонентом массива
    FloodLevels, абсолютное значение параметра
    X куба должно округляться
    Если куб коснулся земли или другого куба
    , то его свойство
    Active устанавливается в
    False, добавляем очки к
    общему счету игры и
    информируем программу о
    том
    , что следующий блок может быть создан
    Чтобы реагировать на действия пользователя
    , мы проверяем в
    каком состоянии находится переменная
    T3DTInput и
    производим
    , в
    соответствии с
    ним
    , определенные действия
    :
    case Form1.UserInput of
    inpMoveL: Slide(-1);
    inpMoveR: Slide(1);
    inpRotateL: Pitch(-90);
    inpRotateR: Pitch(90);
    end;
    Slide и
    Pitch – функции
    GLScene для движения и
    поворота объекта
    Теперь мы должны снова проверить столкновения и
    отменять движение или вращение
    , если новая позиция выходит за границы игрового поля
    И
    последний момент
    – это обнаружение окончания игры
    Это может быть сделано в
    событии
    OnProgress GLCadencer.
    Мы можем просто проверить массив
    FloodLevels на значение большее
    20.
    И
    , если это так
    , то отключаем
    GLCadencer и
    выводим сообщение о
    набранных игроком очках и
    информацией о
    том
    , что игра закончена
    Домашнее
    задание
    Что есть то есть
    Теперь достигнутые вами вершины позволяют сделать не только довольно простой
    Тетрис
    , но и
    , основываясь на использованных наработках
    , более сложные проекты
    Я
    выбрал этот пример
    , чтобы показать вам мощь
    GLScene.
    Вы можете создавать дизайн игры не только во время разработки приложения
    , но и
    во время его выполнения
    Вы также знаете
    , как пользоваться функциями вращения и
    движения объекта вместе со всеми его потомками
    Код
    , копирующий поведение всех объектов
    , без использования этих функций был бы довольно сложный
    В
    последнем параграфе я
    дам вам еще больше идей для создания вашего собственного проекта
    :

    Сделайте какой
    - нибудь интерфейс
    Любая программа нуждается в
    меню
    Используйте стандартные компоненты
    Delphi или
    GUI компоненты
    GLScene.

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

    Сделайте реалистичные столкновения с
    использованием
    CollisionManager и
    позвольте блокам вращаться и
    перемещаться плавно
    Причем это создаст больше проблем
    , ведь блок может столкнуться во время вращения

    Добавьте звук и
    музыку
    Игрок должен слышать ответный звук на свои действия

    Сделайте игру настраиваемой
    – звук
    , графика
    , управление
    , размеры игрового поля и
    блоков

    Сделайте таблицу игрового счета
    , с
    лучшими результатами и
    возможностью сохранения имени игрока

    Сделайте более интересным внешний вид
    Текстурируйте блоки разнообразными текстурами
    Добавьте эффекты частиц
    , SkyBox, LensFlare.
    Игру
    , например можно разместить в
    каньоне с
    мостом наверху
    По мосту можно пустить автомобили
    , поезда
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    Или
    , например
    ,
    Кинг
    -
    Конг на вершине двух небоскребов бросает вниз блоки
    Здесь дизайн ограничен только вашим воображением

    Добавьте игре третье измерение
    Но будьте осторожны
    , много римейков старых двухмерных игр не стали востребованными из
    - за слишком сложного геймплея
    Тщательно продумайте управление камерой
    Сцена может делать задержки
    , при переустановке камеры
    Сделайте некоторые блоки прозрачными
    Сделайте сетку по осям
    X, Y и
    Z для упрощения ориентации

    Напишите какую
    - нибудь историю
    Тетриса
    Теперь это уже полноценная игра
    !
    Позвольте дать вам один последний совет
    Программирование
    – это нечто большее
    , чем просто код
    Это прежде всего творческий процесс
    Используйте не только техническую документацию
    , чтобы улучшить ваш проект
    В
    интернете есть много статей
    , описывающих программирование не только с
    технической стороны
    Пользователи сейчас более разборчивы
    , чем некоторое время назад
    Ваше приложение должно быть дружественным к
    пользователю
    Даже если вы делаете freeware приложения
    , все равно старайтесь чтобы пользователь получил удовольствие от использования вашего проекта
    В
    конце концов вы можете просто продавать ваши приложения
    !
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    Ссылки
    http://www.glscene.org/
    Домашняя страница
    GLScene http://www.opengl.org/
    Официальный
    Web- сайт
    OpenGL http://www.glscene.ru/
    Русский сайт
    GLScene http://www.gamedev.ru/
    Русский сайт игроделов
    GLScene довольно успешный и
    постоянно развивающийся проект
    , потому что над ним постоянно работает большое сообщество программистов
    Многие люди вносят свой вклад в
    его развитие и
    поддержку
    Сделайте свой вклад и
    вы
    GLScene
    руководство
    новичка
    , Jat-Studio, 2009

    Заключение
    Если вы дочитали эту книгу до конца
    , то у
    вас уже сложилось впечатление об основах организации
    GLScene, принципах программирования с
    его использованием и
    его возможностях
    Теперь я
    могу предложить вам просмотреть демки
    GLScene.
    Если вы не понимали
    , каких либо тонкостей
    , то теперь вам должно быть понятно
    , что и
    как там организовано
    Иногда трудно найти какую
    - нибудь функцию или процедуру среди несметного количества особенностей
    GLScene.
    Но все функции имеют довольно осмысленные имена и
    кто ищет
    , тот всегда найдет
    !
    После того как вы ознакомитесь с
    основными демо
    - приложениями и
    поймете их суть
    – вы сможете создавать действительно сложные приложения с
    помощью этого прекрасного пакета компонентов
    GLScene.
    Удачи вам
    !
    Jat-Studio 2009
    Эта книга является вольным переводом с
    дополнениями книги
    , написанной в
    2005 году неким
    Jan Zizka, которого я
    к сожалению не знаю
    , но очень благодарен ему за книгу
    1   2   3   4   5


    написать администратору сайта