Засоби технології Microsoft XNA як основа розробки тривимірних ігрових додатків

Сучасні API для програмування тривимірної графіки, математичні основи. Віртуальна камера, конвеєр візуалізації. Вершинні та піксельні шейдери. Розробка та реалізація ігрового додатку. Система постобробки зображення. Реалізація механіки ігрового процесу.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык украинский
Дата добавления 27.06.2013
Размер файла 4,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Гравець за допомогою миші повинен штовхати сферу гравця з обраною потужністю та в обраному напрямку з метою зіштовхнути її з іншою сферою подібного розміру (інші сфери в подальшому буде названо ворожими сферами так як в процесі проходження ігрового рівня гравець повинен їх знищувати) якщо ворожа сфера на момент зіткнення буде мати малу міцність вона вибухне а сфера гравця вбере в себе її енергію та збільшиться в розмірах, і як результат збільшення в розмірах, збільшить свою міцність. Метою гравця є знищення всіх ворожих сфер, але слід зауважити що від розміру ворожої сфери залежить її міцність, тому для того щоб розбити сферу великого розміру гравцю буде потрібно спочатку знищити менші сфери. Крім того при кожному поштовху зі сторони гравця або зіштовхуванні з будь якою ворожою сферою, в залежності від потужності удару, сфера гравця буде втрачати свій розмір, а отже і певну кількість очок міцності. Чим більшою є сфера гравця тим менше вона втрачає міцності при зіткненнях з іншими сферами та спричиняє більші пошкодження ворожим сферам. Слід також зауважити, що втрата міцності при поштовхах сфери гравцем не залежить від розміру і міцністю сфери, а зіткнення з границями світової сфери взагалі не наносять пошкоджень сфері гравця.

2.1.4 Опис ігрових об'єктів

Виходячи з характеристики ігрового процесу можна виділити і описати наступні ігрові об'єкти.

Основна світова сфера

Основна світова сфера - сфера в середині якої проходить ігровий процес і яка відповідно містить в собі всі інші ігрові об'єкти. Складається з набору ребер і постійно обертається навколо своєї осі, завжди знаходячись в центрі тривимірної сцени. Основною функцією світової сфери є обмеження ігрового простору.

Основні характеристики:

Розмір;

Швидкість обертання.

Побічні світові сфери

Побічні світові сфери - мають такий самий зовнішній вид як і світова сфера, але являються не активними ігровими об'єктами (не взаємодіють з іншими ігровими об'єктами та не беруть участь у ігровому процесі) розміщаються в різних частинах тривимірної сцени віддалено від основної світової сфери з метою створення фону ігрового рівня.

Основні характеристики:

Текстура;

Розмір;

Швидкість обертання;

Координати в тривимірному просторі.

Сфера гравця

Сфера гравця - основний ігровий об'єкт з яким напряму може взаємодіяти гравець. Гравець може штовхати дану сферу в будь якому напрямку і з заданою потужністю при цьому в залежності від потужності поштовху вона зменшується в розмірах та втрачає міцність. Після поштовху сфери гравцем вона може зіштовхнутись з границями світової сфери, або з ворожими сферами. При зіткненні з ворожими сферами в залежності від потужності поштовху сфери гравця та потужності ворожої сфери, сфера гравця також зменшується в розмірах та втрачає міцність але при цьому, зменшує міцність ворожої сфери. При знищенні ворожої сфери, сфера гравця збільшує свої розміри та запас міцності. Якщо запас міцності сфери гравця зменшується до нуля то сфера знищується і гра вважається програною.

Основні характеристики:

Текстура;

Розмір;

Координати в тривимірному просторі;

Потужність;

Напрямок руху;

Міцність.

Ворожі сфери

Ворожі сфери - можуть мати різноманітний розмір та місцезнаходження в межах світової сфери, причому від розміру ворожої сфери залежить її початкова міцність. Ворожа сфера рухається лише після зіткнення з сферою гравця або з іншою ворожою сферою. При зіткненні з сферою гравця або з іншою ворожою сферою в залежності від їх потужності ворожа сфера втрачає свою міцність, коли міцність зменшується до нуля ворожа сфера знищується.

Основні характеристики:

Текстура;

Розмір;

Координати в тривимірному просторі;

Потужність;

Напрямок руху;

Міцність.

2.1.5 Інтерфейс користувача

Інтерфейс користувача поділяється на дві частини інтерфейс в головному меню ігрового додатку, та інтерфейс з яким взаємодіє гравець безпосередньо під час ігрового процесу.

Інтерфейс головного меню складається з набору кнопок «Старт», «Вихід», «Опції», «Тест», стилізованих під написи які змінюють свій колір при наведенні. При натисненні гравцем на клавішу «Старт» почнеться гра, при натисненні на клавішу «Вихід» буде здійснено вихід з ігрового додатку, клавіша «Тест» відповідає за запуск тестової тривимірної сцени яка демонструє можливості програмного інтерфейсу який було застосовано для створення ігрового додатку, і нарешті натиснувши клавішу «Опції» гравець перейде до меню налаштувань.

Інтерфейс ігрового процесу, на відміну від головного меню не має кнопок на які користувач може натиснути, а обмежується лише виведенням корисної інформації для користувача, а саме інформацію про потужність з якою користувач може штовхнути сферу гравця, та її міцність. Дана інформація виводиться на екран за допомогою двох панелей які знаходяться в нижній частині екрану та мають прозору полосу посередині. Прозора полоса першої панелі буде заповнюватись помаранчевим кольором в залежності від поточної кількості очок потужності, а друга червоним в залежності від очок міцності.

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

2.1.6 Структура проекту

Проект повинен складатись з наступного набору компонентів:

Main - даний програмний компонент запускається першим, головними його функціями є ініціалізація і запуск інших компонентів ігрового додатку та керування їх роботою.

Loader - створює та ініціалізує динамічні масиви об'єктів які приймають участь у візуалізації тривимірних сцен.

ModelManager- керує візуалізацією тривимірних сцен.

Camera - компонент призначений для реалізації віртуальної камери та роботи з нею.

KeyHandler - призначений для керування обробкою натиснень клавіш клавіатури та миші.

LogicGameObjects - відповідає за поведінку і взаємодію ігрових об'єктів, та за реалізацію логіки ігрового процесу в цілому.

UI - компонент для реалізації двовимірних користувацьких інтерфейсів які накладаються на тривимірні сцени.

MainMenu - компонент який відповідає за візуалізацію та роботу головного меню ігрового додатку.

Відповідно до описаних вище компонентів на рис. 2.1. зображена діаграма основних компонентів ігрового додатку.

Рис. 2.1 - Діаграма основних компонентів ігрового додатку

2.2 Візуалізація тривимірних моделей

Першим кроком в візуалізації тривимірної моделі описаної в файлі є безпосередньо завантаження її в пам'ять. В більшості технологій завантаження моделей, текстур або іншого контенту представляють собою метод або функцію. Такі функції орієнтовані на якийсь певний формат, і надають змогу прочитати з нього дані після чого розмістити їх в пам'яті, щоб програма могла з ними далі працювати. Код цієї функції міститься в самій програмі. Програма повідомляє функції ім'я файлу, після чого вона виконує завантаження.

XNA за замовчуванням використовує інший підхід. В XNA коли потрібно завантажити будь який контент за справу береться Content Pipeline.

XNA Content Pipeline - це інструмент у формі збірок .net(бібліотек) і, отже, .net класів. Цей інструмент в першу чергу інтегрується в середовище розробки Visual Studio, але крім цього представлений і класами на стороні бібліотеки часу виконання XNA (XNA runtime). Іншими словами, XNA Content Pipeline - це загальна назва для класів, які інтегруються в середовище розробки, і класів, які використовуються в кінцевій програмі для завантаження контенту[12].

Використання Content Pipeline надає ряд переваг при завантаженні контенту. В першу чергу, частина роботи перенесена на час компіляції. На відміну від варіанту з єдиним методом, який всі дії виконує під час роботи програми, з XNA Content Pipeline частина роботи виконується в середовищі розробки під час компіляції. Конкретніше, на етапі компіляції дані імпортуються з початкового формату (х, FBX і т.д. - для моделей, PNG, BMP, DDS, JPG і т.д. - для зображень, WAV, MP3 - для аудіо), крім того, для кожного типу даних незалежно від початкового файлового формату виконується попередня обробка. А вже під час виконання, додатку не доводиться працювати з різними форматами, і виконувати всі ці дії, тому що результатом роботи Content Pipeline на етапі компіляції є файли внутрішнього формату XNB. [13]

Виходячи з цього, можна виділити і іншу перевагу - можливість відокремити решту логіки додатку від того, в якому форматі контент був наданий спочатку. Тільки сама перша частина «конвеєра» знає про файловий формат. І після того, як на першій стадії дані імпортуються з файлу, вони будуть в єдиному представленні, яке залежить від типу самих даних, а не від первісного формату.

Завантаження будь якого ресурсу проводиться в методі LoadContent( ).

Приклад завантаження тривимірної моделі з файлу формату .fbx за допомогою Content Pipeline зображено в лістингу 1.

Лістинг 1. Завантаження моделі.

{ Model Test_model;

protected override void LoadContent()

{

Test_model = Content.Load<Model>(" Test_model_File.fbx ");

}

}

Після того як тривимірна модель була завантажена, можна переходити безпосередньо, до її візуалізації. Для того щоб відобразити модель на екрані вона повинна пройти конвеєр візуалізації (П. 1.7) , для якого потрібно мати певний набір даних а саме розмір моделі, розташування її в тривимірному просторі, дані віртуальної камери, і багато іншого. Використавши всі ці дані, і застосувавши певні налаштування можна нарешті візуалізувати модель, звичайно для реалізації даної процедури потрібно набрати досить велику кількість програмного коду, враховуючи те, що в тривимірній сцені можуть знаходитись десятки, сотні, і навіть тисячі тривимірних моделей, то тільки для їх відображення на екрані потрібно буде написати тисячі рядків програмного коду, для того щоб цьому запобігти було розроблено спеціальний клас BasicModel.

Клас BasicModel містить в собі практично всі необхідні дані для візуалізації моделі (крім даних віртуальної камери, так як її данні можуть постійно змінюватись), та набір методів, для роботи з цими даними, основним з яких є метод Draw який маючи необхідні дані візуалізує тривимірну модель.

Конструктор класу BasicModel представлений в лістингу 2. Параметрами конструктора є безпосередньо сама модель, координати її розміщення в тривимірному просторі та розмір. Використовуючи цей набір даних, а також дані віртуальної камери метод Draw може проводити візуалізацію тривимірної моделі.

Лістинг 2. Конструктор класу BasicModel.

public BasicModel(Model m,Vector3 position,float size)

{

Size = size;

model = m;

world = Matrix.CreateTranslation(position);

}

Що стосується безпосередньо процесу візуалізації моделі, як було сказано в (П. 1.7.2), XNA використовує динамічний конвеєр візуалізації, тому при візуалізації моделі, для кожної її частини потрібно спочатку застосувати шейдери для візуалізації, або використати спеціальний клас BasicEffect який надає стандартні можливості для візуалізації тривимірних об'єктів без написання шейдерів, після цього можна візуалізувати саму модель. Метод Draw який відповідає за візуалізацію моделі відображений в Лістингу 3.

Лістинг 3. Метод Draw класу BasicModel.

public void Draw(Camera camera)

{ // ініціалізація даних

Matrix[] transforms = new Matrix[model.Bones.Count];

model.CopyAbsoluteBoneTransformsTo(transforms);

// цикл візуалізації

foreach (ModelMesh mesh in model.Meshes)

{

foreach (BasicEffect be in mesh.Effects)

{

if (Lighting == true)

{

be.LightingEnabled = true; //ввімкнути систему освітлення

// налаштування освітлення

be.DirectionalLight0.DiffuseColor = new Vector3(1f, 1f, 1f);

be.DirectionalLight0.Direction = new Vector3(1, 0, 0);

be.DirectionalLight0.SpecularColor = new Vector3(1, 0, 0);

be.AmbientLightColor = new Vector3(0.2f, 0.2f, 0.2f);

be.EmissiveColor = new Vector3(0, 0, 0);

}

else

{ be.LightingEnabled = false; }

be.Projection = camera.projection;

be.View = camera.view;

be.World = mesh.ParentBone.Transform * Matrix.CreateScale(Size) * GetWorld();

}

mesh.Draw();

}

}

Метод Draw працює наступним чином, спочатку ініціалізуються стартові дані після чого запускається цикл який проводить обробку кожної частини моделі, а саме застосовує до них BasicEffect і визначає кожній частині свій набір матриць (світову матрицю, матрицю проекції, матрицю відображення) (П. 1.4.3) після чого за допомогою методу mesh.Draw() візуалізує частину моделі.

Слід зауважити, що клас BasicModel створений виключно для візуалізації тривимірних моделей, і наприклад переміщувати, або обертати, чи надавати іншу логіку поведінки для тривимірного об'єкту за допомогою класу BasicModel не можна, однак можна створити інший клас який буде наслідувати клас BasicModel і вже в ньому надати об'єкту певну логіку поведінки в тривимірному просторі.

2.3 Програмування віртуальної камери

Детально поняття віртуальної камери було описане в пункті 1.6. Для того, щоб створити в XNA просту віртуальну камеру достатньо використати два методи класу Matrix, а саме CreatePerpectiveFildOfView( ) і CeateLookAt().

Matrix.CreatePerpectiveFildOfView( ) - це матриця проекції. Вона відображає тривимірний простір та все що в ньому знаходиться на екран монітора. В параметрах потрібно вказати поле зору камери, передню і задню площину відсічення камери, співвідношення сторін монітора і т.д.

Сама камера створюється за допомогою методу Matrix.CeateLookAt( ) параметрами якого є позиція камери, вектор направлення камери, і вектор який позначає верх камери, найчастіше використовується Vector3.Up.

Використання цих двох методів дає достатньо інформації для візуалізації будь-якого тривимірного об'єкта, але тільки за умови що віртуальна камера є повністю статичною і ніколи не змінює ні свого положення ні направлення. В іншому випадку, якщо наприклад потрібно прослідкувати камерою за певним об'єктом, або взагалі якщо потрібно надати користувачу можливість керувати камерою, з'являється необхідність як мінімум динамічно змінювати параметри в CeateLookAt( ) і передавати їх для візуалізації кожної моделі.

