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


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

megainformatic - Основы IDirectMusic8 в среде Delphi6-7
        Основы IDir
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
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 - Нечто Необъяснимое - пре релиз

megainformatic cms admin

megainformatic cms admin

megainformatic - Основы создания 3d игр - проект Тайны Морских Глубин

megainformatic - уроки delphi directx 8.1 3d - Основы Вращений и Управления камерой

megainformatic cms seo

megainformatic cms admin

megainformatic - Моделируем девушку в 3d - Подготовка 2d-эскиза тела человека

megainformatic cms stat kit

megainformatic cms seo

megainformatic - Теория и практика 3d игр - О Кватернионах

megainformatic - Теория и практика 3d игр - Основы теории векторов

megainformatic - Теория и практика 3d игр - Важные замечания

megainformatic - Моделируем девушку в 3d используя 3ds max - Подготовка к моделированию ноги - готовим ширму

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

megainformatic - Моделируем девушку в 3d используя 3ds max - Улучшаем созданную модель женской ножки

megainformatic cms stat kit

megainformatic - Подводная лодка и подводный мир

megainformatic - megainformatic cms - Форма для смены шаблонов сайта - модуль template selector

megainformatic cms social

подробнее

     
  Уроки Photoshop  
     
 

Как создать игру ? - Программируем сами.

Рассмотрение программирования игр под DirectX 9c на C++ с использованием среды разработки MSVS 2005 или выше.

 
     
  [содержание] [назад] [страница 3] [далее]  
     
  Изучаем и модифицируем пример CreateDevice - страница 3  
     
  Запускаем Photoshop.  
     
 

Для подготовки набора изображений иконки приложения нужно создать из какого-либо готового изображения 3 изображения размеров: 48х48 пиксель, 32х32 и 16х16.

Цветовой режим задать индексный, количество цветов не более 255 и сохранить эти 3 изображения в формате BMP

 
     
  Например возьмите любое из этих изображений -  
     
  примеры изображений для превращения в иконкупримеры изображений для превращения в иконку  
     
  И уменьшите до размера 48х48  
     
  изменение размера изображения в Photoshop  
     
  изменение размера изображения в Photoshop  
     
  После этого задайте для изображения режим индексированного цвета  
     
  задайте для изображения режим индексированного цвета  
     
  Далее выберите пункт меню Файл > Сохранить как (File > Save As) и сохраните в формате BMP  
     
  сохраните в формате BMP  
     
  сохраните в формате BMP  
     
  Аналогично создайте и сохраните под другими именами изображения 32х32 и 16х16  
     
  Важное замечание! Перед масштабированием изображения 48х48 до размера 32х32 измените режим на RGB для более плавного рассчета цветовых переходов, после завершения операции снова задайте индексированный режим изображения.  
     
 

Примеры полученных изображений -

48x.bmp

32x.bmp

16x.bmp

 
     
  Теперь можно закрыть Photoshop и запустить Microsoft Visual Studio  
     
  Открываем проект CreateDevice и дважды щелкаем его ресурс - иконку IDI_MAIN_ICON  
     
  дважды щелкаем его ресурс - иконку IDI_MAIN_ICON  
     
  Теперь Вам остается перетащить созданные три изображения в окно MSVS и вставить изображения из них в используемую иконку.  
     
  Предварительно возможно придется удалить все имеющиеся в файле иконки изображения, делается это следующим образом - нужно щелкнуть правой кнопкой мыши в столбце изображений иконки и выбрать вариант - Delete Image Type  
     
  Delete Image Type  
     
  Затем аналогичным образом создаете изображение такого же типа и вставляете в него нужное Вам.  
     
  Для выделения изображения используйте Rectangle Selection Tool, для выделения/вставки пункт меню Edit > Copy / Edit > Paste  
     
  Еще после вставки Вы заметите изменения цветов пикселей. Это нормально, т. к. происходит изменение с учетом текущей палитры. Чтобы таких изменений не происходило нужно либо использовать исходные изображения с количеством цветом меньшим 256, либо нужно вручную перерисовывать иконку прямо в редакторе MSVS.  
     
 

Для удобства прилагаю Вам файл ресурсов с готовой иконкой - можете скачать, скопировать в проект CreateDevice и использовать -

CreateDevice.rc

 
     
  [содержание] [назад] [страница 3] [далее]  
     
подробнее

Ethernity Вечность страница 6 + решение по анимации закрывающихся дверей лифта.

 

к странице 1 к странице 2 к странице 3 к странице 4 к странице 5 страница 6

 

* * *



Проблема интересна до тех пор, пока решение её неизвестно.


* * *



