Создание простой игры в XNA

Автор работы: Пользователь скрыл имя, 31 Октября 2013 в 13:46, курсовая работа

Краткое описание

Развитие цивилизации в нашем веке непременно идет в паре с развитием разнообразных технологий. Сегодняшние темпы компьютеризации превышают темпы развития всех других отраслей. Без компьютеров и компьютерных сетей не обходится сегодня ни одна средняя фирма, не говоря о больших компаниях. Все чаще человек начинает взаимодействовать с компьютером - на работе, дома, в машине и даже в самолете. Компьютеры стремительно внедряются в человеческую жизнь. Все больше занимая свое место в нашем сознании.

Вложенные файлы: 1 файл

kursovaya.doc

— 1.92 Мб (Скачать файл)

МИНОБРНАУКИ РОССИИ

Государственное образовательное учреждение высшего профессионального образования

«Волгоградский государственный педагогический университет»

 

 

 

Факультет математики информатики и физики

 

 

 

 

 

 

 

________узнать полное название__________

___________________________________________

 

Курсовая работа

 

 

 

Исполнитель:

Николаенко Александра Александровна                                                                          

                                                                     (гр. ИНБ-31)

___________________

 

Научный руководитель:

Завьялов Дмитрий Викторович,

кандидат физ.-мат.наук, доцент.

         __________________________                        

 

 

 

 

 

 

 

Волгоград

 

 

Введение

 

Развитие цивилизации в нашем веке непременно идет в паре с развитием разнообразных технологий. Сегодняшние темпы компьютеризации превышают темпы развития всех других отраслей. Без компьютеров и компьютерных сетей не обходится сегодня ни одна средняя фирма, не говоря о больших компаниях. Все чаще человек начинает взаимодействовать с компьютером - на работе, дома, в машине и даже в самолете. Компьютеры стремительно внедряются в человеческую жизнь. Все больше занимая свое место в нашем сознании.

Компьютерный рынок постоянно наполняется новыми подробными программами, увеличивается скорость процессоров, объем носителей сохранения памяти. В этой технологической борьбе не последнее место занимает явление, которое возникло вместе с компьютерами, а именно компьютерные  игры.

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

В наше время развитая интеллектуальная гибкость обеспечит приспособление к новым неизвестным реальностям.Компьютерные  игры выполняют таким образом функцию социализации молодежи в постиндустриальном обществе. Развитие и совершенствование игр тесно связано с развитием компьютерного обеспечения и технологий. Многие составные части компьютеров разрабатываются специально для игр. Например дорогие видео карты стоимость которых доходит до половины стоимости удовлетворительного компьютера для работы в офисе.

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

Среди игр всех времен выделяются так называемые культовые игры. Обычно эти игры приобретают миллионы почитателей, создатели таких игр нередко становятся миллионерами. Как правило игры такого рода очень медленно стареют . Например сегодня многие люди с удовлетворением играют в игры десятилетней давности, такие как «арканоид». Я считаю что с помощью .Net технологий можно реализовать функциональность игры «арканоид» ярко и полноценно. То, что предоставляет Visual Studio 2008 с XNA Game Studio, даёт возможность удобно и быстро разрабатывать игру. Я выбрала эту тему моего курсового проекта потому что мне понравилась идея реализовать одну из культовых игр на платформе .Net с использованием XNA Game Studio. 

О платформе

 

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

Инструментарий XNA изначально разрабатывался с целью максимально облегчить процесс разработки игр для консоли Xbox и компьютеров, работающих под управлением операционной системы Windows. Вместе с тем, пакет XNA позволит распространить общие сервисы Xbox Live, такие как, например, аутентификация, на игры для персональных компьютеров. Инструментарий XNA позволяет Microsoft конкурировать с Sony на рынке видеоигр для следующего поколения игровых приставок.

 

Плюсы XNA:

 

Кросс-платформенность и очень лёгкий доступ на консоль Xbox 360;

Готовые библиотеки нижнего уровня для работы с оборудованием и контентом;

Относительно простой в изучении и использовании язык C#;

Большой объём свободного для использования контента;

Бесплатна для Windows.

Минусы XNA:

 

Зависимость от .NET Framework;

Для запуска приложения необходимы библиотеки XNA Game Studio;

Платна для Xbox 360.

 

 

 

Создание проекта

 

Создадим новый проект – XNA Game Studio 3.1 – Windows Game (3.1)

 

 

Мастер создаст скелет игры:

 

Самый большой интерес для нас представляет файл Game1.cs, в котором определен класс Game1, наследованный от Microsoft.Xna.Framework.Game, где мы и будем разрабатывать нашу игру.