З метою полегшення роботи з динамічною віртуальною камерою було створено компонент Camera який зберігає в собі всі необхідні параметри камери, динамічно оновлює їх використовуючи логіку поведінки камери яка програмно описується в методі Update, який в свою чергу автоматично виконується на кожному витку циклу виконання програми.

Для тривимірної сцени в якій безпосередньо відбувається ігровий процес в методі Update був реалізований рух камери по орбіті світової сфери за допомогою кнопок WASD (лістинг 3) та зміну направлення камери за допомогою миші, причому при створенні іншої сцени можна повністю змінити поведінку камери для неї, просто додавши необхідний код в метод Update.

Лістинг 5. Реалізація управління рухом камери.

//Управління камерою за допомогою клавіш WASD

cameraPosition = new Vector3((float)(700 * Math.Cos(c_b) * Math.Cos(c_a)),

(float)(700 * Math.Sin(c_b)),

(float)(700 * Math.Cos(c_b) * Math.Sin(c_a)));

if (Keyboard.GetState().IsKeyDown(Keys.W))

{

if(c_b<Math.PI/2)

c_b += 0.01f;

}

if (Keyboard.GetState().IsKeyDown(Keys.S))

{

if (c_b > -Math.PI / 2)

c_b -= 0.01f;

}

if (Keyboard.GetState().IsKeyDown(Keys.A))

c_a += 0.01f;

if (Keyboard.GetState().IsKeyDown(Keys.D))

c_a -= 0.01f;

У випадку, якщо залишити метод Update( ) пустим, ми отримаємо стаціонарну віртуальну камеру, таку саму як і у випадку з використанням методу CeateLookAt( ), але з однією вагомою відмінністю. Як відомо з попереднього пункту для візуалізації будь-якої моделі потрібна інформація про камеру, тому якщо використовувати метод CeateLookAt( ) то його потрібно окремо викликати для візуалізації кожної моделі. На відміну від цього способу компонент Camera зберігає в собі всі потрібні дані і їх можна швидко передати на візуалізацію моделей, більш того клас BasicModel (П.2.2.) в методі Draw для візуалізації моделей використовує інформацію саме з компонента Camera, тому при використанні класу BasicModel достатньо просто задати значення параметрам камери, пілся чого клас BasicModel в методі Draw сам застосує потрібні дані камери для візуалізацію моделі.

2.4 Динамічне накладання текстур на тривимірну модель

Раніше в пункті 2.2 було описано роботу класу BasicModel який надавав можливість легко візуалізувати тривимірні моделі, але даний клас має один суттєвий недолік. Якщо треба візуалізувати одну тривимірну модель, але з різними текстурами, потрібно було в тривимірному редакторі створити декілька копій цієї моделі і накласти на них потрібні текстури, після чого імпортувати створені моделі до проекту, що призводить до значного збільшення розмірів ігрового додатку.

З метою надання можливості динамічного накладання текстур на тривимірну модель безпосередньо під час роботи ігрового додатку було створено спеціальний клас TexturedModel. Даний клас наслідує клас BasicModel, і має перевизначений метод Draw( ) який відповідає за візуалізацію тривимірної моделі з попереднім накладанням на неї потрібної текстури (Лістинг 6).

Лістинг 6. метод Draw( ) класу TexturedModel.

public void Draw(Camera camera, Texture2D mTexture, Effect TexEffect)

{ TexturedEffect = TexEffect;

Matrix[] transforms = new Matrix[model.Bones.Count];

model.CopyAbsoluteBoneTransformsTo(transforms);

foreach (ModelMesh mesh in model.Meshes)

{ foreach (ModelMeshPart part in mesh.MeshParts)

{ part.Effect = TexturedEffect;

// ініціалізація параметрів шейдера

TexturedEffect.Parameters["World"].SetValue(mesh.ParentBone.Transform

Matrix.CreateScale(Size) * GetWorld());

TexturedEffect.Parameters["View"].SetValue(camera.view);

TexturedEffect.Parameters["Projection"].SetValue(camera.projection);

TexturedEffect.Parameters["Tex"].SetValue(mTexture);

}

mesh.Draw();

}

}

Як було зазначено в пункті 2.2 XNA використовує динамічний конвеєр візуалізації, тому при візуалізації моделі, до кожної її частини потрібно спочатку застосувати шейдери для візуалізації, в методі Draw() класу TexturedModel на відміну від BasicModel для візуалізації моделі використовується не базовий клас XNA BasicEffect, а спеціально написаний шейдерний ефект TexturedEffect який передається разом з текстурою через параметри методу Draw() (Лістинг 7).

Лістинг 7. Приклад шейдерного ефекту візуалізації моделі з накладанням текстури.

float4x4 World;

float4x4 View;

float4x4 Projection;

Texture Tex;

sampler mSampler = sampler_state

{ Texture = <Tex>; };

struct VertexShaderInput

{ float4 Position : POSITION0;

float4 TexCoords : TEXCOORD0; };

struct VertexShaderOutput

{float4 Position : POSITION0;

float4 TexCoords : TEXCOORD0;};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)

{VertexShaderOutput output;

float4 worldPosition = mul(input.Position, World);

float4 viewPosition = mul(worldPosition, View);

output.Position = mul(viewPosition, Projection);

output.TexCoords = input.TexCoords;

return output;}

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0

{return

tex2D(mSampler, input.TexCoords);}

technique Technique1

{pass Pass1

{VertexShader = compile

vs_2_0 VertexShaderFunction();

PixelShader = compile

ps_2_0 PixelShaderFunction();}

}

Переданий в метод Draw( ) шейдерний ефект повинен мати чотири параметри, перші три це світова матриця, матриця виду і матриця проекції (П. 1.7), які потрібні для того щоб вершинний шейдер правильно розташував частину моделі в тривимірному просторі. Останній параметр це текстура яка накладається на тривимірну модель.

Таким чином клас TexturedModel надає можливість при кожній ітерації циклу візуалізації підставляючи потрібні параметри в виклик методу Draw( ) накладати на тривимірну модель нову текстуру, і для її накладання використовувати нові шейдерні ефекти.

2.5 Керування візуалізацією тривимірної сцени

В пункті 2.2. та 2.4. було описано реалізацію класів BasicModel та TexturedModel які надають можливість легко проводити візуалізацію окремих моделей, але в будь-якій тривимірній сцені можуть знаходитись десятки сотні а іноді тисячі і десятки тисяч тривимірних моделей, в такій ситуації навіть при використанні класу BasicModel потрібно буде написати велику кількість коду для візуалізації навіть не дуже складної тривимірної сцени. Для спрощення цього завдання було створено спеціальний компонент ModelManager.

Компонент ModelManager отримує з компоненту Loader динамічні масиви игрових об'єктів які містять в собі тривимірні моделі, та метод Draw() який відповідає за візуалізацію моделей, тобто масиви будь-яких об'єктів класів які наслідують клас BasicModel або TexturedModel. Після чого в методі Draw() компоненту ModelManager проводиться візуалізація всієї тривимірної сцени використовуючи дані масиви об'єктів. Причому метод Draw() автоматично викликається на кожному витку циклу виконання програми.

Таким чином використовуючи компонент ModelManager для візуалізації тривимірної сцени будь-якої складності, потрібно лише оголосити, і заповнити масив об'єктів які містять в собі тривимірні моделі, всю іншу роботу візьме на себе компонент ModelManager.