В данной части Ethernity мы расскажем о такой проблеме:




кадр закрытых дверей лифта, должен остановиться
не перепрыгивая на начальный кадр.


Сначала немного предыстории.

Возьмём утилиту Coords2D и посмотрим, что собой
представляет анимация дверей лифта.



Как видно из показанного ролика - двери лифта постепенно закрываются, а затем
и сам лифт исчезает.

Двери закрываются потому что спрайт открывания дверей воспроизводится реверсно -
от конца к началу.

Для этого достаточно задать лишь отрицательное Delay для спрайта.

Например Delay = -4.5f;


Суть проблемы состоит в том, чтобы по окончании вопроизведения Frame,
т. е. текущий кадр спрайта, оставался в кадре на котором двери
находятся в закрытом состоянии.


А решение, как оказалось, заключается в следующем:

void CD3DGameApp::RestartLadingAnimForOpenDoors()
{
	

	LPD3D9SPRITE Sprite1 = (LPD3D9SPRITE)Sprites2Array->GetAt(bol_stop_lift_at_floor);

	
	Sprite1->Delay = abs(Sprite1->Delay);
	

	Sprite1->StartNotLoopedAnim();

	Sprite1->m_fStartFrame = 15.0f; 
	Sprite1->m_fEndFrame = 14.0f;
	Sprite1->Frame = 0.0f;
}

Результат работы этого решения показан в нижеследующем видео #17 Решение по открыванию
дверей лифта и остановке на кадре открытых дверей в проекте bol.






Т. е. переменная Sprite1->m_fStartFrame спрайта играет роль стоп-маркера, на котором останавливается анимация по её окончанию. Sprite1->Frame = 0.0f; //анимацию начинаем с 0 кадра Видим, что изначально двери открываются и некоторое время отображаются открытыми - поставленная цель выполнена. Вы наблюдали как простая проблема, может иметь и простое решение. Однако решение вырабатывается в ходе выдвижения некоторых предположений и экспериментальной их проверки. Кажущейся простоте может предшествовать достаточно длительный этап подготовки. По понятным причинам я его здесь не привожу - это материал для целой книги, а не отдельной темы статьи - видео-урока.

к странице 1 к странице 2 к странице 3 к странице 4 к странице 5 страница 6

подробнее

     
  [Назад] [Все уроки] [Далее]  
     
 

9/06/2008 Воспроизведение в игре музыки в формате XM.

Для воспроизведения используется компонент MiniFMOD 1.78

[downloads:14]

переписанный на Delphi. Успешно используется в примере игры XTropper - http://XProger.mirgames.ru (автор XProger).

 

Рассмотрим поэтапно как реализовано воспроизведение музыки в указанном примере игры.

В модуле XTropper.dpr -

uses {...} MiniFMOD in 'MiniFMOD\MiniFMOD.pas',

l_sound,

между операторами begin и end. -

snd_Init;

Game_Init;

внутри цикла "прокачки" сообщений -

Game_Update;

snd_Update;

 

function WndProc -

Case message of
WM_QUERYENDSESSION, WM_CLOSE:
begin
{...}
snd_deInit;

{...}

if inMenu then
Menu_Message(message, wParam, lParam);

 

 

Старт воспроизведения музыки - в модуле XTropper.dpr -

между begin и end.

Game_Update -

в модуле l_game.pas -

Game_Update -

XMStop

XMPlay

{...}

Game_Init > MenuInt

 

Процедуры GameStart и GameFree -

в модуле l_menu.pas -

Menu_Init, MenuLoad

{...}

procedure Menu_Message -

Game_Start;

 

Обобщим полученную информацию -

Исходный код для работы с MiniFMOD находится в папке MiniFMOD

в этой папке находятся

MiniFMOD.obj - по всей видимости скомпилированный в MSVS файл библиотеки работы с minifmod

MiniFMOD.pas - интерфейсы для использования данной библиотеки

Так и есть в комментариях к файлу MiniFMOD.pas приведено следующее -

{
MiniFMOD 1.7 is a free C library from Fairlight
Technologies (http://www.fmod.org) which allows
you to play .XM files. Compiled into a .OBJ,
it is then possible to use it in any language
that supports OMF .OBJ files.

Here is the Delphi header I made for it.

Twis (June 2004).
}

Т.е. это говорит именно о том, что obj-файл это объектный файл библиотеки minifmod 1.7

Следует отметить, что minifmod не гарантирует 100% точности и идентичности звука XM-файла по сравнению скажем с воспроизведением в плеере или трекере. Об этом свидетельствуют заметки в readme содержащиеся в дистрибутиве midifmod178.rar (85 Кб). Однако на первых порах для игры данная библиотека думаю подойдет.

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

 

Продолжим обобщения -

Итак, в папку проекта игры нужно добавить папку MiniFMOD содержащую указанные выше 2 файла.

Далее -

в раздел uses модуля проекта или модуля приложения добавить ссылку на файл MidiFMOD.pas

модуль l_sound ? Суть вопроса: Как происходит воспроизведение музыки при помощи MiniFMOD -

путем вывода результата непосредственно на звуковую карту или же требуется предварительный рендеринг в звуковой буфер DirectSound с последующим выводом полученного через IDirectSound?

Поскольку в модуле l_sound содержится ссылка на MidiFMOD.pas, то скорее всего это 2 вариант, т.е.

при помощи miniFMOD XM файл сначала выводится в выделенный звуковой буфер IDirectSoundBuffer, а затем полученный кусочек уже воспроизводится средствами IDirectSound.

Однако эксперимент с комментированием ссылки на uses MiniFMOD внутри модуля l_sound показывает, что ошибок компиляции не возникает. Следовательно l_sound не использует MiniFMOD и ссылка возможно осталась ошибочно.

Смотрим далее -

 

из-за указанной особенности в uses также нужно добавить использование модуля l_sound.pas написанного XProger

Где-то после создания окна приложения, например в OneTimeSceneInit вызвать процедуры подобные snd_Init и Game_Init.

внутри метода Run -

перед FrameMove или даже внутри FrameMove вызываем процедуры подобные

Game_Update;

snd_Update;

Следует обратить внимание на то, что - в модуле проекта XTropper.dpr между begin и end. -

{...}

while not isQuit do
begin
while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;

if not glActive then
WaitMessage
else
begin
Time := GetTimer;
Time_Delta := Time - Time_Old;

flag := false;
for i := 1 to Time_Delta div 20 do
// будет ли влиять указанная периодичность на качество воспроизведения???
begin
Game_Update;
snd_Update;
flag := true;
end;

if flag = true then
Time_Old := Time - Time_Delta mod 20;
// или это не окажет влияния???
Game_Render;
end;
end;

{...}

 

внутри MsgProc -

при WM_DESTROY -

//WM_QUERYENDSESSION, WM_CLOSE: //в модуле проекта XTropper.dpr закрытие происходит по данным сообщениям

Game_Free;
//внутри данной процедуры происходит освобождение объекта XM-плеера - XMFree.

snd_deInit;

 

Это всё что касается создания, обработки и уничтожения объектов воспроизведения музыки.

Теперь необходимо рассмотреть детальную реализацию того, что происходит внутри данных процедур, касающееся загрузки конкретных XM-модулей, запуска и останова проигрывания, регулировки громкости и других особенностей.

 
Использование модуля l_sound.pas можно пока оставить без изменений, поскольку он выполняет роль фактического плеера, служит для управления звуком (запуск, стоп, громкость и т.п.) на уровне возможностей IDirectSound. Единственно, что поскольку l_sound.pas ориентирован на работу со старыми интерфейсами из модуля DirectX.pas (версии DirectX 6), то в этом плане возможно потребуется его переделка.
 

Game_Init -

Menu_Init -

XMLoadFromFile('data\music\baits.xm');
XMPlay;

Game_Update -

XMStop //вероятно так сделано для того, чтобы очередной кусок был выведен в звуковой буфер с опережением

XMPlay //т.е. сначала кусок выводится потом работа продолжается, а затем выполняется останов и снова вывод новой порции в буфер Это предположение, посмотрим что на практике!!!

 

 

Game_Free -

XMStop;
XMFree;

В приложении XTropper воспроизведение музыки управляется через объект меню -

внутри функции обработки сообщений (function WndProc ...) -

Game_Free при сообщениях WM_QUERYENDSESSION, WM_CLOSE, а в конце ее -

if inMenu then
Menu_Message(message, wParam, lParam);

При выборе пункта меню Start - внутри указанной процедуры -

Game_Start;

Game_Start -

XMFree;
XMLoadFromFile('data\music\rave.xm');
XMPlay;

 

Внутри модуля l_menu.pas также есть процедура -

procedure Menu_Load;
begin
XMFree;
XMLoadFromFile('data\music\baits.xm');
XMPlay;
end;

Где и как она вызывается?

Ответ - она вызвается внутри модуля l_input.pas в ответ на нажатие Escape -

procedure KeyOnUp(ID: Byte);
begin
Key[ID] := false;
case ID of
VK_ESCAPE : if not inMenu then
begin
snd_StopAll(0);
Player.ResetKeys;
if Player.Health = 0 then
Menu_Load;
inMenu := true;
end;

end;
end;

 

 

Теперь рассмотрим работу со звуком - использование модуля l_sound.pas в приложении XTropper -

Рассмотрение пока не требуется, т.к. XM воспроизводится без IDirectSound. Однако таким образом не используются все преимущества IDirectSound. В частности отсутствует возможность регулировки громкости музыки.

 

Попробуем использовать возможности MiniFMOD в имеющемся объеме для воспроизведения музыки.

Оказалось достаточно даже следующего способа работы:

Создаем 2 метода -

function TD3DGameApp.InitMusic: HResult;
begin
result := S_OK;

XMLoadFromFile('Media\Music\wizard_morning.xm');
XMPlay;
end;

procedure TD3DGameApp.FreeMusic;
begin
XMStop;
XMFree;
end;

 
И вызываем их где-либо, например в конце CreateSoundObjects и DestroySoundObjects. Всё. При старте приложения сразу же включается музыка.
 

Если требуется загрузка и воспроизведение иной мелодии, то достаточно вызвать следующую последовательность команд -

XMStop;
XMFree;

XMLoadFromFile('Media\Music\wizard_morning.xm');
XMPlay;

 

Возникает воспрос как регулировать громкость мелодии?

Поскольку miniFMOD скорее всего воспроизводит музыку через средства Windows без DirectSound, то теоретически должна быть возможность регулирования громкости за счет доступа к глобальному регулятору громкости системы. Есть ли такая возможность в модуле MMSystem.pas ?

 

Организация проигрывания различных музыкальных тем в разных частях приложения:

При старте приложения должна играть 1 тема,

При выходе в главное меню - другая

При переходе к игровой сцене - тема для нее.

На стадии загрузки игровой сцены должна загружаться мелодия для нее.

При старте игровой сцены должно включаться воспроизведение.

При выходе из игровой сцены воспроизведение должно останавливаться.

При удалении игровой сцены должен очищаться объект проигрывателя XM-мелодии.

Остановка и последующий старт воспроизведения не приводят к моментальному появлению звука. Имеет место некоторая задержка. Это свидетельствует о том, что для моментального включения/отключения мелодии нужно воспользоваться регулировкой громкости.

В модуле MMSystem.pas действительно есть функция - function waveOutSetVolume

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

Можно тажке посмотреть как реализовано управление громкостью в мультимедиа-плеере TMediaPlayer. Это ничего не дает. Там нет таких процедур!!!

Однако читая документацию по waveOutSetVolume, а также просматривая код модулей MMSystem.pas и MiniFMOD.pas обнаруживаем, что

1) громкость регулируется для локального экземпляра звука - значит это то, что нам нужно.

