Возможно вы искали: 'Xenon 2000: Project PCF'

May 15 2025 18:45:06
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Формируем трехмерную сцену [Xbox 360]

Формируем трехмерную сцену [Xbox 360]

Формируем трехмерную сцену
Способов создания полноценных трехмерных сцен очень много. Выбор того или иного способа целиком зависит от игровых задач. В игре «Футбольный стрелок» наша камера статична и находится в одном положении, поэтому для организации сцены был выбран механизм загрузки в игру модели стадиона. Суть этого способа заключается в том, чтобы загрузить в игру модель стадиона и установить камеру под определенным углом, а затем на фоне стадиона развернуть все игровые действия.
Для текущего примера был создан новый проект под названием Plane, который находится на компакт-диске в папке Code\Chapter20\Plane. Начиная с раздела 20.1, мы приступим к его изучению. Дополнительно в папке Code\Chapter20\ имеется еще один проект под названием PlaneMove. В нашей игре нет необходимости перемещаться по полю стадиона, но показать вам, как этот это делается, нужно обязательно. После изучения проекта Plane рассмотрите исходный код примера PlaneMove, думается, что этот пример вам обязательно пригодится в своих собственных играх.

20.1. Позиция камеры
Переходим к работе над игрой и начнем с того, что улучшим код по представлению позиции камеры на экране телевизора. В исходный код класса Game1 проекта Plane добавим новую переменную camera.

Vector3 camera = new Vector3(0.0f, 0.0f, 150.0f);

Эта переменная будет задавать одинаковую позицию просмотра сцены для мячей и футбольного стадиона в методе Draw().

// метод Draw()
view = Matrix.CreateLookAt(camera, Vector3.Zero, Vector3.Up);


А также для вычисления позиции прицела.

// метод GetPickRay()
Ray GetPickRay()
{
…
view = Matrix.CreateLookAt(camera, Vector3.Zero, Vector3.Up);
…
}


Таким образом, мы создаем одну переменную и упрощаем возможность обоюдного изменения точки просмотра сцены в двух и более местах исходного кода. Сама точка просмотра трехмерной сцены удаляется на 150 пикселей от центра экрана.
Предложенные значения точки просмотра сцены взяты не с неба, эти значения были сначала опробованы на загружаемой в игру модели стадиона, и только потом был выбран наиболее выгодный ракурс. В этом плане бесплатные модели имеют свою обратную сторону медали. Здесь уже приходится подстраиваться под имеющийся графический контент, вместо того чтобы модельер, делающий модели, подстраивался под ваши требования…

20.2. Загружаем в игру стадион
Переходим к загрузке модели стадиона в игру. В качестве основной игровой модели для формирования сцены в игре мы используем модель стадиона, которая была найдена в закромах ресурса Turbosquid.com (рис. 20.1). Эта модель распространяется на бесплатной основе в формате 3ds и создана модельером, зарегистрированным на Turbosquid.com под именем dwallcott (рис. 20.1).
К сожалению, в комплекте со стадионом текстуры не идут, поэтому я покрасил все элементы стадиона просто в разные цвета, но при желании можно использовать любые текстуры, созданные специально для этих целей.
Итак, перейдем к исходному коду класса Game1 проекта Plane и в области глобальных переменных объявим объект stadium класса ModelClass.

Рис. 20.1. Страница модели стадиона на сайте

private ModelClass stadium;

Затем в конструкторе класса Game1 или в методе Initialize() создаем но-
вый объект stadium.

stadium = new ModelClass();

Переходим к телу метода LoadGraphicsContent() и, используя стандарт-
ные механизмы, загружаем в игру модель.

stadium.Load(content, «Content\\Models\\stadium 1»);

В этом же методе выбираем позицию для стадиона на экране телевизора.

stadium.position = new Vector3(0, 0, 0);

Стадион мы ставим на экран в нулевые координаты, а за счет удаления камеры от центра экрана (см. раздел 20.1) получаем хороший ракурс просмотра всей трехмерной сцены.
Последние установки, связанные с выводом стадиона на экран, происходят в методе Draw().