В классе Game1 переопределены следующие методы Game:

 

void Initialize() – Вызывается единожды, для инициализации ресурсов до начала игры

void LoadContent() – Вызывается единожды, используется для загрузки контента (спрайты и т.д.)

void UnloadContent() – Вызывается единожды, используется для выгрузки контента

void Update(GameTime gameTime) – В этом методе реализуется собственно логика игры, обработка коллизий, обработка событий клавиатуры или джойстика, проигрывание аудио и т.д.

void Draw(GameTime gameTime) – Вызывается для прорисовки игрового поля.

 

На данный момент скомпилированная игра выглядит вот так

 

 

Добавление контента

 

Добавим игровые ресурсы, в данном случае картинки фона кирпича, ракетки и мячика – Content (Right Click) -> Add -> Existing Item…

 

Обратите внимание на свойство Asset Name, его мы используем для создания обьекта Texture2D необходимого для дальнейшей анимации.

 

Рисуем фон игрового поля

 

Загрузим изображение для фона игрового поля:

 

private Rectangle _viewPortRectangle; // Границы игрового поля

 

private Texture2D _background; // Фон игрового поля

 

protected override void LoadContent()

 

{

 

<... skip ...>

 

// Границы игрового поля

 

_viewPortRectangle = new Rectangle(0, 0,

 

graphics.GraphicsDevice.Viewport.Width,

 

graphics.GraphicsDevice.Viewport.Height);

 

 

 

_background = Content.Load<Texture2D>(@"background");

 

<... skip ...>

 

}

 

 

 

Отрисовка фона

 

 

protected override void Draw(GameTime gameTime)

 

{

 

GraphicsDevice.Clear(Color.CornflowerBlue);

 

 

spriteBatch.Begin(SpriteBlendMode.AlphaBlend);

 

// Рисуем фон

 

spriteBatch.Draw(_background, _viewPortRectangle, Color.White);

 

spriteBatch.End();

 

base.Draw(gameTime);

 

}

 

 

 

Метод SpriteBatch.Begin подготавливает графическое устройство к отрисовке спрайтов, SpriteBatch.End завершает процесс отрисовки и возвращает устройство к начальному состоянию. Все методы SpriteBatch.Draw должны быть заключены в SpriteBatch.Begin — SpriteBatch.End.

 

Создание игрового обьекта

 

 

Создадим класс GameObject инкапсулирующий любой из наших игровых обьектов:

 

 

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Graphics;

 

namespace Arkanoid

 

{

 

public class GameObject

 

{

 

public Texture2D Sprite { get; set; } // Спрайт

 

public Vector2 Position; // Положение

 

public Vector2 Velocity; // Скорость

 

public int Width { get { return Sprite.Width; } } // Ширина

 

public int Height { get { return Sprite.Height; } } // Высота

 

public bool IsAlive { get; set; } // Жив ли обьект

 

public Rectangle Bounds // Границы обьекта

 

{

get

{

 

return new Rectangle((int)Position.X, (int)Position.Y, Width, Height);    }

}

// Разворачивание движения по горизонтальной оси

 

public void ReflectHorizontal()

 

{

 

Velocity.Y = -Velocity.Y;

 

}

 

// Разворачивание движения по вертикальной оси

 

public void ReflectVertical()

 

{

 

Velocity.X = -Velocity.X;

 

}   

 

public GameObject(Texture2D sprite)

 

{

 

Sprite = sprite;

 

IsAlive = true;

 

Position = Vector2.Zero;

 

Velocity = Vector2.Zero;

 

}

}

}

 

Отрисовка и анимация ракетки

 

 

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

 

 

private GameObject _paddle; // Ракетка

 

protected override void LoadContent()

 

{

<... skip ...>

 

// Создание ракетки, начальное положение в середине игрового поля, повыше нижнего края

 

_paddle = new GameObject(Content.Load<Texture2D>(@"paddle"));

 

_paddle.Position = new Vector2((_viewPortRectangle.Width - _paddle.Width) / 2,

 

_viewPortRectangle.Height - _paddle.Height - 20);

 

 

<... skip ...>

}

 

 

Отрисовка ракетки на экране

 

 

protected override void Draw(GameTime gameTime)

 

{

<... skip ...>

 

spriteBatch.Draw(_paddle.Sprite, _paddle.Position, Color.White);

 

<... skip ...>

 

}

 

Неплохо было бы заставить реагировать ракетку на нажатие клавиш, для этого добавим в метод Update следующий код

 

protected override void Update(GameTime gameTime)

 

{

<... skip ...>

 

KeyboardState keyboardState = Keyboard.GetState();

 

// Двигаем ракетку вправо

 

if (keyboardState.IsKeyDown(Keys.Right))

 

_paddle.Position.X += 6f;

 

 

// Двигаем ракетку влево

 

if (keyboardState.IsKeyDown(Keys.Left))

 

_paddle.Position.X -= 6f;

 

 

// Ограничиваем движение ракетки игровым полем

 

_paddle.Position.X = MathHelper.Clamp(_paddle.Position.X, 0, _viewPortRectangle.Width - _paddle.Width);

 

 

<... skip ...>

 

}

 

 

Отрисовка кирпичей

 

 

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

 

private int _brickPaneWidth = 10; // Сколько кирпичей рисовать в ширину

 

private int _brickPaneHeight = 5; // Сколько кирпичей рисовать в высоту

 

private Texture2D _brickSprite; // Спрайт кирпича

 

private GameObject[,] _bricks; // Массив кирпичей

 

Добавим следующий код в метод LoadContent()

 

protected override void LoadContent()

 

{

 

<... skip ...> 

 

// Создание массива кирпичей

 

_brickSprite = Content.Load<Texture2D>(@"brick");

 

_bricks = new GameObject[_brickPaneWidth,_brickPaneHeight];

 

for (int i = 0; i < _brickPaneWidth; i++)

{

for (int j = 0; j < _brickPaneHeight; j++)

{

_bricks[i, j] = new GameObject(_brickSprite)

{

Position = new Vector2(i * 55 + 120, j * 25 + 100)

};

}

}

 

 

<... skip ...>

}

 

Отрисовка массива кирпичей, отрисовка производится если кирпич “жив”, т.е. не разбит мячем

 

protected override void Draw(GameTime gameTime)

{

<... skip ...>

 

// Рисуем кирпичи

 

foreach (var brick in _bricks)

 

if (brick.IsAlive)

 

spriteBatch.Draw(brick.Sprite, brick.Position, Color.White);

<... skip ...>

}

 

 

Отрисовка мячика

 

Создаем обьект мячика

private GameObject _ball; // Мячик

 

protected override void LoadContent()

 

{

 

<... skip ...>

 

// Создание мячика, начальное положение в середине на ракетке,

 

// начальное направление - вправо, вверх

 

_ball = new GameObject(Content.Load<Texture2D>(@"ball"));

 

_ball.Position = new Vector2((_viewPortRectangle.Width - _ball.Width) / 2,

 

_viewPortRectangle.Height - _paddle.Height - _ball.Height - 20);

 

_ball.Velocity = new Vector2(3,-3);

 

<... skip ...>

}

 

Для анимации мячика добавим новый метод UpdateBall(), и его вызов в в метод Update(). Данный метод нам понадобится в дальнейшем для обработки столкновений мячика с кирпичами и ракеткой

 

private void UpdateBall()

{

_ball.Position += _ball.Velocity;

}

protected override void Update(GameTime gameTime)

{

<... skip ...>

// Двигаем мячик

 

UpdateBall();

 

<... skip ...>

}

 

Для отрисовки мячика добавим следующий код в метод Draw()

 

protected override void Draw(GameTime gameTime)

 

{

<... skip ...>

// Рисуем мячик

 

spriteBatch.Draw(_ball.Sprite, _ball.Position, Color.White);

 

<... skip ...>

}

 

 

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

 

Обработка столкновений

 

 

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

 

// Определение стороны столкновения и отражение направления полета мячика

public void Collide(GameObject gameObject, Rectangle rect2)

{

 

// Обьект столкнулся сверху или снизу, отражаем направление полета по горизонтали

 

if (rect2.Left <= gameObject.Bounds.Center.X && gameObject.Bounds.Center.X <= rect2.Right)

 

gameObject.ReflectHorizontal();

 

 

// Обьект столкнулся слева или справа, отражаем направление полета по вертикали

 

else if (rect2.Top <= gameObject.Bounds.Center.Y && gameObject.Bounds.Center.Y <= rect2.Bottom)

 

gameObject.ReflectVertical();

}

 

Добавим следующий код в метод UpdateBall()

 

private void UpdateBall()

 

{

 

// Будущее положение мяча, нужно для предотвращения "залипания" мяча на поверхности обьекта

 

Rectangle nextRect = new Rectangle((int)(_ball.Position.X + _ball.Velocity.X),

 

(int)(_ball.Position.Y + _ball.Velocity.Y),

 

_ball.Width, _ball.Height);

 

// Столкновение с верхним краем игрового поля

 

if (nextRect.Y <= 0)

Информация о работе Создание простой игры в XNA