2.6 Системи часток

Система часток - використовуваний в комп'ютерній графіці спосіб представлення об'єктів, що не мають чітких геометричних границь (різні хмари, туманності, вибухи, струмені пари, дим, сніг, дощ і т.п.).

Система часток складається з певної (фіксованої або довільної) кількості частинок. Математично кожна частка представляється як матеріальна точка з додатковими атрибутами, такими як швидкість, колір, орієнтація в просторі, кутова швидкість, і т. п. У ході роботи програми яка моделює частинки, кожна частка змінює свій стан за певним, спільним для всіх частинок системи, законом. Наприклад, частка може піддаватися впливу гравітації, міняти розмір, колір, швидкість і так далі, після проведення всіх розрахунків, частка візуалізується. Частка може бути візуалізована точкою, трикутником, спрайтом, або навіть повноцінної тривимірною моделлю.

Для реалізації систем часток в ігровому додатку була використана динамічна бібліотека DPSF (Dynamic Particle System Framework). На відміну від інших бібліотек і API аналогічного профілю, DPSF досить гнучка і дозволяє задати власні закони поведінки в системі частинок. З допомогою стандартних класів можна досить швидко інтегрувати в проект ефекти часток після цього в налаштуваннях потрібно задати власні властивості часток і керувати ними, реалізуючи будь-який ефект.

За допомогою даного інструменту в ігровому додатку були реалізовані фонові хмари часток, слід із часток який тягнеться за сферою гравця якщо вона рухається (Лістинг 8), та вибухи ворожих сфер.

Лістинг 8. Ініціалізація базових налаштувань системи часток.

// Мінімальний та максимальний час життя окремої частинки

InitialProperties.LifetimeMin = 2.0f;

InitialProperties.LifetimeMax = 2.0f;

// Мінімальна та максимальна стартова позиція

InitialProperties.PositionMin = new Vector3(10, 10, 10);

InitialProperties.PositionMax = new Vector3(-10, -10, -10);

// Вектори для визначення напрямків та довжини руху часток

InitialProperties.VelocityMin = new Vector3(10, 10, 10);

InitialProperties.VelocityMax = new Vector3( -10, -10, -10);

// Налаштування обертання часток

InitialProperties.RotationMin = new Vector3(0, 0, 0);

InitialProperties.RotationMax = new Vector3(0, 0, MathHelper.Pi);

InitialProperties.RotationalVelocityMin = new Vector3(0, 0, 0);

InitialProperties.RotationalVelocityMax = new Vector3(0, 0, 0);

// Мінімальні та максимальні розміри часток після створення

InitialProperties.StartWidthMin = 1;

InitialProperties.StartWidthMax = 1;

InitialProperties.StartHeightMin = 1;

InitialProperties.StartHeightMax = 1;

// Мінімальні та максимальні розміри часток наприкінці життєвого циклу

InitialProperties.EndWidthMin = 3;

InitialProperties.EndWidthMax = 3;

InitialProperties.EndHeightMin = 3;

InitialProperties.EndHeightMax = 3;

// Налаштування кольорового забарвлення часток

InitialProperties.StartColorMin = Color.White;

InitialProperties.StartColorMax = Color.White;

InitialProperties.EndColorMin = Color.White;

InitialProperties.EndColorMax = Color.White;

2.7 Система постобробки зображення

У широкому сенсі, постобробка зображення - це все те, що відбувається після основних дій з побудови зображення. Інакше кажучи, постобробка - це будь-які зміни зображення після його рендеринга. Постобробка являє собою набір засобів для створення спеціальних візуальних ефектів, їх створення проводиться вже після того, як основна робота по візуалізації сцени виконана, тобто, при створенні ефектів постобробки використовується готове растрове зображення.

В ігровому додатку система постобробки зображення реалізована за допомогою двох класів RenderCapture та PostProcessor. Як було зазначено вище для того щоб створити будь який ефект постобробки зображення потрібно спочатку візуалізувати всю тривимірну сцену в растрове зображення, саме цим займається клас RenderCapture він має методи для захоплення зображення з графічного пристрою та повернення його у вигляді двовимірної текстури (Лістинг 9).

Лістинг 9.Методи класу RenderCapture для захоплення зображення

// початок захоплення зображення з графічного пристрою

public void Begin()

{

graphicsDevice.SetRenderTarget(renderTarget);

}

// Завершення захоплення

public void End()

{

graphicsDevice.SetRenderTarget(null);

}

// Повернення захопленого зображення як двовимірної текстури

public Texture2D GetTexture()

{

return renderTarget;

}

Після того як було отримано текстуру з захопленим зображенням за допомогою методів класу RenderCapture дана текстура використовується об'єктом класу PostProcessor який застосовує до неї потрібний шейдерний ефект та повертає оброблене зображення яке може бути виведене на екран, або використане як вхідне зображення для обробки іншим шейдерним ефектом.

За допомогою даної системи пост обробки зображення в ігровому додатку було реалізовано загальне освітлення сцени та Glow ефект. В комп'ютерній графіці, Glow ефект полягає в тому, що у яскравих областей зображуваного об'єкта спостерігається засвічення по периметру, через це створюється враження, що на поверхні яскравого об'єкта видно світловий ореол.

Дані ефекти були реалізовані наступним чином. Вся тривимірна сцена двічі візуалізується на текстури за допомогою класу RenderCapture. Після чого друга текстура за допомогою об'єкта класу PostProcessor обробляється спеціальним піксельним шейдером (Лістинг 10) який залишає на ній тільки найбільш яскраві пікселі, а інші пікселі робить прозорими. Таким чином після обробки зображення даним шейдером на ньому залишаться не прозорими тільки яскраві частини зображення.

Лістинг 10. Шейдер для відсічення не яскравих частин зображення

sampler2D tex[1];

float4 PixelShaderFunction(float4 Position : POSITION0,

float2 UV : TEXCOORD0) : COLOR0

{ float3 luminance = float3(0.299, 0.587, 0.114);

float4 color = tex2D(tex[0], UV);

float intensity = dot(color, luminance);

if (intensity < 0.1)

return float4(0,0,0,1);

else

return color;

}

Після того як на текстурі залишились тільки яскраві частини зображення вона проходить наступний етап обробки, Гаусове розмиття для створення світлового ореолу.

Гаусове розмиття відрізняється від простого розмиття тим, що замість обчислення середнього значення пікселя і його сусідів, воно обчислює значення пікселів залежно від відстані до центрального пікселя. Зважені значення обчислюються за допомогою гаусової функції:

Де x - відстань пікселя від центрального пікселя, а використовується як параметр для визначення розмитості зображення [14].

Гаусове розмиття реалізоване за допомогою спеціального класу GaussianBlur який наслідує клас PostProcessor. Задачею даного класу є розрахунок параметрів розмиття за допомогою гаусової функції (Лістинг 11), та їх застосування до вхідної текстури піксельного шейдеру який за допомогою цих параметрів і здійснює розмиття.

Лістинг 11. Реалізація гаусової функції в класі GaussianBlur.

float gaussianFunc(float x)

{

return (float)((1.0f / Math.Sqrt(2 * Math.PI * Math.Pow(blurAmount,2))) *

Math.Exp(-(Math.Pow(x,2)) / (2 * Math.Pow(blurAmount,2))));}

Після того як друга текстура була розмита вона накладається на першу текстуру яка є оригінальним зображенням тривимірної сцени без будь-яких змін і результуюче зображення виводиться на екран.

Результат візуалізації тривимірної сцени з використанням системи пост обробки зображень показано на рис. 2.2.

Рис. 2.2 - Ігровий рівень

ігровий додаток тривимірний графіка

2.8 Реалізація механіки ігрового процесу

2.8.1 Загальна організація обробки механіки ігрового процесу

Тривимірна графіка має важливу роль в будь якому тривимірному ігровому додатку, але без ігрового процесу як такого ігрового додатку не буде існувати. За реалізацію ігрового процесу відповідає компонент LogicGameObjects та самі класи ігрових об'єктів.

В методі Update() класу будь-якого ігрового об'єкту реалізована особиста поведінка даного об'єкта, тобто ті дії які він здійснює незалежно від інших ігрових об'єктів, та дій гравця. Наприклад сфера гравця та ворожі сфери мають параметр потужність удару який забезпечує рух сфери з певною швидкістю, якщо він має значення більше від нуля. Незважаючи на те, що значення цього параметра може змінюватись лише при взаємодії з гравцем або при зіткненні з іншими сферами, рух сфери в залежності від потужності не має відношення до інших ігрових об'єктів тому сам рух сфери програмується безпосередньо в класі ігрового об'єкта (Лістинг 12).

Лістинг 12. Переміщення ігрового об'єкту

if (Power != 0)

{

world = world * Matrix.CreateTranslation(Mov_Direction * Power / 5);

Power = Power - 0.5f;

if (Power < 0)

{

Power = 0;

}

}

На відміну від класів ігрових об'єктів в компоненті LogicGameObjects реалізуються всі дії які стосуються взаємодії ігрових об'єктів між собою та з гравцем, умови програшу або виграшу і інші правила гри (наприклад збільшення розміру сфери гравця при знищенні ворожої сфери, зменшення міцності сфери при зіткненні з іншою сферою, вибух сфери якщо міцність має значення нуль і т.п.) , що і є основною ігрового процесу.

2.8.2 Моделювання законів фізики при зіткненнях ігрових об'єктів

Основною частиною механіки ігрового процесу реалізованого ігрового додатку є фізика зіткнень сфери гравця з ворожими сферами, ворожих сфер між собою, та з світовою сферою.

Першим етапом обробки зіткнення будь-яких тривимірних об'єктів є безпосередньо встановлення факту наявності зіткнення. Для вирішення даної задачі компонент LogicGameObjects має два спеціальні методи Model_Collide() (Лістинг13) для виявлення зіткнення двох тривимірних об'єктів та World_Sphere_Collide () для виявлення зіткнення тривимірного об'єкта з світовою сферою. Робота обох методів ґрунтується на використанні об'єктів стандартного класу BoundingSphere. При використанні моделей в XNA автоматично створюються об'єкти BoundingSphere (обмежуючі сфери) які є частиною даної моделі. Кожна модель складається з одного або декількох об'єктів ModelMesh, а кожен об'єкт ModelMesh, у свою чергу, має властивість BoundingSphere, яка і визначає обмежуючу сферу. BoundingSphere має спеціальний метод Intersects( ) який визначає чи пересікається дана обмежуюча сфера з обмежуючою сферою іншого тривимірного об'єкта. Враховуючи той факт що всі ігрові об'єкти які присутні в створеному ігровому додатку самі по собі є сферами для визначення їх зіткнення достатньо перевірити на зіткнення їх обмежуючі сфери.

Лістинг 13. Перевірка на зіткнення двох тривимірних об'єктів

bool Model_Collide(Model M1, Model M2, float Size1, float Size2, Matrix World1, Matrix World2)

{

BoundingSphere boundingSphere1;

BoundingSphere boundingSphere2;

boundingSphere1 = M1.Meshes[0].BoundingSphere.Transform(World1);

boundingSphere1.Radius = boundingSphere1.Radius * Size1;

boundingSphere2 = M2.Meshes[0].BoundingSphere.Transform(World2);

boundingSphere2.Radius = boundingSphere2.Radius * Size2;

if (boundingSphere1.Intersects(boundingSphere2))

{

return true;

}

else

return false; }

Після того як факт зіткнення було встановлено наступним етапом є програмування реакції об'єктів на зіткнення.

Щоб визначити, як відреагувати на зіткнення, повинні бути застосовані закони фізики. Коли об'єкт стикається з поверхнею, його напрямок змінюється, тобто він відскакує. Кут нового напрямку (або вектор відображення) від нормалі точки зіткнення такий же, як у вектора який був до зіткнення, на рис. 2.3 зображено зіткнення одного об'єкта з поверхнею іншого [16].

Рис. 2.3 - Зіткнення тривимірних об'єктів

Відповідно до рис. 2.3. R - новий направляючий вектор, I - старий вектор, який був до зіткнення, N - нормаль від точки зіткнення. Новий вектор R обчислюється за наступною формулою: R = 2*( -I Dot N)*N + I причому вектори І та N повинні бути одиничними векторами.

Використовуючи дану формуло було запрограмовано механізм зіткнення сфера гравця з світовою сферою (Лістинг 14) та ворожих сфер.

Лістинг 14. Зміна вектора направлення сфери гравця при зіткненні із світовою сферою

Vector3 NewDirection;

Vector3 Start;

Vector3 PosColl;

// визначення нормалі від точки зіткнення

Start.X = ((Main)Game).loader.world_sphere.position.X;

Start.Y = ((Main)Game).loader.world_sphere.position.Y;

Start.Z = ((Main)Game).loader.world_sphere.position.Z;

PosColl.X = ((Main)Game).loader.player_sphere.world.Translation.X;

PosColl.Y = ((Main)Game).loader.player_sphere.world.Translation.Y;

PosColl.Z = ((Main)Game).loader.player_sphere.world.Translation.Z;

Vector3 Normal = PosColl - Start;

Normal.Normalize();

// визначення нового вектору напряму

NewDirection = 2 * Vector3.Dot(-(((Main)Game).loader.player_sphere.Mov_Direction), Normal) * Normal + ((Main)Game).loader.player_sphere.Mov_Direction;

((Main)Game).loader.player_sphere.Mov_Direction = NewDirection;

Крім зіткнень з світовою сферою в ігровому додатку сфера гравця також може зіткнутись як з ворожими сферами, так і ворожі сфери можуть стикатись між собою.

Зіткнення двох сфер які рухаються є більш складним випадком ніж попередній, в даному випадку ми маємо наступну ситуацію (рис 2.4) [16].

Рис. 2.3 - Зіткнення двох тривимірних сфер які рухаються

На рис. 2.3 U1 і U2 вектори швидкості двох сфер під час зіткнення. Вісь (X_Axis) - вектор, який з'єднує центри двох сфер, U1x, U2x проекції векторів швидкостей U1, U2 на вісь (X_Axis). U1y і U2y проекції векторів швидкості U1, U2 на вісь, перпендикулярну X_Axis.

Для того щоб отримати нові вектори швидкостей для обох сфер потрібно виконати наступні дії:

Знайти вісь X_Axis як нормалізовану різницю векторів кординат першої та другої сфери;

Знайти проекції швидкостей за наступними формулами:

U1x= X_Axis * (X_Axis dot U1)

U1y= U1 - U1x

U2x = -X_Axis * (-X_Axis dot U2)

U2y =U2 - U2x;

Знайти нові вектори швидкостей за формулами

V1x = (U1x+U2x - (U1x-U2x)) * 0.5

V2x = (U1x + U2x - (U2x - U1x)) * 0.5;

Знайти фінальні швидкості

V1y=U1y

V2y=U2y

V1=V1x+V1y

V2=V2x+V2y.

За допомогою даного методу в ігровому додатку було реалізовано механізм зіткнення між ворожими сферами та зіткнення сфери гравця з ворожими сферами (Лістинг 15).

Лістинг 15. Зміна векторів направлення сфери гравця та ворожої сфери при зіткненні

Vector3 pb1, pb2, U1x, U1y, U2x, U2y, V1x,V1y, V2x, V2y;

float a, b;

pb1.X = ((Main)Game).loader.player_sphere.world.Translation.X;

pb1.Y = ((Main)Game).loader.player_sphere.world.Translation.Y;

pb1.Z = ((Main)Game).loader.player_sphere.world.Translation.Z;

pb2.X = bm.world.Translation.X;

pb2.Y = bm.world.Translation.Y;

pb2.Z = bm.world.Translation.Z;

Vector3 xaxis;

// знаходження вісі x_axis

xaxis = Vector3.Normalize(pb2 - pb1);

// знаходження проекцій швидкостей

a = Vector3.Dot(xaxis,(((Main)Game).loader.player_sphere.Mov_Direction*

(((Main)Game).loader.player_sphere.Power/5)));

U1x = xaxis*a;

a = Vector3.Dot(xaxis, (((Main)Game).loader.player_sphere.Mov_Direction * (((Main)Game).loader.player_sphere.Power / 5)));

U1y = (((Main)Game).loader.player_sphere.Mov_Direction * (((Main)Game).loader.player_sphere.Power / 5)) - U1x;

xaxis = Vector3.Normalize(pb1 - pb2);

b = Vector3.Dot(xaxis, (bm.Mov_Direction * (bm.Power / 5)));

U2x = xaxis * b;

U2y = (bm.Mov_Direction * (bm.Power / 5)) - U2x;

// знаходження векторів швидкостей

V1x = (U1x + U2x - (U1x - U2x)) * 0.5f;

V2x = (U1x + U2x - (U2x - U1x)) * 0.5f;

V1y = U1y;

V2y = U2y;

Знаходження векторів направлення

((Main)Game).loader.player_sphere.Mov_Direction = Vector3.Normalize(V1x + V1y);

bm.Mov_Direction = Vector3.Normalize(V2x + V2y);

Слід зауважити, що рух ігрових об'єктів в додатку реалізовано за допомогою вектора направлення і показника потужності, а в результаті застосування наведених вище формул отримуємо вектори швидкостей які об'єднують в собі направлення та швидкість руху тривимірного об'єкта. Тому потрібно після застосування даних формул за допомогою нормалізації векторів виділити вектор направлення з отриманого вектора швидкості.

2.9 Розробка користувацького інтерфейсу

Інтерфейс користувача ігрового додатку поділяється на дві частини інтерфейс в головному меню ігрового додатку за який відповідає компонент MainMenu (рис 2.4), та інтерфейс з яким взаємодіє гравець безпосередньо під час ігрового процесу яким опікується компонент UI.

Рис. 2.4 - Головне меню ігрового додатку

Інтерфейс головного меню складається з набору кнопок «Старт», «Вихід», «Опції», «Тест», стилізованих під написи які змінюють свій колір при наведенні. Для реалізації двовимірних кнопок які відображаються в головному меню був розроблений спеціальний клас Button який містить в собі обробник натиснення на кнопку і наведення на неї курсору миші та спеціальні методи для візуалізації кнопки на екрані. Тому об'єкти даного класу можна використовувати як в спеціальному компоненті для візуалізації інтерфейсу MainMenu так і в будь-якому іншому компоненті чи класі. Для ініціалізації кнопки потрібно передати в конструктор координати кнопки, ширину, висоту, та два зображення, для візуалізації кнопки при наведеному курсорі, і в звичайному стані.

Компонент UI реалізує інтерфейс ігрового процесу, який на відміну від головного меню не має кнопок на які користувач може натиснути, а обмежується лише виведенням корисної інформації для користувача. А саме реалізує дві панелі в нижній частині екрана які за допомогою спеціальних смуг показують поточний рівень потужності удару та міцності сфери гравця. Як самі панелі так і смуги покажчики є звичайними двовимірними зображеннями які накладаються на тривимірну сцену.

В результаті проведеної роботи було реалізовано набір програмних компонентів для управління візуалізацією тривимірної графіки.

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

Реалізовано механізм постобробки зображень на базі якого було розроблено набір візуальних шейдерних ефектів.

Проведено дослідження механізмів створення систем часток з використанням бібліотеки DPSF, за результатами якого була виявлена ефективність використання даної бібліотеки та легкість інтеграції створених з її допомогою систем часток в ігровий додаток.

Розроблено ігровий додаток з унікальним ігровим процесом, який базується на керованих зіткненнях об'єктів у тривимірному просторі, в результаті реалізації якого були виявлені та досліджені можливі підходи до програмування законів фізики при зіткненнях тривимірних об'єктів.

ВИСНОВКИ

В роботі було досліджено та описано поняття тривимірної графіки. Проведено аналіз математичних основ побудови тривимірної графіки, а саме використання векторів і матриць тривимірного простору для побудови тривимірних зображень, основні перетворення які застосовуються до матриць і векторів, та специфічні матриці які використовуються виключно для роботи з тривимірною графікою (матриці масштабування, обертання, переміщення, світова матриця, матриця виду та ін.) за результатами якого були створені та реалізовані в програмних компонентах алгоритми візуалізації тривимірних сцен. В результаті досліджень сучасних API для програмування тривимірної графіки, і деяких особливостей роботи з ними, а саме програмування тривимірних сцен, віртуальної камери, робота з конвеєром візуалізації і т.д. встановлено, що найбільш ефективним для швидкої розробки тривимірного ігрового додатку є використання технології Microsoft XNA. Досліджено поняття і можливості використання вершинних та піксельних шейдерів з метою удосконалення графічної частини ігрового додатку, за результатами якого реалізована система постобробки зображення та система динамічного накладання текстур на тривимірні об'єкти. Реалізовано набір програмних компонентів для роботи з тривимірною графікою, які підтримують динамічне текстурування тривимірних моделей ефекти постобробки зображень, та системи часток, в результаті чого була виявлена ефективність використання бібліотеки DPSF для створення систем часток, та розроблено набір візуальних шейдерних ефектів на основі механізмів постобробки зображень, та динамічного текстурування моделей.

Розроблено ігровий додаток з унікальним ігровим процесом, який базується на керованих зіткненнях об'єктів у тривимірному просторі, в результаті реалізації якого були виявлені та досліджені можливі підходи до програмування законів фізики при зіткненнях тривимірних об'єктів.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Горнаков С.Г. Программирование компьютерных игр под Windows в XNA Game Studio / С.Г. Горнаков. - М.: ДМК Пресс, 2008. - 384 с.

2. Горнаков С.Г. DirectX 9. Уроки программирования на С++ / С.Г. Горнаков. - СПб. : БХВ-Петербург, 2005. - 400 с.

3. Jim Adams. Programming Role Playing Games with DirectX / Adams Jim. - Portland : Premier Press, 2002. - 881 pp.

4. Антон В.З. Обзор DirectX9 [Електронний ресурс]. - Режим доступу: http://www.gamedev.ru/code/articles/?id=4148

5. Рост Р.Дж. OpenGL. Трехмерная графика и язык программирования шейдеров / Р.Дж. Рост . - СПб. : БХВ-Петербург, 2005. - 428 с.

6. Гайдуков С.А. Введение в XNA [Електронний ресурс]. - Режим доступу: http://www.intuit.ru/department/se/intxna/1/1.html

7. Frank D. Luna. Introduction to 3D Game Programming with DirectX 9.0. / Luna D. Frank. - Burlington : Jones & Bartlett Publishers, 2003. - 421 pp.

8. Alexandre Lobгo. Beginning XNA 2.0 Game Programming: From Novice to Professional / Lobao A., Evangelista B.. - New York : Apress, 2008. - 456 pp.

9. Aaron Reed. Learning XNA 4.0. / Reed Aaron. - Sebastopol : O'Reilly Media, 2010. - 540 pp.

10. Берилло А. Современная терминология 3D графики [Електронний ресурс]. - Режим доступу: http://www.ixbt.com/video2/terms2k5.shtml

11. Sebastien St-Laurent. Shaders for game programmers and artists / St-Laurent Sebastien. - Boston : Thomson Course Technology PTR, 2004. - 512 pp.

12. Nitschke B. Professional XNA Game Programming: For Xbox 360 and Windows. / Nitschke B. - Malden : Wrox Press, 2007. - 504 pp.

13. Content Pipeline: краткий обзор [Електронний ресурс]. - Режим доступу: http://www.gamedev.ru/community/ru_ziggy/articles/?id=2979

14. Sean James. 3D Graphics with XNA Game Studio 4.0 / James Sean. - Birmingham : Packt Publishing, 2010. - 292 pp.

15. Гайдукова С.А. Визуализация примитивов [Електронний ресурс]. - Режим доступу: http://www.intuit.ru/department/se/intxna/2/

16. Dimitrios Christopoulos. Collision Detection [Електронний ресурс]. - Режим доступу: http://nehe.gamedev.net/tutorial/collision_detection/17005/

ДОДАТОК А

Програмний код ігрового додатку

Вихідний код модуля Main.cs

using System;

using System.Collections.Generic;

using System.Linq;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Audio;

using Microsoft.Xna.Framework.Content;

using Microsoft.Xna.Framework.GamerServices;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Input;

using Microsoft.Xna.Framework.Media;

namespace _3D

{

public class Main : Microsoft.Xna.Framework.Game

{

public GraphicsDeviceManager graphics;

SpriteBatch spriteBatch;

public int SpaceSpeed = 1;

// Скорость движения камеры

public int CameraSpeed = 3;

// сила удара

public int Power = 0;

// каркас

public bool karkas = false;

// позиция курсора

public Vector2 sightPos;

// Состояние

public String GameState = "Menu"; // Menu,Map,Space,Test,Game

public bool isLoad=false;

//компоненты

public ModelManager modelManager;

public UI ui;

public MainMenu menu;

public Camera camera { get; protected set; }

public Key__Handler key__handler;

public Loader loader;

public LogicGameObjects logicGameObjects;

public Main()

{

graphics = new GraphicsDeviceManager(this);

Content.RootDirectory = "Content";

}

protected override void Initialize()

{

// Режим отображения

graphics.PreferredBackBufferWidth = 1280;

graphics.PreferredBackBufferHeight = 1024;

this.graphics.IsFullScreen = true;

graphics.ApplyChanges();

IsMouseVisible = true;

//Инициализация компонентов

modelManager = new ModelManager(this);

Components.Add(modelManager);

modelManager.Enabled = true;

modelManager.Visible = true;

key__handler = new Key__Handler(this);

Components.Add(key__handler);

loader = new Loader(this);

Components.Add(loader);

logicGameObjects = new LogicGameObjects(this);

Components.Add(logicGameObjects);

menu = new MainMenu(this);

Components.Add(menu);

camera = new Camera(this, new Vector3(0, 0, -700),

new Vector3(0, 0, 0), Vector3.Up);

Components.Add(camera);

camera.Enabled = true;

ui = new UI(this);

Components.Add(ui);

ui.Enabled = false;

ui.Visible = false;

// стартовая позиция курсора

sightPos = new Vector2(Window.ClientBounds.Width / 2 ,

Window.ClientBounds.Height / 2 );

base.Initialize();

}

protected override void LoadContent()

{

}

protected override void UnloadContent()

{

}

protected override void Update(GameTime gameTime)

{

base.Update(gameTime);

}

protected override void Draw(GameTime gameTime)

{

base.Draw(gameTime);

// включение каркаса

if (GameState == "Space")

{

if (karkas == true)

{

RasterizerState state = new RasterizerState();

state.FillMode = FillMode.WireFrame;

GraphicsDevice.RasterizerState = state;

}

}

if (GameState == "Test")

{

if (karkas == true)

{

RasterizerState state = new RasterizerState();

state.FillMode = FillMode.WireFrame;

GraphicsDevice.RasterizerState = state;

}

}

if (GameState == "Game")

{

if (karkas == true)

{

RasterizerState state = new RasterizerState();

state.FillMode = FillMode.WireFrame;

GraphicsDevice.RasterizerState = state;

}

}

}

}

}

Вихідний код модуля Loader.cs

using System;

using System.Collections.Generic;

using System.Linq;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Audio;

using Microsoft.Xna.Framework.Content;

using Microsoft.Xna.Framework.GamerServices;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Input;

using Microsoft.Xna.Framework.Media;

using DPSF;

namespace _3D

{

public class Loader : DrawableGameComponent

{

public List<Space_Object> models = new List<Space_Object>();

public List<Space_Object> Menu_models = new List<Space_Object>();

public List<Space_Object> Test_Scene_models = new List<Space_Object>();

public World_Sphere world_sphere;

public Player_Sphere player_sphere;

public List<Enemy_Sphere> Enemys_Array = new List<Enemy_Sphere>();

public List<World_Sphere> Fon_Sphere_Array = new List<World_Sphere>();

public Effect TextureEffect;

public Effect TextureEffectRed;

public Effect TextureEffectOrange;

public Effect TextureEffectGreen;

public Loader(Game game)

: base(game)

{

}

public override void Initialize()

{

base.Initialize();

}

protected override void LoadContent()

{

TextureEffect = Game.Content.Load<Effect>(@"Shaders\Texture2");

TextureEffectRed = Game.Content.Load<Effect>(@"Shaders\TextureRed");

TextureEffectGreen = Game.Content.Load<Effect>(@"Shaders\TextureGreen");

TextureEffectOrange = Game.Content.Load<Effect>(@"Shaders\TextureOrange");

Menu_models.Add(new Space_Object("SF1", Game.Content.Load<Model>(@"Models\World_Sphere"), new Vector3(0, 0, 0), 2.1f, 0.003f, 0f, 0.0f, 0, 0, 0, 0));

Menu_models[0].Lighting = false;

Test_Scene_models.Add(new Space_Object("Sun",

Game.Content.Load<Model>(@"Models\Sun"), new Vector3(0, 0, 0), 0.8f, 0.003f, 0f, 0.0f, 0, 0, 0, 0));

Test_Scene_models.Add(new Space_Object("Mercury",

Game.Content.Load<Model>(@"Models\Mercury"), new Vector3(300, 0, 0), 0.1f, 0.003f, 0f, 0.0f, 0, 0.004f, 0, 0));

Test_Scene_models.Add(new Space_Object("Venus",

Game.Content.Load<Model>(@"Models\Venus"), new Vector3(200, 0, 500), 0.15f, 0.003f, 0f, 0.0f, 0, 0.0034f, 0, 0));

Test_Scene_models.Add(new Space_Object("Earth",

Game.Content.Load<Model>(@"Models\Earth"), new Vector3(300, 0, -700), 0.15f, 0.003f, 0f, 0.0f, 0, 0.0028f, 0, 0));

Test_Scene_models.Add(new Space_Object("Mars",

Game.Content.Load<Model>(@"Models\Mars"), new Vector3(100, 0, 900), 0.12f, 0.003f, 0f, 0.0f, 0, 0.0022f, 0, 0));

Test_Scene_models.Add(new Space_Object("Jupiter",

Game.Content.Load<Model>(@"Models\Jupiter"), new Vector3(1200, 0, 300), 0.3f, 0.003f, 0f, 0.0f, 0, 0.0018f, 0, 0));

Test_Scene_models.Add(new Space_Object("Saturn",

Game.Content.Load<Model>(@"Models\Saturn"), new Vector3(-400, 0, 1400), 0.25f, 0.003f, 0f, 0.0f, 0, 0.0014f, 0, 0));

Test_Scene_models.Add(new Space_Object("Uranus",

Game.Content.Load<Model>(@"Models\Uranus"), new Vector3(1700, 0, -900), 0.21f, 0, 0.003f, 0f, 0, 0.0012f, 0, 0));

Test_Scene_models.Add(new Space_Object("Neptune",

Game.Content.Load<Model>(@"Models\Neptune"), new Vector3(-400, 0, 1900), 0.25f, 0.003f, 0f, 0.0f, 0, 0.001f, 0, 0));

Test_Scene_models.Add(new Space_Object("Pluton",

Game.Content.Load<Model>(@"Models\Pluton"), new Vector3(800, 0, 2100), 0.1f, 0.003f, 0f, 0.0f, 0, 0.0008f, 0, 0));

player_sphere = new Player_Sphere("Player1", "Normal", 45, 100, Game.Content.Load<Model>(@"Models\Player_Sphere2"), new Vector3(0, 0, 0), 0.1f, 0.000f, 0, 0);

world_sphere = new World_Sphere("Normal", Game.Content.Load<Model>(@"Models\MSphere"), new Vector3(0, 0, 0), 2.1f, 0.003f, 0, 0);

Fon_Sphere_Array.Add(new World_Sphere("Normal", Game.Content.Load<Model>(@"Models\MSphere"), new Vector3(5000, 0, 1000), 2.1f, 0.003f, 0, 0));

Fon_Sphere_Array.Add(new World_Sphere("Normal", Game.Content.Load<Model>(@"Models\MSphere"), new Vector3(3000, 8000, 2000), 2.1f, 0.003f, 0, 0));

Fon_Sphere_Array.Add(new World_Sphere("Normal", Game.Content.Load<Model>(@"Models\MSphere"), new Vector3(6000, -5000, 800), 2.1f, 0.003f, 0, 0));

Fon_Sphere_Array.Add(new World_Sphere("Normal", Game.Content.Load<Model>(@"Models\MSphere"), new Vector3(-4000, -2000, 1800), 2.1f, 0.003f, 0, 0));

Fon_Sphere_Array.Add(new World_Sphere("Normal", Game.Content.Load<Model>(@"Models\MSphere"), new Vector3(500, -1000, -90), 2.1f, 0.003f, 0, 0));

Fon_Sphere_Array.Add(new World_Sphere("Normal", Game.Content.Load<Model>(@"Models\MSphere"), new Vector3(-5000, 700, 100), 2.1f, 0.003f, 0, 0));


Подобные документы

  • Розробка програмного додатку - гри "Jump way", яка поєднала в собі сучасні методи побудови 2D ігор. Обґрунтування вибору мови програмування. Проектування UML-діаграм класів. Користувацький інтерфейс. Програмна реалізація гри. Інструкція користувача.

    курсовая работа [1,2 M], добавлен 09.01.2017

  • Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.

    курсовая работа [502,5 K], добавлен 01.04.2016

  • Поняття та сфери використання тривимірної графіки. Описання та характеристика можливостей бібліотеки OpenGL. Загальний опис інтерфейсу мови програмування Borland C++, лістинг програми, що демонструє її можливості. Розрахунок витрат на виконання проекту.

    дипломная работа [1,6 M], добавлен 24.06.2015

  • Особливості Unity у створенні віртуального робочого середовища. Моделювання у віртуальному середовищі навчальних проектів у вигляді лабораторних робіт з фізики, які спрямовані на покращення і спрощення навчального та практичного процесу навчання.

    курсовая работа [74,0 K], добавлен 30.08.2014

  • Загальні відомості по графічним графікам та функціям. Аналіз функцій графічної підсистеми, яка входить до складу системи MATLAB та підтримує як засоби візуалізації двовимірної і тривимірної графіки на екран терміналу, так і засоби презентаційної графіки.

    реферат [255,2 K], добавлен 30.04.2013

  • Практична реалізація гри в "хрестики-нулики" в середовищі програмування Turbo C++ версії 3.0. Моделювання ігрового поля квадратною матрицею третього порядку. Процедури програми гри. Створення програми Tic_Tac, що дозволяє людині грати у гру з комп’ютером.

    курсовая работа [145,8 K], добавлен 23.04.2010

  • Розробка ігрового додатку за технологією IDE Visual Studio та WPF. Опис вхідної та вихідної інформації. Назва та призначення модулів програми. Основні поля класу, необхідні для ігрової логіки. Блок-схема алгоритму гри. Інструкція з експлуатації системи.

    курсовая работа [1,3 M], добавлен 02.06.2015

  • Дослідження інструментальних засобів для створення систем спільного навчання. Створення Windows-додатків на основі Visual C#. Функціональні можливості та програмна реалізація системи інтерактивної взаємодії. Програмна реалізація модулю прийому зображення.

    дипломная работа [4,5 M], добавлен 22.10.2012

  • Історія виникнення та сфери використання тримірної графіки. Дослідження процесу візуалізації тримірного зображення. Створення програмного забезпечення, здатного перетворювати стандартні графічні зображення до графічних зображень внутрішніх форматів Мауа.

    дипломная работа [3,6 M], добавлен 23.09.2013

  • Принципи організації баз даних (БД) при проектуванні клієнт-серверних додатків. Інструментальні засоби створення системи. Різновиди архітектур БД. Функції та програмна реалізація. Економічне обґрунтування доцільності розробки програмного продукту.

    дипломная работа [2,1 M], добавлен 22.10.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.