world = Matrix.CreateTranslation(stadium.position);
stadium.DrawModel(world, view, proj);


Здесь все установки стандартны, а значения матрицы вида и матрицы проекции общие как для мячей, так и для стадиона. Если сейчас запустить проект, то на экране телевизора вы увидите стадион и падающие сверху мячики (рис. 20.2), но прежде нам необходимо сделать еще несколько изменений и нововведений, чтобы трехмерная сцена стала ярче и интереснее.

Рис. 20.2. Стадион в игре


20.3. Падение мячей на поле стадиона
Как вы помните, к выбору скоростей в играх нужно подходить взвешенно и осторожно. К слову сказать, в игре «Футбольный стрелок» значение скорости задано жестко, но можно производить выбор скорости объекта на экране непосредственно с созданием этого объекта и далее на каждом уровне игры, внося элемент случайности (в последней главе книги мы так и поступим).
В исходном коде класса Game1 и методе MoveBall()на этой стадии нас ждут небольшие изменения, которые выглядят следующим образом:

void MoveBall()
{
for (int i = 0; ball.Length > i; i++)
{
if (ball.position.Y 20.4. Небо и тучи
Задний фон за стадионом в игре закрашивается цветом. Сейчас это уже неактуально, и для формирования полноценной сцены необходимо создать небо, тучи и другие элементы пейзажа. Механика представления этих элементов в играх достаточно обширна. Поскольку игра «Футбольный стрелок» имеет статичную камеру и точка просмотра сцены не изменяется, то можно воспользоваться текстурой пейзажа и поставить это изображение за элементами сцены.
В большинстве игр этот механизм используется повсеместно, но если камера в игре двигается, то добавляется более сложный механизм, основанный либо на прокрутке текстуры фона в разных направлениях, либо на использовании кубических текстур для представления небесной оболочки (Sky Box). У нас вся трехмерная сцена попроще, поэтому вполне достаточно простой текстуры с пейзажем, установленной на заднем фоне игры.
Текстура пейзажа была взята с сайта Turbosquid.com. Это графическое изображение в формате JPG распространяется бесплатно. Пейзаж создан художником под именем Hal9000 (рис. 20.3).

Рис. 20.3. Страница изображения hallake001

Графическое изображение этого пейзажа оказалось очень большим по ширине (3000 пикселей), поэтому пришлось обрезать его по бокам, укоротив изображение по ширине до 1500 пикселей.
Для добавления фона в игру объявим новую переменную background.

private Texture2D background;

Изображение фона статично, поэтому можно обойтись и без объекта класса Sprite. После объявления объекта background в методе LoadGraphicsContent() загружаем пейзаж в игру.

background = content.Load(«Content\\Textures\\hallake001»);

А затем в методе Draw() рисуем его на экране телевизора.

spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
spriteBatch.Draw(background, new Vector2(0, -50), Color.White);
spriteBatch.End();


При этом само изображение фона мы рисуем самым первым, не забывайте, что
каждый последующий рисуемый элемент графики всегда накладывается поверх предыдущего!
Изображение hallake001 по высоте равно 500 пикселям. По оси Y мы сместили изображение вверх на 50 пикселей. Сделано это просто для красоты. То есть после того как изображение было загружено, а игра запущенна на приставке, было подобрано оптимальное местоположение фона, исходя из общей картинки на экране телевизора.
В листинге 20.1 вы найдете полный исходный код текущего примера, где все нововведения выделены жирным шрифтом. Сам проект располагается на компакт-диске в папке Code\Chapter20\Plane.

//=========================================================================
///
/// Листинг 20.1
/// Проект: Plane
/// Класс: Game1
/// Трехмерная сцена
///
//=========================================================================


#region Using Statements
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
#endregion
namespace Plane
{
public class Game1 : Microsoft.Xna.Framework.Game
{
private enum CurentGameState
{
…
}
CurentGameState gameState = CurentGameState.GameScreen;
GraphicsDeviceManager graphics;
ContentManager content;
int screenWidth, screenHeight;
Matrix view;
Matrix proj;
Matrix world;
static float aspectRatio;
static float FOV = MathHelper.PiOver4;
static float nearClip = 1.0f;
static float farClip = 1000.0f;
private ModelClass[] ball = new ModelClass[3];
Random rand = new Random();
SpriteBatch spriteBatch;
Sprite cursor;
public BoundingSphere[] bb = new BoundingSphere[3];
Vector3 camera = new Vector3(0.0f, 0.0f, 150.0f);
private ModelClass stadium;
private Texture2D background;
///
/// Конструктор
///
public Game1()
{
graphics = new GraphicsDeviceManager(this);
content = new ContentManager(Services);
graphics.PreferredBackBufferWidth = 1280;
graphics.PreferredBackBufferHeight = 720;
screenWidth = graphics.PreferredBackBufferWidth;
screenHeight = graphics.PreferredBackBufferHeight;
for (int i = 0; ball.Length > i; i++)
{
ball = new ModelClass();
}
cursor = new Sprite();
stadium = new ModelClass();
}
///
/// Инициализация
///
protected override void Initialize()
{
spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
aspectRatio = (float)screenWidth / (float)screenHeight;
base.Initialize();
}
///
/// Загрузка компонентов игры
///
protected override void LoadGraphicsContent(bool loadAllContent)
{
if (loadAllContent)
{
ball[0].Load(content, «Content\\Models\\Soccerball»);
ball[1].Load(content, «Content\\Models\\SoccerballGreen»);
ball[2].Load(content, «Content\\Models\\SoccerballRed»);
for (int i = 0; ball.Length > i; i++)
{
ball.position.X = rand.Next(-(rand.Next(0, 60)),
rand.Next(0, 60));
ball.position.Y = rand.Next(50, 80);
ball.position.Z = -(rand.Next(20, 100));
}
cursor.Load(content, «Content\\Textures\\cursor»);
cursor.spritePosition = new Vector2(400, 300);
stadium.Load(content, «Content\\Models\\stadium 1»);
stadium.position = new Vector3(0, 0, 0);
background = content.Load(«Content\\Textures\\hallake001»);
}
}
///
/// Освобождаем ресурсы
///
protected override void UnloadGraphicsContent(bool unloadAllContent)
{
…
}
///
/// Обновляем состояние игры
///
protected override void Update(GameTime gameTime)
{
…
}
///
/// Рисуем на экране
///
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(new Color(159, 147, 207));
switch (gameState)
{
case CurentGameState.SplashScreen:
{
break;
}
case CurentGameState.MenuScreen:
{
break;
}
case CurentGameState.AboutScreen:
{
break;
}
case CurentGameState.GameScreen:
{
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
spriteBatch.Draw(background, new Vector2(0, -50), Color.White);
spriteBatch.End();
graphics.GraphicsDevice.RenderState.DepthBufferEnable = true;
view = Matrix.CreateLookAt(camera, Vector3.Zero, Vector3.Up);
proj = Matrix.CreatePerspectiveFieldOfView(FOV, aspectRatio,
nearClip, farClip);
for (int i = 0; ball.Length > i; i++)
{
world = Matrix.CreateTranslation(ball.position);
ball.DrawModel(world, view, proj);
}
world = Matrix.CreateTranslation(stadium.position);
stadium.DrawModel(world, view, proj);
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
cursor.DrawSprite(spriteBatch);
spriteBatch.End();
break;
}
case CurentGameState.GameOverScreen:
{
break;
}
case CurentGameState.VictoryScreen:
{
break;
}
}
base.Draw(gameTime);
}
///
/// Движение мячей
///
void MoveBall()
{
for (int i = 0; ball.Length > i; i++)
{
if (ball.position.Y
/// Прицел
///
void GamePadClick()
{
…
}
///
/// Преобразовываем координаты
///
Ray GetPickRay()
{
…
}
}
}

Далее >>
531 Прочтений •  [Формируем трехмерную сцену [Xbox 360]] [19.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Формируем трехмерную сцену [Xbox 360] Ukraine Vova 19.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка