ria pc game
translate to English   translate to Chinese
fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Сегодня
17 февраля 2019 21:17
Вход Регистрация Забыли пароль ?

megainformatic - Как создать игру Создание игровых панелей и индикаторов
Как создать игру - Создание игровых панелей и индикаторов [к содержанию] В любой или почти любой игре Вы встретите некоторое количество игровых панелей или различных игровых индикаторов.
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - Урок 4 Построение класса приложения

megainformatic - Урок 4 Построение класса приложения - Страница 2

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов

megainformatic - Урок 5 Построение классов игровых объектов и других необходимых классов - Страница 2

megainformatic - Урок 6 Игровая логика

megainformatic - Заметки по joomla - JFolder::create: Path not in open_basedir paths. Что это?

megainformatic cms express files - Добавление статей на сайт под управлением megainfromatic cms express files

megainformatic - Урок 7 2D-анимация

megainformatic - Урок 8 Загрузка/Сохранение текущей игры, режим паузы, режимы часов/будильника, запуск браузера Internet Explorer для показа сайта разработчика и других интернет-ресурсов

megainformatic - Урок 9 Тестирование и отладка приложения

megainformatic - Мои Музыкальные Миры

megainformatic - уроки Photoshop free

megainformatic cms express

megainformatic cms express

megainformatic cms express

megainformatic cms express files

megainformatic - Методы создания растровых изображений в Adobe Photoshop

megainformatic - Создание фотореалистичной текстуры травы

megainformatic - Рабочее пространство Adobe Photoshop

megainformatic - Бесшовные (тайловые) текстуры

megainformatic - Создание изображений огня, воды, неба

megainformatic - Создание текстур горных пород и суши (урок 5)

megainformatic - Рисование персонажей (урок 6)

megainformatic - Рисование фона (урок 6 часть 2)

megainformatic - Рельефные изображения

Добавление статей на сайт под управлением megainformatic cms express

megainformatic - Воспроизведение файлов в форматах it, xm, s3m, mod

megainformatic - Воспроизведение файлов в форматах it, xm, s3m, mod - страница 2

megainformatic - Воспроизведение в игре музыки в формате XM

megainformatic - Воспроизведение файлов в формате OGG Vorbis

megainformatic - игра "Веселый Буквоежка" - инструменты разработки

megainformatic - Игра "Веселый Буквоежка" - история создания проекта

megainformatic - Как анимировать паука ?

megainformatic - Уроки Photoshop

megainformatic - Купить Уроки Photoshop - Чудеса

megainformatic - Купить Уроки Photoshop - Рисуем и Анимируем

megainformatic - Эмулятор игры Ну, Погоди!

сайт megainformatic - Говорящий Комикс Веселый Буквоежка

megainformatic - Что нужно для создания собственного сайта ?

megainformatic - Моделируем девушку в 3d используя 3ds max

megainformatic - Уроки Fruity Loops Studio - пишем свою музыку

megainformatic - Уроки Fruity Loops Studio - пишем свою музыку - урок 1 - Быстрый старт

megainformatic - Сброник статей по дизайну и компьютерной графике. Обзор.

megainformatic - Уроки 3d на delphi directx - Вывод Заставки

Добро пожаловать в систему управления сайтом megainformatic cms

megainformatic - Создание эскиза и макета страницы сайта

megainformatic - Верстка созданного макета

megainformatic - Добавление модулей обеспечивающих минимально необходимый функционал

megainformatic - Основы добавления контента на сайт, управления и поддержки сайта

megainformatic - Проверка работы сайта, установка на хостинг

megainformatic - Основы продвижения созданного сайта

megainformatic - Создание шаблонов

megainformatic - Создание интернет-магазина

megainformatic - Музыкальные миры - композиция Морозное утро - 10 версий

ЛЕТО

megainformatic - Нечто Необъяснимое - пре релиз

подробнее

Эмулятор БК-0010.01

Ну вот наконец-то, пришло время продемонстрировать Вам эмулятор БК-0010.01.

Сегодня мы рассмотрим эмулятор БК-0010.01 версии 2.6 написанный Юрием Калмыковым в 2002 году.

Э-эх ! Сколько времени утекло с тех пор. С тех самых пор, как у меня появилась моя первая БК-0010.01 - в далеком 1992 году.

Электроника БК-0010.01

фото взято с сайта http://ibnteo.klava.org/project/bk0010

Заметьте, что с появления БК-0010.01 (начал выпускаться с 1983 г) до появления его эмулятора (конец 1990-х - начало 2000-х) прошло всего-то 10-15-20 лет - т. е. срок относительно небольшой. Чем реально может быть Вам полезен эмулятор ?

На нём можно научиться программировать. Для этого есть специальная литература, которую легко можно найти в сети (об этом см. ниже). Включив эмулятор, почти сразу же можно начать программировать на бейсике. Можно даже сохранить полученную программу на диск, а затем загрузить снова - эмулятор позволяет работать с файлами образов своей памяти. Писать программы в машинных кодах - чуть сложнее - но тоже можно - опять же поможет чтение спец. литературы, возможность сохранять и загружать результат. Конечно Вам понадобятся еще специальные программы для БК-0010.01 - ассемблеры, дизассемблеры. Есть еще возможность работать с образами флоппи-дискет в операционной системе для БК - MK-Dos.

Как видите - эмулятор - это вовсе не такая уж бесполезная музейная вещь, а вообщем-то работоспособная программа - моделька простой ЭВМ на которой очень легко освоить азы программирования и по-сути понять как устроены компьютеры. Поскольку и современные компьютеры и ноутбуки - за которыми Вы сидите сейчас и читаете данный текст, устроены всё по тем же самым принципам - на которых работал их дедушка - БК 0010.01. Современные ПК - это всего лишь более продвинутые устройства (в плане их принципов работы, архитектура их конечно же намного сложнее, но простым пользователям не нужно вдаваться в эти детали - с их точки зрения - эмулятор БК - это удобный полигон для экспериментов, а какая-то более продвинутая программа типа MSVS или Delphi на которой можно писать программы для современных ПК - это уже вещь более сложная и требующая определенного опыта для освоения, а также кучу времени). Так что БК-0010.01 это наша история. Которая никуда не делась и продолжает жить своей жизнью.

Свою БКшку я к сожалению сфотографировать уже не могу, т. к. она канула в небытие. Это отдельная история, которую Я как-нибудь вам расскажу. А сейчас вернемся к нашему Эмулятору БК-0010.10

Вот он наш, красивый и успешный - показывает как работает игра Терминатор 2.

Эмулятор БК-0010.01 показывает игру Терминатор 2

Я запускал эмулятор под Windows различных версий. Так что думаю он должен у Вас работать. Если нет - попробуйте в настройках приложения выставить режим совместимости.

Собственно что умеет делать эмулятор БК-0010.01 версии 2.6 ? Он умеет показывать реальную работу БК-шки в полноцветном режиме 256х256 точек при 4х цветах. Есть также монохромный режим где отображаются те же цвета, но в таком представлении, как если бы они отображались ч/б монитором.

Эмулятор БК-0010.01 показывает игру mcchess в монохромном режиме

На рисунке я показал, как выглядит экран в черно-белом (монохромном) режиме при игре в программу под названием mcchess т. е. в шахматы - достаточно убрать галочку (как показано на рисунке). В своё время, помнится году этак в 1993м или даже раньше я иногда играл в эти самые шахматы на БКшке. Правда монитор был у меня старинный и черно-белый. Но зато компьютер был свой собственный, а не в каком-то компьютерном центре, где чтобы поиграть всего несколько минут надо было заплатить 1 советский рубль или даже больше. Игры Каратэка, там конечно не было (имею в виду на моей БК-шке), но были игры даже очень ничего.

У моих друзей были ZX-Spectrum'ы. БКшка, конечно не конкурент ZX-Spectrum, но главное отличие её было в том, что все игры были на русском языке. Правда игр было не так много как на Спектрум, да и достать их было сложнее. Однако скоро я узнал, что в Ленинграде, а потом уже в Санкт-Петербурге, есть некая фирма КИ-ЧПМ, в которой по почте можно было заказывать кассеты с играми для БК-0010.01. Вот это была прекрасная пора. Закажешь бывало кассету и ждёшь потом с нетерпением когда же её пришлют. Ну а уж когда пришлют - играешь не наиграешься. Правда, что плохо - какая-то часть игр на кассетах ни в какую не хотела работать из-за ошибки загрузки. Поэтому к сожалению во многие игры так и не удалось поиграть, хотя во многие всё-таки удавалось.

Моё счастье было в том, что помимо кассетника (т. е. кассетного бытового магнитофона Скиф), у меня еще был магнитофон катушечный (название уже не помню, он где-то пылится сейчас под кроватью на даче :)))) Так вот - игры переписанные с кассетника на катушечный читались значительно лучше и без ошибок. Ну это и понятно - качество записи/воспроизведения на катушечном магнитофоне было в несколько раз выше - там и скорость была вдвое выше (9 м/с вместо 4 на кассетном) и даже был режим 19 скорости (но я его для записи игр не применял т. к. при этом помещалось их на катушку вдвое меньше), да и лента магнитная шире была. Вообщем с кассетника игры можно было лишь переписывать на катушки. А играть уже читая с катушечного. Тогда ошибок загрузки практически не было. А если и были - то достаточно было протереть головку катушечного магнитофона тампоном смоченным в спирте. Немного подождать и ... вперед играть !

Ну что же, что было то было, с магнитофона мы ничего загружать уже не будем. Т. к. у нас слава богу есть эмулятор. А это как вы сами понимаете - огромный прыжок по сравнению с маленьким шажком того, как если бы к БКшке у вас вместо магнитофона появился НГМД или FDD, т. е. попросту флоппи-дисковод. Я конечно в те времена о таком даже мечтать не мог. Но вот эмулятор БК-0010.01 версии 2.6 позволяет имитировать и то и другое. Т. е. можно загружать игры как из файлов так и с образов дискет. Ждать по 3 и больше минут пока загрузится игра тоже не нужно. Т. к. в эмуляторе игры грузятся почти мнгновенно.

Сначала покажу как загрузить игру обычным способом. Включаем эмулятор. На экране у нас появится обычная картинка - Бейсик Вильнюс. Тоже самое как вы понимаете, появлялось и на реальной БК-0010.01 при её включении. Мы попадали в бейсик и могли собственно писать программы на этом языке программирования. У меня где-то даже сохранилась книжка про программирование на бейсике, фокале и в машинных кодах для БК-0010.01. Правда искать её сейчас я не буду. Цель у нас другая. Но вы при желании можете поискать эту книжку в сети. Автора вот правда я тоже не помню. Но будет время - поищу книжку и напишу сюда. Кстати нашел я название книжки и автора - на это потребовалось буквально пара секунд в гугле - Митрюхин В.К. Донской А.Н. Михайлов А.В. Немов А.М. ПРОГРАММИРОВАНИЕ НА БК - 0010 - 01. Так что почитав её Вы можете буквально взять и начать писать программы для БК-0010.01 - эмулятор кстати позволяет сохранять образы памяти в файл. Так что можно в принципе написать небольшую (или даже большую) программу и сохранить её потом. Можно ли сохранить их в отдельный файл для использования в эмуляторе или вставить в образ img диска ? Наверное можно. Я пока не разбирался с этим вопросом.

Разберемся как загрузить обычную игру. Итак. Как я уже говорил мы находимся в Бейсике.

Эмулятор БК-0010.01 показывает Бейсик

В комплекте с эмулятором есть набор папок (скачать это всё можно будет по ссылке ниже). В частности там есть папка Bin, в которой записано более 200 файлов. Это в основном игровые программы. Также есть папка Img в которой есть 10 образов дискет также с работающими играми и программами. На скриншоте выше был как раз показан экран с игрой Терминатор 2, запущенный из операционной системы MKDos с образа флоппи-диска.

Итак, всё, что нам нужно, чтобы запустить игру как если бы мы на реальной БК-шке хотели бы загрузить её с магнитофона:

Напишем команду MONIT и нажмём клавишу Enter.

Эмулятор БК-0010.01 показывает Бейсик, вводим команду MONIT

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

Итак, написав MONIT и нажав Enter, мы оказались в так называемом "мониторе" - специальной программе, наподобие упрощенной операционной системы зашитой в ПЗУ БКшки, а в эмуляторе используется образ этой ПЗУ, образ естественно взят с реальной БК.

Эмулятор БК-0010.01 показывает мониторную систему для загрузки программ в машинных кодах

Тут просто пишем M и жмём клавишу Enter.

Эмулятор БК-0010.01 показывает мониторную систему для загрузки программ в машинных кодах - Тут просто пишем M и жмём клавишу Enter.

Появится надпись: ИМЯ?

Эмулятор БК-0010.01 показывает мониторную систему для загрузки программ в машинных кодах - Тут просто пишем M и жмём клавишу Enter - Появится надпись: ИМЯ?

Требуется ввести, естественно, не ваше имя, а название программы, которую Вы хотите загрузить. В реальной БКшке надо было написать правильно название файла ЗАГЛАВНЫМИ или строчными буквами, именно так как был назван файл, а затем включить магнитофон, перемотать ленту к нужному месту, включить воспроизведение и нажать клавишу Enter. Дальше ждать - пока загрузится игра. Если Вы перемотали ленту не к тому месту, то может быть ошибка загрузки т. к. правильный файл найден не был. Либо ошибка может быть и при загрузке правильного файла. Но это уже по другим причинам.

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

Эмулятор БК-0010.01 показывает мониторную систему для загрузки программ в машинных кодах - Тут просто пишем M и жмём клавишу Enter - Появится надпись: ИМЯ? Нужно нажать Enter и выбрать нужный загружаемый файл.

Далее эмулятор загрузит выбранный файл (на рисунке видно, что я открывал эти файлы из той самой папки Bin, которая приложена к эмулятору), как если бы Вы загрузили этот файл на реальной БКшке с магнитофона. Для примера я загрузил игру Circler. Игра правда сразу не запустилась. Надо еще ввести команду S и нажать Enter. После этого игра запустится. Попробуйте сами (скачать архив с эмулятором и со всеми нужными файлами можно по ссылке внизу страницы) - загрузите и запустите игру Circler и убедитесь, что всё у вас работает. Если да - можно попробовать загружать какие-то еще игры. Если игра зависла (такое иногда бывает) или она вам надоела или еще какая-либо причина - то вовсе не обязательно сразу же выключать эмулятор.

Эмулятор БК-0010.01 показывает игру Circler - начальную её заставку

Эмулятор БК-0010.01 показывает игру Circler

Достаточно выбрать пункт меню CPU - Reset - и БКшка будет перезагружена как будто у неё выключили и снова включили питание. У реальной БКшки тоже не было клавиши Reset, как например у IBM PC совместимых компьютеров. Но имитировать Reset тоже можно было. Для этого можно было замкнуть определенные контакты в месте где подключались блоки расширения с языком Фокал. Я сейчас уже не помню, что именно там надо было замыкать, но проще было именно выключить питание. Ну а в эмуляторе как видите это сделать еще проще - вы делаете Reset - сброс - и снова можете загрузить какую-либо другую программу.

Далее я расскажу как запускать игры с образов дисков img, а также Вы найдете ссылку на архив который содержит всё нужное вам добро - это эмулятор, нужные ему файлы и папки, а также указанные здесь папки Bin и Img с играми и образами флоппи-дисков для БК 0010.01.

Эмуляция работы с флоппи-дисководом осуществляется выбором пункта меню - CPU - Run BK0010(01) with FDD + extended 16K - т. е. эмулируется подключенный флоппи-дисковод и дополнительное пространство памяти в 16 Килобайт.

Эмулятор БК-0010.01 с эмуляцией флоппи-дисковода и 16Кб доп. памяти

Как только Вы включаете эту опцию ваша виртуальная БКшка, т. е. эмулятор БК-0010.01 версии 2.6, переходит в мониторную систему. Вам достаточно лишь ввести команду - S160000 и нажать клавишу Enter. Это приведет к запуску начального загрузчика с системной дискеты. По-умолчанию образ диска MK-DOS смонтирован на виртуальный дисковод A.

Эмулятор БК-0010.01 с эмуляцией флоппи-дисковода и 16Кб доп. памяти - команда S160000 - запуск начального загрузчика системной дискеты

Но прежде чем сделать это, вам нужно убедиться, что виртуальный диск A у БКшки содержит подключенный образ MK-DOS, а на диск B подключен какой-либо еще образ, с которым можно работать. Это можно проверить так, как показано на рисунке ниже - выбрав пункт меню Options > Disk Image Manager

Эмулятор БК-0010.01 с эмуляцией флоппи-дисковода и 16Кб доп. памяти - показывает какие образы и на какие виртуальные диски смонтированы

Эмулятор БК-0010.01 с эмуляцией флоппи-дисковода и 16Кб доп. памяти - показывает какие образы и на какие виртуальные диски смонтированы

Итак, если всё сделано как показано на рисунках, то вводим S160000 и нажимаем Enter. При этом у вас загрузится MK-DOS как показано на рисунках ниже.

Эмулятор БК-0010.01 с эмуляцией флоппи-дисковода и 16Кб доп. памяти - запуск MK-DOS - начальная заставка

Сначала отобразится начальная заставка как на рисунке ниже, а затем панель файлового менеджера напоминающего оболочку Norton Commander для IBM PC. У современных компьютеров и ноутбуков обычно популярен Total Commander. Norton Commander был первой такой оболочкой появившейся на IBM PC для MS-DOS. А на БКшке как видим нечто похожее. Мне к сожалению не довелось увидеть MK-DOS на реальной БК 0010.01, я вижу её впервые как и Вы, в эмуляторе. Но напоминает она мне именно Norton Commander - потому что много позднее, я с ней сталкивался и работал уже на IBM PC совместимых компьютерах.

Итак, в правой половине экрана как видим отображается содержимое диска A, а в левой - B. Клавишей TAB можно переключаться с одной панели на другую делая её активной. Если переключиться на панель с диском B, то клавишами стрелок можно выбрать нужный файл, который мы хотим загрузить с дискеты и запустить. Нажимаем Enter - и файл запустится. Для проверки советую запустить файл TERMINATOR2. Должна будет загрузиться игра TERMINATOR2. Если всё получилось - значит можно попробовать нажать Reset (CPU > Reset CPU), что вернет вас снова в файловый менеджер. И пробовать загружать другие игры или программы.

Эмулятор БК-0010.01 с эмуляцией флоппи-дисковода и 16Кб доп. памяти - отображает панель файлового менеджера напоминающего оболочку Norton Commander для IBM PC

Скачать самораспаковывающийся архив bk_emul.exe содержащий папки BK 0010(01) Emulator v2.6, bk11_50b, for_bk и файл установщика bk_emulator_v26.exe можно по ссылке ниже -

скачать самораспаковывающися архив bk_emul.exe содержащий папки BK 0010(01) Emulator v2.6, bk11_50b, for_bk и файл установщика bk_emulator_v26.exe

Архив содержит папку с установленным эмулятором БК-0010.01, а также все необходимые файлы и папки. Он готов к работе и его сразу можно запускать - двойным кликом по файлу BK.exe внутри папки BK 0010(01) Emulator v2.6. Архив также содержит исталлятор bk_emulator_v26.exe - на случай если Вы захотите установить эмулятор из инсталлятора. Но принципиально он ничем не отличается. Просто также распакуется. В папке bk11_50b есть файлы другого эмулятора - БК-0011, но он в Windows не работает. Возможно будет работать в DosBox, пока не проверял. Также есть там папка for_bk в которой вложенные архивы с образами дисков БК, некоторые из образов уже есть в папке BK 0010(01) Emulator v2.6/Img/ в распакованном виде, а другие вы можете сами распаковать и разместить в этой папке, чтобы потом подключать образы и работать с ними.

Это всё на сегодня про Эмулятор БК-0010.01, но если у вас остались какие-то вопросы - пишите.

подробнее

Creating game on fle game engine - Simple game / Создание игры на fle game engine - Simple game

3. Наложение объектов



read paper in english

Пришло время Выяснить, как мы собираемся имитировать падение шарика в ямы.





Содержание

страница 1 - Спрайты

страница 2 - Объекты

страница 3 - Наложение объектов

страница 4 - Код - Настройка параметров Scene Editor fge и написание кода для вывода спрайта шарика в вашем первом игровом приложении

страница 5 - Отображаем прыгающий шарик

страница 6 - Загрузка игровой сцены

страница 7 - Перемещения игровой сцены

страница 8 - Закрываем часть сцены от пустот при помощи черной текстуры с прорезью, ограничиваем перемещение сцены

страница 9 - Реализуем корректное попадание в ямы и около ям - определяем границы спрайтов ям и спрайта прыгаюшего шарика

страница 10 - Проверка столкновений

страница 11 - Игровой счёт, звуки, музыка

урок #2 страница 1 - Создание новых сцен для игры simple game, расширенная версия simple game extended

13. Скроллинг больших локаций

14. использование переменных в игре на c++ directx 9c

15. Мульти анимация







Нет ничего невозможного, вероятно Вы догадались, что всего лишь нужно взять блок floor_front, задать для него правильные масштабные коэффициенты xScale, yScale, поскольку они изменятся, а также по описанной ранее методике задать значение z = 0.76

После этого просто вставить эти блоки в нужных местах сцены, там где есть ямы.

Однако это только звучит "просто", на самом деле Вы столкнетесь с трудностями - блок floor_front сливается с блоком floor и когда он уже вставлен очень сложно увидеть вставлен он или нет. Кроме того, по ошибке можно вставить в одно и то же место несколько блоков, потому что явно Вы не видите сколько их там, пока не станете кликать по этим блокам сцены, до появления диалогового окна их выбора.

Будет сложность и с определением для floor_front координаты z. Если вы забудете отключить опцию Options > Auto Calc Z.

Создание новой сцены во fle game engine - в редакторе сцен Scene Editor 1.0.2 - шарик поверх песчаных блоков в нижней части сцены

Поэтому я предлагаю другой - более простой и рациональный способ.

Для этого просто создадим новую сцену - File > New

Далее выберем в панели игровых объектов слева объект floor_front, прежде задайте для него правильный масштаб если он отличается от 1.0. Для этого, как вы помните, сначала надо выбрать объект floor_front и принудительно задать нужные значения, т. е. xScale = 1.0, yScale = 1.0

Теперь отключите опцию Options > Auto Calc Z и задайте принудительно z = 0.76

Расставьте блоки в тех местах сцены, где у Вас по задумке будут ямы. Вот так -

Создание новой сцены во fle game engine - в редакторе сцен Scene Editor 1.0.2 - передняя часть песчаных блоков для ям

Теперь Вы уже не запутаетесь в том, где ставили блок для передней части ямы, а где нет. Вам остается только снова включить опцию Options > Auto Calc Z и теперь уже добавить блоки для задней части ям - используя объект floor.

Создание новой сцены во fle game engine - в редакторе сцен Scene Editor 1.0.2 - задняя часть песчаных блоков для ям

Ну и вам осталось только добавить блок floor2 в те места сцены, где ям не будет и сцена готова !

Создание новой сцены во fle game engine - в редакторе сцен Scene Editor 1.0.2 - сцена готова

Сохраняем результат своего труда.

Можете еще взять шарик и поводить по сцене, чтобы убедиться, что он проваливается в ямы при наведении на них. Для шарика должна быть принудительно задана координата z = 0.78, а опция Options > Auto Calc Z должна быть отключена !

Создание новой сцены во fle game engine - в редакторе сцен Scene Editor 1.0.2 - сцена готова - шарик в яме

Для наглядности я добавил в сцену 2 шарика. Вы их можете добавить сколько угодно, но вообще говоря шарик у нас должен быть только 1. Если конечно Вы не измените идею игры так: что при нарастании уровня сложности появляется уже не 1, а больше шариков и игрок должен будет стараться двигать пол так, чтобы в ямы попало как можно больше шариков !

Итак, после завершения экспериментов убираем из сцены все шарики или просто используйте сохраненный вариант сцены, в котором вы еще не добавили ни одного шарика. Если таковых нет - создайте всё заново как было описано Выше, при этом шарик в сцену не добавляйте и сохраните результат своей работы.

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

[назад] [далее]

подробнее

     
  [к содержанию] [назад] [далее]  
     
 

Создание фотореалистичной текстуры травы

При разработке дизайна компьютерных игр, подготовке оформления Web-публикаций, а также в некоторых других случаях (например, обои для рабочего стола Windows) используются специальные виды изображений, называемых текстурами.

Трава

Кровь под микроскопом

Древесная кора
Солома

 

Так что же такое текстура? Текстура – это повторяющийся узор или рисунок, который имеет свойство непрерывно покрывать заданные области изображения (формировать поверхности или фон) без каких-бы-то-ни-было заметных стыков. Такие изображения (текстуры) часто именуют Tile (тайл) – что как раз и подразумевает свойство непрерывности, в ограниченном размерами изображении.

За счет чего достигается такая непрерывность? Вот в этом мы сейчас и попробуем разобраться на практическом примере.

Попробуем создать изображение текстуры травы в Photoshop 7.

1.                            Создайте новый файл размером 256х256 пикселей (точек экрана) -

для этого выберите команду File > New и в открывшемся диалоговом окне задайте требуемый размер:

Обратите внимание!

Resolution – это соотношение пиксель/дюйм, учитываемое при распечатке на принтере. На размеры картинки не влияет.

ModeRGB Color соответствует цветному изображению.

Contents – определяет цвет наполнения (холст, фон) – Transparent – прозрачный фон – наиболее универсальный и нужный в данном случае нам!

  1. Изобразите, используя инструмент Pencil , черным цветом контур куста травы с видом сверху:

 

  1. Обратите внимание на то, чтобы все контуры были замкнутыми. Это обстоятельство является важным, в противном случае Вы не сможете использовать выделение или заливку листьев куста!
  2. Т.к. фон у нас прозрачный (здесь на рисунке показан белый фон), то мы можем залить куст травы следующим образом: создайте новый слой – Layer > New > Layer или нажмите соответствующую кнопку на палитре слоев (см. урок 1)
  3. Измените цвет пера (foreground color) с черного на зеленый и выполните заливку созданного нового слоя.
  4. Ах! У Вас всё пропало. Но это еще не всё. Теперь в палитре слоев перетащите слой, залитый зеленым так, чтобы он располагался не над слоем с контурами травы, а под ним.

Что мы имеем: слой с контуром травы, а под ним слой с заливкой зеленым.

Почему мы не стали заливать сразу отдельные листочки?

Потому что при этом нужно было бы повторять операцию заливки несколько раз (для каждого листочка – замкнутого контура отдельно). В нашем случае мы сделали это за 1 шаг.

Однако возникает вопрос: Ведь в этом случае залиты не только листочки, но и задний план, т.е. фон вокруг куста.

Исправить это легко: нужно выделить волшебной палочкой пиксели вокруг куста и удалить выделенную область с нижележащего слоя. Но мы пока не будем этого делать. Сделаем это позднее (см. шаг 8).

  1. Чтобы контуры куста не были так резко выражены, попробуйте перейти на слой с контуром и сделать его слегка полупрозрачным, например около 20-35%.

В результате Вы увидите, что контуры станут больше сливаться с основным тоном – зеленым.

  1. Теперь можно попробовать удалить окружающий куст травы зеленый цвет – сделать фон вокруг куста прозрачным: для этого находясь на слое с контуром травы выберите инструмент Magic Wand и установите на панели свойств следующие параметры:

Это означает, что Обратная чувствительность (Tolerance) – будет использовать при выделении только 1 цвет, выделяться будет замкнутый контур.

  1. Щелкните волшебной палочкой (Magic Wand) фон рядом с кустом. В результате область вокруг куста станет выделенной.
  2. Опуститесь на нижний слой содержащий сплошную заливку зеленым и удалите выделенную область – клавишей [DELETE].

 

Вот что у вас должно получиться в результате.

  1. Попробуем придать кусту более живой вид. Для этого воспользуйтесь инструментами Осветление и Затемнение

Dodge Tool – затемнение; Burn Tool – выжигание; Sponge Tool – губка.

В панели свойств каждого из этих инструментов Вы найдете следующие свойства:

Brush – размер и форма пера (кисти), используемого для выполнения операции осветления/затемнения/губки;

Range – диапазон воздействия – определяет оттенок получаемый при применении эффекта – теневой/средний тон/бликовый;

Exposure – сила воздействия.

 

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

Слишком большая достоверность игры теней и бликов не требуется, т.к. мы сейчас отмасштабируем размер куста, уменьшив его в 8 раз, т.е. до размеров 32х32. Замечание – если Вы заметили, что Ваши усилия не дают результатов – не появляется ни бликов ни теней – обратите внимание на каком слое Вы работаете. Работать надо на слое содержащем закрашенные зеленым листья. Если Вы работали на слое, содержащем контур, то это и не давало эффекта, т.к. кроме контуров все остальное на данном слое – «пустой» прозрачный цвет.

  1. Image > Image size и задайте размер 32х32.
  2. Мы получим небольшой, достаточно компактный кустик. Теперь, используя его и инструмент Клон-Штамп

попробуем клонировать указанный куст делая его многократные копии в новом изображении 256х256. Тем самым мы получим искомую текстуру травы.

Что нужно сделать, более детально:

Создать новый файл – 256х256 с прозрачным фоном.

Переключиться на файл с изображением маленького куста.

Выбрать инструмент Клон-Штамп и с клавишей [Alt] щелкнуть левой кнопкой мыши – запомнить изображение куста. Размер пера, если куст не попадает в него целиком, нужно увеличить.

Переключиться на изображение 256х256 и щелкая левой кнопкой рассаживать кусты. Если кусты не рассаживаются уберите флажок: Aligned – чтобы отключить привязку в первой поставленной копии.

 

В результате может получиться что-то наподобие этого:

Обратите внимание, что фон уже непрозрачный, т.к. прозрачный фон это атрибут только PSD файлов – рабочих файлов Photoshop, любой другой формат требует задания в качестве фона какого-то конкретного цвета. На рисунке как раз и показан такой случай – с JPG файлом.

 

Созданное изображение рекомендуется обязательно сохранить. Рекомендуется также сохранять все промежуточные результаты Вашей работы.

 

После сохранения файла (File>Save As и указать имя файла, а также место для сохранения – см. урок 1)

Можно попробовать задать изображение в качестве шаблона (Pattern) и попробовать им что-нибудь залить, например тестовое изображение размеров 1024х768 (одно из стандартных разрешений экрана).

 

Для задания шаблона: изображение с травой должно быть текущим, выберите команду Edit > Define Pattern.

Затем ОК.

После этого можно закрыть файл с изображением и попробовать текстурную заливку:

Создайте новый файл – 1024x768.

Выберите инструмент Ведро (Paint Bucket) и в панели свойств задайте режим Pattern (Шаблон).

В списке шаблонов найдите Ваш (он самый последний в списке, возможно придется даже воспользоваться полосой прокрутки в окне выбора шаблонов).

Выполните текстурную заливку.

Вы заметите, что Ваша текстура имеет резко выраженные швы.

Как сделать текстуру бесшовной (Tile)?

 

 
     
  [к содержанию] [назад] [далее]  
     
     
подробнее

 

Программирование игр на С++ для платформы DirectX 9c

 
     
  Написание приложения DirectX9c + MFC в среде MSVS 2005  
     
 

Данный урок является введением в программирование на C++ в MSVS 2008

Вам нужно иметь установленную среду Microsoft Visual Studio 2005 или 2008 (можно триал),

и DirectX SDK 9 версии, или лучше самой последней - DirectX SDK August 2008.

 
     
  [назад] [далее] [к содержанию]  
     
 

Причины побудившие меня к написанию данной серии статей достаточно просты - поделиться своим опытом в области создания игр на VC++ в среде MSVS 2005 для DirectX 9c

В данном уроке я попытаюсь рассказать о том, как подойти к созданию приложения сочетающего использование интерфейсов DirectX 9c и классов из библиотеки MFC

 
     
 

Начнём с того, что в DirectX SDK August 2008 не представлен ни один из примеров приложения, рассчитанного на совместное использование DirectX и классов MFC.

По видимому предполагается, что тема достаточно тривиальна для тех, кто работает с DirectX

Однако мне это представляется не совсем так.

Зачем Вам в приложении DirectX могут понадобится классы MFC?

Во-первых, MFC содержит целый ряд просто необходимых классов, а значит и решения тех стандартных задач, которые трудно решить на голом WinAPI.

В частности если Ваше приложение DirectX подразумевает работу в стандартном окне и является какой-либо утилитой используемой в разработке Вашей игры (например редактор карт), то без использования MFC Вам просто не обойтись.

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

Именно базируясь на этих двух причинах следует рассмотреть как подойти к совместному использованию DirectX и MFC в своём приложении.

 
     
 

Для простоты мы разберем некий базис - шаблон приложения, рассчитанного на DirectX9c + MFC

Последовательность создания приложения D3D9 (DirectX 9c) + MFC
в MSVS 2005

File > New > Project > MFC > MFC Application

опции
Dialog based
язык - Английский (США) - потом поменяем на русский (при создании диалогов и изменении
их свойств)
MFC standard
Use MFC in a static library
Use Unicode libraries
остальные опции на своё усмотрение или по-умолчанию

После генерации приложения нужно настроить проект для использования заголовочных
файлов и библиотек DirectX 9c как это показано в уроке Первый старт

Добавить исходный код из DXUT - это набор вспомогательного кода, который Вы найдете внутри [DirectXSDK]\Samples\C++\DXUT\

Код данной папки ориентирован на использование в WinAPI-приложении без использования MFC

Для использования в MFC-проекте код потребует небольших модификаций во всех файлах *.cpp из папок Core и Optional нужно добавить строку #include "stdafx.h" перед строкой #include "DXUT.h" в самом начале каждого файла. Для простоты создайте копию содержимого папки DXUT, назвав например DXUT_mfc и смело вносите эти изменения. После этих изменений в качестве заголовочного файла управляющего прекомпилированными модулями будет задан stdafx.h что и имеет место в созданном Вами MFC-приложении, в противном случае Вы получите ошибки во время компиляции.

Код папки DXUT_mfc нужно добавить к коду проекта - в окне Solution Explorer щелкните правой кнопкой по названию проекта, выберите Add > New Filter, который назовите DXUT_mfc.

 
     
   
     
 

и добавьте все файлы из папки DXUT_mfc кроме DXUTguiIME.* и ImeUi.*

Данные файлы относятся к использованию национальных языков и Вам пока не потребуются.

 
     
 

Добавить шаблонный код для начальной инициализации типового D3D9 - приложения

Рассмотрим что нужно добавить на примере проекта D3DAppTemplate

В модуле D3DAppTemplate.h нужно внести следующие изменения и дополнения -

#include <d3d9.h>
#include <d3dx9.h>

#include "D3DAppTemplateDlg.h"

внутри описания класса class CD3DAppTemplateApp

~CD3DAppTemplateApp();

в конце описания класса

public:
CD3DAppTemplateDlg* pMainWindow;

В модуле D3DAppTemplate.cpp

#include "DXUT.h"
#include "DXUTcamera.h"
#include "DXUTsettingsdlg.h"
#include "SDKmisc.h"
#include "SDKsound.h"

 

 

//--------------------------------------------------------------------------------------
// Global variables
//--------------------------------------------------------------------------------------

ID3DXFont* g_pFont = NULL; // Font for drawing text
ID3DXSprite* g_pTextSprite = NULL; // Sprite for batching draw text calls
CFirstPersonCamera g_Camera; // A model viewing camera
CSoundManager g_DSound; // DirectSound class

bool g_bShowHelp = true; // If true, it renders the UI control text
bool g_bPlaySounds = true; // whether to play sounds
double g_fLastAnimTime = 0.0; // Time for the animations


//--------------------------------------------------------------------------------------
// Forward declarations
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed,
void* pUserContext );
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext );
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext );
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext );
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext );
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
void* pUserContext );
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext );
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
void CALLBACK OnLostDevice( void* pUserContext );
void CALLBACK OnDestroyDevice( void* pUserContext );
void RenderText();

void InitApp();

void InitialD3DAppSettings();

 

CD3DAppTemplateApp::CD3DAppTemplateApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
pMainWindow = NULL;
}

 

 

BOOL CD3DAppTemplateApp::InitInstance()
{
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();

// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization
SetRegistryKey(_T("Local AppWizard-Generated Applications"));

 

pMainWindow = new CD3DAppTemplateDlg();
pMainWindow->Create(CD3DAppTemplateDlg::IDD);
pMainWindow->ShowWindow(SW_SHOW);
pMainWindow->ShowWindow(SW_HIDE);

m_pMainWnd = pMainWindow;

InitialD3DAppSettings();

//g_d3dApp.Cleanup3DEnvironment();

delete pMainWindow;

pMainWindow = NULL;

// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}

 

void InitialD3DAppSettings()
{
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

// Set the callback functions. These functions allow DXUT to notify
// the application about device changes, user input, and windows messages. The
// callbacks are optional so you need only set callbacks for events you're interested
// in. However, if you don't handle the device reset/lost callbacks then the sample
// framework won't be able to reset your device since the application must first
// release all device resources before resetting. Likewise, if you don't handle the
// device created/destroyed callbacks then DXUT won't be able to
// recreate your device resources.
DXUTSetCallbackD3D9DeviceAcceptable( IsDeviceAcceptable );
DXUTSetCallbackD3D9DeviceCreated( OnCreateDevice );
DXUTSetCallbackD3D9DeviceReset( OnResetDevice );
DXUTSetCallbackD3D9FrameRender( OnFrameRender );
DXUTSetCallbackD3D9DeviceLost( OnLostDevice );
DXUTSetCallbackD3D9DeviceDestroyed( OnDestroyDevice );

DXUTSetCallbackMsgProc( MsgProc );

DXUTSetCallbackKeyboard( KeyboardProc );
DXUTSetCallbackFrameMove( OnFrameMove );
DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );

// Show the cursor and clip it when in full screen
DXUTSetCursorSettings( true, true );

InitApp();

// Initialize DXUT and create the desired Win32 window and Direct3D
// device for the application. Calling each of these functions is optional, but they
// allow you to set several options which control the behavior of the framework.
DXUTInit( true, true ); // Parse the command line and show msgboxes
DXUTSetHotkeyHandling( true, true, true ); // handle the defaul hotkeys

/*DXUTCreateWindow( L"D3D9 App Template", 0, 0, LoadMenu(0,
MAKEINTRESOURCE(IDR_MAINMENU)) );*/
DXUTCreateWindow( L"D3D9 App Template", 0, 0, 0);

SetWindowLong( DXUTGetHWND(), GWL_STYLE,
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX);

// We need to set up DirectSound after we have a window.
g_DSound.Initialize( DXUTGetHWND(), DSSCL_PRIORITY );


DXUTCreateDevice( true, 631, 380 );

//InitD3DApp();

// Pass control to DXUT for handling the message pump and
// dispatching render calls. DXUT will call your FrameMove
// and FrameRender callback when there is idle time between handling window messages.
DXUTMainLoop();

// Perform any application-level cleanup here. Direct3D device resources are released within the
// appropriate callback functions and therefore don't require any cleanup code here.

//return DXUTGetExitCode();
}

//--------------------------------------------------------------------------------------
// Initialize the app
//--------------------------------------------------------------------------------------
void InitApp()
{
// Add mixed vp to the available vp choices in device settings dialog.
DXUTGetD3D9Enumeration()->SetPossibleVertexProcessingList( true, false, false, true );

// Setup the camera with view matrix
D3DXVECTOR3 vEye( .5f, .55f, -.2f );
D3DXVECTOR3 vAt( .5f, .125f, .5f );
g_Camera.SetViewParams( &vEye, &vAt );
g_Camera.SetScalers( 0.01f, 1.0f ); // Camera movement parameters

}


//--------------------------------------------------------------------------------------
// Called during device initialization, this code checks the device for some
// minimum set of capabilities, and rejects those that don't pass by returning false.
//--------------------------------------------------------------------------------------
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )
{
// Skip backbuffer formats that don't support alpha blending
IDirect3D9* pD3D = DXUTGetD3D9Object();
if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
return false;

// Need to support ps 2.0
if( pCaps->PixelShaderVersion < D3DPS_VERSION( 2, 0 ) )
return false;

// Need to support A8R8G8B8 textures
if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
AdapterFormat, 0,
D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8 ) ) )
return false;

return true;
}

//--------------------------------------------------------------------------------------
// This callback function is called immediately before a device is created to allow the
// application to modify the device settings. The supplied pDeviceSettings parameter
// contains the settings that the framework has selected for the new device, and the
// application can make any desired changes directly to this structure. Note however that
// DXUT will not correct invalid device settings so care must be taken
// to return valid device settings, otherwise IDirect3D9::CreateDevice() will fail.
//--------------------------------------------------------------------------------------
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext )
{
assert( DXUT_D3D9_DEVICE == pDeviceSettings->ver );

HRESULT hr;
IDirect3D9* pD3D = DXUTGetD3D9Object();
D3DCAPS9 caps;

V( pD3D->GetDeviceCaps( pDeviceSettings->d3d9.AdapterOrdinal,
pDeviceSettings->d3d9.DeviceType,
&caps ) );

// If device doesn't support HW T&L or doesn't support 1.1 vertex shaders in HW
// then switch to SWVP.
if( ( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) == 0 ||
caps.VertexShaderVersion < D3DVS_VERSION( 1, 1 ) )
{
pDeviceSettings->d3d9.BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}

// If the hardware cannot do vertex blending, use software vertex processing.
if( caps.MaxVertexBlendMatrices < 2 )
pDeviceSettings->d3d9.BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

// If using hardware vertex processing, change to mixed vertex processing
// so there is a fallback.
if( pDeviceSettings->d3d9.BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING )
pDeviceSettings->d3d9.BehaviorFlags = D3DCREATE_MIXED_VERTEXPROCESSING;

// Debugging vertex shaders requires either REF or software vertex processing
// and debugging pixel shaders requires REF.
#ifdef DEBUG_VS
if( pDeviceSettings->d3d9.DeviceType != D3DDEVTYPE_REF )
{
pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_PUREDEVICE;
pDeviceSettings->d3d9.BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
#endif
#ifdef DEBUG_PS
pDeviceSettings->d3d9.DeviceType = D3DDEVTYPE_REF;
#endif
// For the first device created if its a REF device, optionally display a warning dialog box
static bool s_bFirstTime = true;
if( s_bFirstTime )
{
s_bFirstTime = false;
if( pDeviceSettings->d3d9.DeviceType == D3DDEVTYPE_REF )
DXUTDisplaySwitchingToREFWarning( pDeviceSettings->ver );
}

return true;
}


//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has been
// created, which will happen during application initialization and windowed/full screen
// toggles. This is the best location to create D3DPOOL_MANAGED resources since these
// resources need to be reloaded whenever the device is destroyed. Resources created
// here should be released in the OnDestroyDevice callback.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext )
{
HRESULT hr;



// Initialize the font

V_RETURN( D3DXCreateFont( pd3dDevice, 10, 0, 0, 1, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
L"MS Sans Serif ", &g_pFont ) );



// Define DEBUG_VS and/or DEBUG_PS to debug vertex and/or pixel shaders with the
// shader debugger. Debugging vertex shaders requires either REF or software vertex
// processing, and debugging pixel shaders requires REF. The
// D3DXSHADER_FORCE_*_SOFTWARE_NOOPT flag improves the debug experience in the
// shader debugger. It enables source level debugging, prevents instruction
// reordering, prevents dead code elimination, and forces the compiler to compile
// against the next higher available software target, which ensures that the
// unoptimized shaders do not exceed the shader model limitations. Setting these
// flags will cause slower rendering since the shaders will be unoptimized and
// forced into software. See the DirectX documentation for more information about
// using the shader debugger.
DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE;

#if defined( DEBUG ) || defined( _DEBUG )
// Set the D3DXSHADER_DEBUG flag to embed debug information in the shaders.
// Setting this flag improves the shader debugging experience, but still allows
// the shaders to be optimized and to run exactly the way they will run in
// the release configuration of this program.
dwShaderFlags |= D3DXSHADER_DEBUG;
#endif

#ifdef DEBUG_VS
dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT;
#endif
#ifdef DEBUG_PS
dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT;
#endif

return S_OK;
}


//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has been
// reset, which will happen after a lost device scenario. This is the best location to
// create D3DPOOL_DEFAULT resources since these resources need to be reloaded whenever
// the device is lost. Resources created here should be released in the OnLostDevice
// callback.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice,
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
HRESULT hr;


// get device caps
D3DCAPS9 caps;
pd3dDevice->GetDeviceCaps( &caps );


if( g_pFont )
V_RETURN( g_pFont->OnResetDevice() );


// Create a sprite to help batch calls when drawing many lines of text
V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );

// Setup the camera's projection parameters
float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height;
g_Camera.SetProjParams( D3DX_PI / 3, fAspectRatio, 0.001f, 100.0f );

// set lighting
pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
pd3dDevice->SetRenderState( D3DRS_AMBIENT, D3DCOLOR_ARGB( 255, 255, 255, 255 ) );
pd3dDevice->LightEnable( 0, TRUE );
pd3dDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );


// reset the timer
g_fLastAnimTime = DXUTGetGlobalTimer()->GetTime();

return S_OK;
}

//--------------------------------------------------------------------------------------
// This callback function will be called once at the beginning of every frame. This is the
// best location for your application to handle updates to the scene, but is not
// intended to contain actual rendering calls, which should instead be placed in the
// OnFrameRender callback.
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{

g_fLastAnimTime = fTime;

// Update the camera's position based on user input
g_Camera.FrameMove( fElapsedTime );


}


//--------------------------------------------------------------------------------------
// This callback function will be called at the end of every frame to perform all the
// rendering calls for the scene, and it will also be called if the window needs to be
// repainted. After this function has returned, DXUT will call
// IDirect3DDevice9::Present to display the contents of the next buffer in the swap chain
//--------------------------------------------------------------------------------------
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{

pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
0xFFA1E1FF, 1.0f, 0L );

if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{

//
// Output text information
//
RenderText();

pd3dDevice->EndScene();
}
}