2) экспорты некоторых функций - в модуле MiniFMOD.pas являются сходными из аналогичных модуля MMSystem.pas Это еще раз подтверждает, что музыка воспроизводится минуя DirectSound обращаясь напрямую к системным функциям мультимедиа. Это же дает зацепку о способе регулировки звука при помощи указанного метода.

waveOutSetVolume требует 2-х параметров:

HWAVEOUT hwo, - обработчик устройства воспроизведения
DWORD dwVolume - громкость - младшее слово - левый канал, старшее - правый.

[далее] - о воспроизведении музыки при помощи библиотеки OggVorbis

 
     
  [Назад] [Все уроки] [Далее]  
     
подробнее

 

Что нужно знать для создания DirectX-приложений на C++ в среде
Microsoft Visual Studio 2008

 
     
  Урок 4 Создание Win32-приложений. Стандартные диалоги. Изучение
сопутствующих конструкций языка. Консольные Win32-приложения.
Указатели. Ссылочный тип. Массивы.
 
     
 

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

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

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

 
     
  [назад] [далее] [к содержанию]  
     
  Мы рассматриваем основы программирования на C++ в среде программирования MSVS 2008  
     
 

25/11/2008, 27/11/2008

Общие окна диалога для открытия и сохранения файла при использовании обработки пунктов

меню Save и Load

Работа с общими диалогами в Win32-приложениях описана в разделе

MSVS 2008 > Help > Contents > Win32 and COM Development > User Interface >

Windows User Experience >

Windows Management > Windows User Interface > User Input > Common Dialog Box Library

 
     
 

//++ Учебное задание: использование общего диалога для выбора цвета

Работа с общим диалогом выбора цвета описана в разделе

MSVS 2008 > Help > Contents > Win32 and COM Development > User Interface >

Windows User Experience >

Windows Management > Windows User Interface > User Input > Common Dialog Box Library >

Common Dialog Box Library Overviews > Color Dialog Box

Сопутствующие необходимые знания

chcol.lpCustColors - использование массивов

Требуется указатель на массив из 16-ти элементов типа COLORREF (статичный или локальный)

Работа с массивами в приложениях Win32 (Native Development) описана в разделе справки -

MSVS 2008 > Help > Contents > Development Tools and Languages > Visual Studio >

Visual C++ > Reference >

C/C++ Languages > Declarators > Arrays

 
     
 

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

элементов Visual C++

Работа с консольными приложениями позволит Вам освоить наиболее общие конструкции

языка

Visual C++ не вдаваясь в детали создания интерфейса пользователя.

Для создания консольного приложения Win32 нужно закрыть текущий солюшн (Close solution)

с которым Вы

работали и выбрать File > New > Project > Win32 > Win32 Console Application, указать имя и папку

для создаваемого проекта.

Добавить в файл с исходным кодом необходимый код, выполнить сборку Build, а

для просмотра результатов

работы такого приложения выполнять запуск из командной строки Пуск > Все программы >

Стандартные > Командная строка

 
     
 

Например Ваш скомпилированный файл находится в папке

H:\Andrew\work\gamecre\DXSDK_Aug2008\MyWorks\NuPogodiFull\NuPogodiFull_vs2008\

training\LearnPointers\Debug

 
     
 

Тогда, в окне Коммандной строки набираем

H:

и нажимаем Enter. Тем самым переходим на диск H.

копируем нужный путь прямо из проводника.

в коммандной строке набираем

cd

и правой клавишей мыши вызываем контекстное меню и вставляем скопированный путь

получается

cd H:\Andrew\work\gamecre\DXSDK_Aug2008\MyWorks\NuPogodiFull\NuPogodiFull_vs2008\

training\LearnPointers\Debug

нажимаем Enter.

Теперь мы находимся в этой папке.

Можете применить команду dir и вы увидите содержимое этого каталога.

Для очистки экрана консоли удобно использовать команду очистки экрана cls

Теперь Вам остается только набрать имя нужного exe-файла любыми буквами

(хоть большими, хоть маленькими, хоть вразнобой - никакой разницы, т.к. консоль

запускает файлы по именам

без учета регистра (заглавные/строчные)

Далее нажать Enter и увидеть результат работы Вашего консольного приложения.

 
     
 

Далее остается только экспериментировать - изменять код, выполнять новую сборку и

запускать созданное

из консоли наблюдая и анализируя полученные результаты.

 
     
 

Пример кода для понимания указателей (Pointers) - пример взят из MSVS Documentation

Для проверки и экспериментов с кодом используйте консольное приложение Win32

 
     
  // pointer.cpp
// compile with: /EHsc
#include <iostream>
int main() {
int i = 1, j = 2; // локальные переменные, размещаются в стеке
int *p; // указатель на целое (int)

// a pointer may be assigned to "point to" the value of
// another variable using the & (address of) operator

// указателю может быть присвоен адрес переменной
// содержащей значение посредством оператора &

p = & j;

// since j was on the stack, this address will be somewhere
// on the stack. Pointers are printed in hex format using
// %p and conventionally marked with 0x.

// поскольку j размещено в стеке, адрес будет представлять
// какой-то из адресов стека. Указатели распечатываются в шестнадцатиричном формате

с использованием
// %p в функции printf_s и по соглашению помечаются 0x.

printf_s("0x%p\n", p);

// The * (indirection operator) can be read as "the value
// pointed to by".
// Since p is pointing to j, this should print "2"

// Оператор * (оператор разыменования) может быть читаем как "указатель на значение"
// Поскольку p указывает на j, будет выведено "2"

printf_s("0x%p %d\n", p, *p);

// changing j will change the result of the indirection
// operator on p.

// изменение j изменит результат применения оператора разыменования
// к p.

j = 7;
printf_s("0x%p %d\n", p, *p );

// The value of j can also be changed through the pointer
// by making an assignment to the dereferenced pointer

// значение j может быть также изменено посредством указателя
// выполнением присвоения к разыменованному указателю

*p = 10;
printf_s("j is %d\n", j); // j теперь равно 10

// allocate memory on the heap for an integer,
// initialize to 5

// выделение памяти на куче (heap) для целого и,
// инициализация значением 5

p = new int(5);

// print the pointer and the object pointed to
// the address will be somewhere on the heap

// печать указателя и объекта на который указывает адрес
// где-то на куче (heap)

printf_s("0x%p %d\n", p, *p);

// free the memory pointed to by p

// освобождение памяти на которую указывает p
delete p;

// At this point, dereferencing p with *p would trigger
// a runtime access violation.

// с этого места разыменование p как *p будет давать
// ошибку нарушения прав доступа к памяти во время выполнения программы

// Pointer arithmetic may be done with an array declared
// on the stack or allocated on the heap with new.
// The increment operator takes into account the size
// of the objects pointed to.

// Вычисления с указателями могут выполняться для массива объявленного
// на стеке или выделенного на куче с помощью new.
// Оператор инкремента использует размер
// объектов на которые указывает указатель

p = new int[5];
for (i = 0; i < 5; i++, p++) {
*p = i * 10;
printf_s("0x%p %d\n", p, *p);
}

// A common expression seen is dereferencing in combination
// with increment or decrement operators, as shown here.
// The indirection operator * takes precedence over the
// increment operator ++.
// These are particularly useful in manipulating char arrays.

// Часто встречаемое выражение разыменования в комбинации
// с операторами инкремента или декремента выглядит так, как показано ниже.
// Оператор разыменования * выполняется перед оператором инкремента ++
// Это эффективно при манипуляциях с символьными массивами

char s1[4] = "cat";
char s2[4] = "dog";
char* p1 = s1;
char* p2 = s2;

// the following is a string copy operation

// операция копирования строки выглядит так -
while (*p1++ = *p2++);

// s2 was copied into s1, so now they are both equal to "dog"

// s2 копируется в s1, так что теперь обе строки содержат слово "dog"
printf_s("%s %s", s1, s2);
}

 
     
 

А вот пример демонстрирующий использование указателей в структурах данных, в данном случае

это связанный список. Пример также взят из MSVS Documentation

 
     
  // pointer_linkedlist.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct NewNode {
NewNode() : node(0){}
int i;
NewNode * node;
};

void WalkList(NewNode * ptr) {
if (ptr != 0) {
int i = 1;
while (ptr->node != 0 ) {
cout << "node " << i++ << " = " << ptr->i << endl;
ptr = ptr->node;
}
cout << "node " << i++ << " = " << ptr->i << endl;
}
}

void AddNode(NewNode ** ptr) {
NewNode * walker = 0;
NewNode * MyNewNode = new NewNode;
cout << "enter a number: " << endl;
cin >> MyNewNode->i;

if (*ptr == 0)
*ptr = MyNewNode;
else {
walker = *ptr;
while (walker->node != 0)
walker = walker->node;

walker->node = MyNewNode;
}
}

int main() {
char ans = ' ';
NewNode * ptr = 0;
do {
cout << "a (add node) d (display list) q (quit)" << endl;
cin >> ans;
switch (ans) {
case 'a':
AddNode(&ptr);
break;
case 'd':
WalkList(ptr);
break;
}
} while (ans != 'q');
}

 
     
 

примеры ссылочных (reference) типов -

int &i;
int &i, &j;

 
     
 

читается как ссылка (адрес) на объект i. Синтаксически работа со ссылками полностью аналогична

работе с объектами -

// references.cpp
#include <stdio.h>
struct S {
//структура S содержащая поле i с типом short
short i;
};

int main() {
S s; // Declare the object.
объявляем объект
S& SRef = s; // Declare the reference.
объявляем ссылку
s.i = 3;

printf_s("%d\n", s.i);
printf_s("%d\n", SRef.i);

SRef.i = 4;
printf_s("%d\n", s.i);
printf_s("%d\n", SRef.i);
}

 
     
 

Определение массивов, работа с массивами

объявление массива и работа с массивом времени выполнения -

// arrays.cpp
// compile with: /EHsc
#include <iostream>

int main() {
using namespace std;
int size = 3, i = 0;
//определяем размер массива и индекс

int* myarr = new int[size]; //объявляем массив из size элементов с типом int и выделяем ему

память на куче (heap)

for (i = 0 ; i < size ; i++)
myarr[i] = 10;
//заносим значения в элементы массива

for (i = 0 ; i < size ; i++)
printf_s("myarr[%d] = %d\n", i, myarr[i]);
//печатаем значения элементов массива

delete [] myarr; //освобождаем память
}

 
     
 

После получения необходимой информации из документации и экспериментов с учебными

примерами кода возвращаемся к нашей задаче -

//++ Учебное задание: использование общего диалога для выбора цвета

Работа с общим диалогом выбора цвета описана в разделе

MSVS 2008 > Help > Contents > Win32 and COM Development > User Interface >

Windows User Experience >

Windows Management > Windows User Interface > User Input > Common Dialog Box Library >

Common Dialog Box Library Overviews > Color Dialog Box

Сопутствующие необходимые знания

chcol.lpCustColors - использование массивов

Требуется указатель на массив из 16-ти элементов типа COLORREF (статичный или локальный)

Реализация данной задачи - вывод диалога выбора цвета например при нажатии пункта меню

Save будет выглядеть так (код нужно добавить в функцию WndProc) - показана в следующем уроке

 
     
 

в следующем уроке показана реализация выбора цвета из окна диалога цвета (Color Dialog) и

смена фона окна приложения в соответствии с выбранным цветом

 
     
     
     
     
     
     
     
     
     
  [назад] [далее] [к содержанию]  
     
  [Все уроки 3ds max] [Галерея моделей] [далее]  
     
  Создание модели броневика (Хэд) - Анимация вращения колес  
     
  Во время движения броневика его колеса должны вращаться. Попробуем сделать это.
Откройте законченную модель из предыдущего задания или готовую (из папки head).

Для вращения колеса нужно выбрать его и пользуясь инструментом вращение вращать по соответствующей оси. В нашем случае колеса должны вращаться в локальной системе координат колеса, относительно его центра по оси Y.


1. Выберите колесо, которое Вы создали первым (объект wheel1).

Т.к. оно является базовым, а другие два – его экземпляры (или ссылки), то применяя вращение лишь базового колеса мы сможем добиться вращения ВСЕХ ТРЕХ! колес.

Это удобно и ценно тем, что не надо будет беспокоиться о том, что колеса вращаются по-разному. Для того чтобы вращать колесо, выберите инструмент Select and Rotate (см. рисунок) – это крайний левый инструмент показанный на рисунке (круговая стрелка). Чтобы выбрать локальную систему координат выберите Local (как показано на рисунке), тогда для вращения будет использоваться система координат колеса. Если Вы заметите, что вращение происходит не относительно центра колеса, проверьте используемый центр (крайняя правая кнопка на рисунке). Должен быть выбран Use Pivot Point Center (тот который и показан на рисунке) – это позволяет использовать в качестве центра центральную точку (Pivot) объекта.

 
     
   
     
  Слева-направо: Select and Rotate – выбор и вращение; Select and Scale – выбор и масштабирование; Reference Coordinate System – используемая система координат; Use Center – используемый центр.  
     
   
     
  Показан момент вращения колеса по оси Y со всеми указанными выше предварительными настройками.  
     
 

2. Итак мы разобрались как вращать колесо. Но это еще пока не дает нам возможности его анимировать. Анимация должна показать вращение колеса во времени (и без нашего участия).

Попробуем сделать это:
a. Отмените произведенные вращения колеса.
b. На панели анимаций (внизу экрана) нажмите кнопку Auto Key
c. На панели времени переместитесь на последний кадр (номер 100)
d. Выполните вращение колеса (на полный оборот).
e. Отключите кнопку Auto Key
f. На панели анимации нажмите кнопку Play Animation.

 
     
  В результате мы должны получить желаемое, причем вращаются все 3 колеса!

Теперь более подробно о том, что мы сейчас делали. Кнопка Auto Key включает режим автоматической генерации ключевых кадров в текущей позиции временной панели. Суть такой анимации заключается в том, что от нас требуется изменить что-либо только в указанных (ключевых) кадрах, а все промежуточные кадры просчитываются за нас программой автоматически. Это очень удобно и эффективно. Кроме того, если потребуется что-то изменить, то изменения нужно вносить, опять-таки, только в ключевые кадры. Тем самым экономится большое количество сил и времени.

Теперь попробуем выполнить рендеринг последовательности кадров, которую мы создали. Для этого требуется вызвать окно Render (ч/з меню или F10) и указать диапазон (Range) выводимых кадров, а также файл (имя, расширение, кодек), в который будет выводиться созданная анимация.

 
     
  Движение броневика по поверхности ландшафта  
     
 

Пример того, что у Вас должно получиться можно найти в папке head_winter_anim - скачать её можно здесь -

Скачиваний : 0



Цель нашей работы следующая: создать небольшой видеоролик, в котором происходило бы перемещение созданного анимированного броневика по территории какого-либо ландшафта. Первое, что приходит на ум, это вопрос о том, сколько кадров будет длится анимация? Решать Вам. Исходить надо из того, каково будет качество анимации (сколько кадров в секунду), какую продолжительность видеоролика Вы хотите создать и, наконец, чем длиннее и сложнее будет Ваш видеоролик, тем дольше будет выполняться процесс рендеринга. Так, например, ролик с качеством стандарта NTSC (30 кадров/сек), с количеством кадров 1000 и размером кадра 640х480 точек (глубина цвета 24 бит), который Вы можете найти в папке head_winter_anim выводился примерно 1,5 часа на компьютере Celeron 2,67 MHz/256 Mb RAM/128 Mb GeForce video RAM.