//--------------------------------------------------------------------------------------
// Render the help and statistics text. This function uses the ID3DXFont interface for
// efficient text rendering.
//--------------------------------------------------------------------------------------
void RenderText()
{
// The helper object simply helps keep track of text position, and color
// and then it calls pFont->DrawText( m_pSprite, strMsg, -1, &rc, DT_NOCLIP, m_clr );
// If NULL is passed in as the sprite object, then it will work however the
// pFont->DrawText() will not be batched together. Batching calls will improves performance.
CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 10 );
const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetD3D9BackBufferSurfaceDesc();

// Output statistics
txtHelper.Begin();
txtHelper.SetInsertionPos( 5, 5 );
txtHelper.SetForegroundColor( 0xFF0000FF );


txtHelper.DrawTextLine( DXUTGetFrameStats( true ) );

txtHelper.End();
}


//--------------------------------------------------------------------------------------
// As a convenience, DXUT inspects the incoming windows messages for
// keystroke messages and decodes the message parameters to pass relevant keyboard
// messages to the application. The framework does not remove the underlying keystroke
// messages, which are still passed to the application's MsgProc callback.
//--------------------------------------------------------------------------------------
void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
{
if( bKeyDown )
{
switch( nChar )
{
case VK_F1:
g_bShowHelp = !g_bShowHelp; break;
}
}
}


//--------------------------------------------------------------------------------------
// Before handling window messages, DXUT passes incoming windows
// messages to the application through this callback function. If the application sets
// *pbNoFurtherProcessing to TRUE, then DXUT will not process this message.
//--------------------------------------------------------------------------------------
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
void* pUserContext )
{


g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );

return 0;
}


//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has
// been destroyed, which generally happens as a result of application termination or
// windowed/full screen toggles. Resources created in the OnCreateDevice callback
// should be released here, which generally includes all D3DPOOL_MANAGED resources.
//--------------------------------------------------------------------------------------
void CALLBACK OnDestroyDevice( void* pUserContext )
{

SAFE_RELEASE( g_pFont );

//g_d3dApp.Cleanup3DEnvironment(); //методы освобождения ресурсов нужно вызывать именно

//здесь. В данном примере g_d3dApp - объект игрового приложения не используется, поэтому он здесь закомментирован. В приложении с игрой освобождение ресурсов происходит именно так.
}

//--------------------------------------------------------------------------------------
// This callback function will be called immediately after the Direct3D device has
// entered a lost state and before IDirect3DDevice9::Reset is called. Resources created
// in the OnResetDevice callback should be released here, which generally includes all
// D3DPOOL_DEFAULT resources. See the "Lost Devices" section of the documentation for
// information about lost devices.
//--------------------------------------------------------------------------------------
void CALLBACK OnLostDevice( void* pUserContext )
{

if( g_pFont )
g_pFont->OnLostDevice();

SAFE_RELEASE( g_pTextSprite );




}

 
     
  Этот же код вы найдете внутри модулей D3DAppTemplate.h и D3DAppTemplate.cpp в проекте D3DAppTemplate -  
     
  Исходный код приложения D3DAppTemplate - 269 Кб, архив WinRaR 3.3 - Исходный код приложения D3DAppTemplate - 270 Кб, архив WinRaR 3.3  
     
  Особенностью работы данного приложения является то, что в качестве первоначального (главного) окна используется стандартное окно диалога. Это окно создается как немодальное (modeless), затем оно отображается и тут же скрывается, уступая очередь созданному окну DirectX-приложения  
     
  Схема функционирования выглядит следующим образом -  
     
   
     
 

В начале создается объект класса CD3DAppTemplateApp путём вызова его конструктора

CD3DAppTemplateApз();

Затем вызывается метод InitInstance() внутри которого и осуществляется вся ицициализация, касающаяся mfc и directx.

Вместо созданного модального диалога, содержащего кнопки OK и Cancel создается немодальное окно, которое отображается и тут же скрывается, а далее вызывается функция InitialD3DAppSettings() которая отвечает за всё дальнейшее связанное с directx.

Для настройки directx вызывается функция InitialD3DAppSettings(); Внутри неё происходит настройка directx, создание окна directx-приложения и запуск цикла очереди сообщений вызовом функции DXUTMainLoop(); Как это реализовано в деталях - смотри выше или в исходном коде проекта D3DAppTemplate

Далее все необходимые сообщения системы можно обрабатывать внутри функции MsgProc, а собственно игровую логику и отрисовку игровой сцены производить внутри функций OnFrameMove и OnFrameRender

При выходе из приложения вызовом exit() или PostQuitMessage DXUTMainLoop завершается, управление возвращается внутрь метода InitInstance, метод возвращает FALSE, что свидетельстует о ненужности запуска цикла очереди сообщений и приложение закрывается. При уничтожении вызывается метод деструктора ~CD3DAppTemplateApp() внутри которого удаляется созданный объект немодального главного окна приложения.

 
     
 

Особенность данного решения поставленной задачи: mfc + directx9c в простоте реализации.

Недостаток состоит в том, что требуется использование вспомогательного окна, которое в целом никак не используется - лишь отображается, а затем скрывается. Но использование его требуется по той причине, что класс CWinApp в своём свойстве m_pMainWnd обязательно требует окна производного от CWnd, каковым окно приложения, создаваемое для directx-приложения средствами WinAPI не является.

Можно конечно предложить более сложный способ - использовать главное окно для целей directx, однако это значительно усложнит задачу, потребуя сильных изменений в реализации функции InitialD3DAppSettings() главным образом для использования готового окна, а не его создания, переделки DXUTMainLoop для работы исходя из очереди сообщений прокачиваемых через методы CWinApp и некоторые другие.

 
     
 

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

Так что желаю Вам всяческих успехов на этом поприще.

Сам же я, являясь по-сути Delphi DirectX - программистом вот уже начиная с далекого 2002 года, могу сказать, что использование для этих целей VC++ не намного сложнее, а в чём-то даже проще. Но то, что Вы выберете для использования с DirectX - C++ или Delphi будет всецело зависеть от Ваших возможностей в настоящем времени, главным образом касающихся наличия у Вас под рукой той или иной среды программирования BDS (Borland Developer Studio) или MSVS (Microsoft Visual Studio) и опыта в работе с ними.

При желании Вам всегда можно будет перейти с C++ на Delphi и наоборот, как это имело место в моём случае.

 
     
 

Так что же лучше Delphi или C++ ???

- Решать Вам!

 
     
     
     
     
     
     
  [назад] [далее] [к содержанию]  
Содержимое данной страницы доступно только зарегистрированным пользователям.



Пожалуйста войдите на сайт - Вход

или пройдите процедуру регистрации - Регистрация

megainformatic live chat
Начать беседу
X
 

Оставленные комментарии



fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
megainformatic Размещение баннерной рекламы у нас
Время загрузки: 0,3514