Чтобы снизить продолжительность рендеринга, особенно если Вы производите пробные версии анимации, можно снижать размер кадра, количество кадров в единицу времени, производить вывод не всех кадров сразу, а только проверяемого диапазона и т.д. Но самое простое – это не делать рендеринг до тех пор, пока Вы до конца не убедитесь в том, что все в сцене и при анимировании сделано так как надо. К таким явным ошибкам, которые могут бросаться в глаза можно отнести: неверное размещение объектов в сцене (висящие в воздухе деревья), «въезжание» камеры в поверхность земли, движение броневика не по поверхности, а по воздуху и т.д. Все эти ошибки легко устранимы, но если Вы заметите их только уже на стадии рендеринга, то его придется повторять.

Итак, наш броневик будет двигаться по некоторой траектории, следовательно ее можно проложить по поверхности модели ландшафта. Вы это можете сделать при помощи инструмента Line в окне вида сверху. Затем нужно будет откорректировать положение созданной траектории по оси Z, а также положение отдельных ее точек – там где броневик будет въезжать на горки или съезжать с них.

После этого в сцену ландшафта нужно подгрузить (Merge) броневик (или создать на него ссылку – Xref object). Давайте создадим анимацию из 1000 кадров. Для увеличения количества кадров нажмите кнопку (Time Configuration) – ниже кнопок управления воспроизведением анимации. В появившемся диалоговом окне можно настроить качество анимирования: частоту кадров (группа Frame Rate), отображаемое время (Time Display), скорость воспроизведения (Playback), используемый для анимирования диапазон кадров (Animation). Кнопка Re-scale time позволяет изменить диапазон анимирования, за счет изменения скорости воспроизведения (а не за счет расширения границ этого диапазона).


Для того, чтобы броневик двигался по созданной траектории нужно:


• Выбрать броневик
• Присвоить броневику путь: Animation > Constraint > Path constraint и указать на созданную траекторию
• Чтобы броневик двигался прямо по траектории нужно ориентировать его по ней (развернуть), в открывшейся панели Motion (движение) в свитке Path parameters поставить флажок (Follow) – следовать по пути.
• После этого можно попробовать воспроизвести анимацию.

 
     
   
     
   
     
 

Показана открытая панель Motion в самой нижней части которой виднеется заголовок свитка Path Paremeters. Чтобы поднять свиток нужно прокрутить панель мышью (когда курсор приобретает вид руки). Свиток Path Parameters с заданными параметрами по умолчанию и установленным флажком Follow.
При просмотре анимации Вы заметите, что колеса броневика вращаются только первые 100 кадров, а затем не вращаются. Это связано с тем, что анимированный нами ранее броневик содержал анимацию только в диапазоне кадров от 0 до 100. Исправим это: сохраните Вашу работу и снова откройте анимированный броневик.


Установите диапазон анимации равным диапазону в сцене с ландшафтом.
Выберите базовое колесо (wheel1). Щелкните по нему правой кнопкой и вызовите Curve Editor – редактор кривых для управления анимацией ключевых и промежуточных кадров. В окне редактора кривых выберите только анимируемый параметр – в нашем случае это вращение по оси Y (Y rotation). В правой части окна Вы увидите изменение данного параметра во времени (в виде графика кривой). Чтобы анимация повторялась вне диапазона 0-100 нужно задать параметры анимирования вне диапазона:

 
     
   
     
 

Найдите и нажмите кнопку Parameter Curve Out-of-Range Types (см. рисунок).
В открывшемся диалоговом окне нажмите кнопку Relative Repeat и ОК.
Закройте редактор кривых. Проверьте результат изменений.


Сохраните анимированный броневик. Снова откройте сцену с ландшафтом. Если Вы добавляли в нее броневик посредством подгрузки (Merge), то Вам нужно будет сначала удалить его из сцены (не удаляя траекторию движения), затем подгрузить измененный, снова связать его с траекторией движения и настроить параметры (так как Вы это делали ранее). Если Вы добавляли ссылку на броневик (через Xref object), то все изменения в анимации броневика будут восприняты автоматически, т.к. при этом в сцене используется не копия объекта (в случае с Merge), а лишь ссылка на него и объект лишь связывается со сценой, но хранится самостоятельно и независимо.

После воспроизведения анимации Вы должны наблюдать, как на протяжении всей траектории колеса броневика также находятся во вращающемся состоянии.

 
     
     
  [Все уроки 3ds max] [Галерея моделей] [далее]  
     
megainformatic live chat
Начать беседу
X
 

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



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


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