Flatik.ru

Перейти на главную страницу

Поиск по ключевым словам:

страница 1
Иван Андреев

[email protected]


XNA для начинающих. Практика. Перемещение объектов в 2D пространстве


Целью данной работы является получение базовых навыков работы с 2D графикой и игровым временем.

Задание на работу:

Создать XNA приложение, установить размеры окна. Нарисовать в левом верхнем углу экрана спрайт произвольного размера (лучше установить достаточно большой размер). При прохождении некоторого количества времени (либо при нажатии на кнопку на клавиатуре) спрайт должен переместиться в правый верхний угол, затем в правый нижний угол, левый нижний угол и, наконец, в центр экрана, причем центр спрайта должен совпасть с центром экрана. Далее, можно либо зациклить перемещение, либо оставить спрайт в центре экрана.



Теоретическая часть:

Основы 2Д графики

Перед тем как перейти к работе следует вспомнить теоретические основы. В двумерной графике каждый пиксель характеризуется координатами и цветом. На экране монитора (а также в любом компьютерном изображении, например, картинке, созданной в Paint) началом координат является левый верхний угол, ось X направлена слева направо, а ось Y сверху вниз. Координаты пикселя отсчитываются от 0, соответственно левый верхний угол экрана имеет координаты {0,0}, а правый нижний – {MaxX-1, MaxY-1}, где MaxX, MaxY – разрешение экрана.

Для того чтобы установить разрешение окна в XNA Framework необходимо написать следующий код:
public Game1()

{

graphics = new GraphicsDeviceManager(this);



Content.RootDirectory = "Content";
graphics.PreferredBackBufferWidth = 640;

graphics.PreferredBackBufferHeight = 480;

}

В данном примере ширина устанавливается равной 640, а высота – 480.



Цвет пикселя составляется из трех компонент: красной, синей и зеленой (также имеется альфа-канал, который отвечает за прозрачность данного пикселя для изображений, для пикселя монитора альфа составляющая не имеет смысла). Значения цвета по каждой из этих компонент лежат в диапазоне от 0 до 255 либо от 0 до 1. Так, если значения каждой из компонент равняются 255, получается белый цвет, а если значения равняются 0, то получается черный свет.

Для работы с цветами в XNA существует класс Color, который поддерживает огромное количество стандартных цветов (например, Color.Red – красный, Color.Black - черный), а также позволяет создавать собственные цвета.



SpriteBatch

Основным объектом для работы с 2D графикой является SpriteBatch, более подробно работа со SpriteBatch будет рассмотрена в следующих практических занятиях, в рамках данного занятия необходимо знать лишь основные особенности работы со SpriteBatch.

Вся работа по отображению изображений на экран осуществляется в рамках блоков SpriteBatch.Begin – SpriteBatch.End. Для собственно отображения изображений на экран нужно использовать метод SpriteBatch.Draw. Существуют большое количество перегруженных вариантов вызова данного метода, однако в рамках данной работы будет рассмотрен наиболее простой.




public void Draw (

Texture2D texture,

Vector2 position,

Color color

)


texture – изображение, которое необходимо нарисовать на экране.

position – позиция левого верхнего угла изображения на экране.

color – цвет, используемый для смешивания перед выводом изображения на экран. Чаще всего, этот параметр будет принимать значение Color.White. В таком случае изображение будет иметь цвета, которые были заданы при создании изображения. Вы можете самостоятельно поэксперементировать с данным параметром.

Загрузка содержимого (контента) игры

Перед тем как работать с изображениями (или другими типами игрового содержимого: моделями, звуками, шрифтами и т.д.) необходимо загрузить их в игру при помощи ContentManager.

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

Загрузка определенного типа содержимого осуществляется вызовом метода Content.Load<ТипСодержимого>(“НазваниеФайлаСодержимого”).

Например, работы с друмерными изображениями в XNA Frawework используется класс Texture2D.

sprite = Content.Load("filename");

Объект Texture2D содержит различные свойства, которые пригодятся нам для реализации данной работы.

В частности, Width и Height возращают значения ширины и высоты исходного изображения.



Игровое время

Теперь вспомним основы работы с игровым временем в XNA Framework. Методы Update и Draw получают в качестве параметра единственный объект GameTime, который отвечает за игровое время.



Рассмотрим основые свойства объекта GameTime:

ElapsedGameTime

Игровое время, прошедшее с предыдущего вызова метода Draw/Update

ElapsedRealTime

Реальное время, прошедшее с предыдущего вызова метода Draw/Update

IsRunningSlowly

Если это свойство имеет значение true, то время, проходящее между последовательными вызовами метода Update/Draw больше значения, указанного в TargetElapsedTime. Это означает, что игра работает медленнее, чем требуется. Если IsRunningSlowly равняется true, то стоит задуматься над оптимизацией

TotalGameTime

Игровое время, прошедшее с запуска игры

TotalRealTime

Реальное время, прошедшее с запуска игры

Для нас наиболее важными свойствами являются ElapsedGameTime и TotalGameTime. Они возвращают объект типа TimeSpan, который имеет множество различных свойств. Рассмотрим лишь наиболее важные:

Days

Целое количество дней

Hours

Целое количество часов

Milliseconds

Целое количество миллисекунд

Minutes

Целое количество минут

Seconds

Целое количество секунд

Ticks

Целое количество системных «тиков»

TotalDays

Вещественное значение дней

TotalHours

Вещественное значение часов

TotalMilliseconds

Вещественное значение миллисекунд

TotalMinutes

Вещественное значение минут

TotalSeconds

Вещественное значение секунд

Обратите внимание на то, что свойства, название которых не начинается с Total, возвращают целое число, то есть, например, Days будет иметь значение 0 до тех пор, пока не пройдет целый день. В то же время значение TotalDays будет постоянно увеличиваться и по-прошествие дня примет значение 1.

Реализация:

В следующем листинге приведена простая реализация без зацикливания и обработки пользовательского ввода:

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 Microsoft.Xna.Framework.Net;

using Microsoft.Xna.Framework.Storage;


namespace Lab1

{

///



/// This is the main type for your game

///

public class Game1 : Microsoft.Xna.Framework.Game

{

GraphicsDeviceManager graphics;



SpriteBatch spriteBatch;
Texture2D sprite;
int width;

int height;


public Game1()

{

graphics = new GraphicsDeviceManager(this);



Content.RootDirectory = "Content";
width = graphics.PreferredBackBufferWidth = 800;

height = graphics.PreferredBackBufferHeight = 600;

}
///

/// Allows the game to perform any initialization it needs to before starting to run.

/// This is where it can query for any required services and load any non-graphic

/// related content. Calling base.Initialize will enumerate through any components

/// and initialize them as well.

///

protected override void Initialize()

{

// TODO: Add your initialization logic here


base.Initialize();

}
///

/// LoadContent will be called once per game and is the place to load

/// all of your content.

///

protected override void LoadContent()

{

// Create a new SpriteBatch, which can be used to draw textures.



spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here

sprite = Content.Load("hero");

}
///

/// UnloadContent will be called once per game and is the place to unload

/// all content.

///

protected override void UnloadContent()

{

// TODO: Unload any non ContentManager content here



}
///

/// Allows the game to run logic such as updating the world,

/// checking for collisions, gathering input, and playing audio.

///

///
Provides a snapshot of timing values.

protected override void Update(GameTime gameTime)

{

// Allows the game to exit



if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

this.Exit();


// TODO: Add your update logic here
base.Update(gameTime);

}
///

/// This is called when the game should draw itself.

///

///
Provides a snapshot of timing values.

protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);


// TODO: Add your drawing code here

// Координаты левого верхнего угла экрана

Vector2 pos = new Vector2(0, 0);
if (gameTime.TotalGameTime.TotalSeconds > 1)

{

// Координаты правого верхнего угла экрана


pos = new Vector2(width - sprite.Width, 0);

}

if (gameTime.TotalGameTime.TotalSeconds > 2)



{

pos = new Vector2(width - sprite.Width, height - sprite.Height);

}

if (gameTime.TotalGameTime.TotalSeconds > 3)



{

pos = new Vector2(0, height - sprite.Height);

}

if (gameTime.TotalGameTime.TotalSeconds > 4)



{

pos = new Vector2(width / 2 - sprite.Width / 2, height/2 - sprite.Height/2);

}
spriteBatch.Begin();

spriteBatch.Draw(sprite, pos, Color.White);

spriteBatch.End();
base.Draw(gameTime);

}

}



}


Xna для начинающих. Практика. Перемещение объектов в 2D пространстве

Целью данной работы является получение базовых навыков работы с 2D графикой и игровым временем

88.39kb.

11 10 2014
1 стр.


Xna для начинающих. Практика. Основы 2Д. Работа со SpriteBatch. Масштабирование, повороты, отражения

Целью данной работы является освоение основного объекта для работы с двумерной графикой в xna – класса SpriteBatch. В ходе работы мы рассмотрим различные преобразования над двумерн

100.77kb.

11 10 2014
1 стр.


Общие методы определения перемещений

Если единичная сила Р=1 вызвала перемещение Р, то полное перемещение вызванное силой Р, будет: Р=РР. Если силовые факторы, действующие на систему, обозначить Х1,Х2,Х3 и т д., т

47.45kb.

02 09 2014
1 стр.


Эффект реверберации: теория и практика

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

106.37kb.

06 10 2014
1 стр.


Практика для начинающих Возжигаемся всеми своими лучшими накоплениями Сердца, Разума, Души, Тела. Возжигаемся

И закручиваем их вокруг себя в виде вихря, пробуждая, возжигая ими каждую клеточку, каждое ядро своего тела

32.43kb.

02 09 2014
1 стр.


«Экзит-поллы в России и снг: теория и практика электоральных исследований»

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

51.2kb.

29 09 2014
1 стр.


Учебное пособие для студентов физического факультета кгу, обучающихся по специальности «Астрономогеодезия»

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

1159.15kb.

14 12 2014
4 стр.


1. Общие сведения о системах радиолокации Классификация систем радиолокации

Радиолокацией называется совокупность методов и технических средств, предназначенных для обнаружения различных объектов в пространстве, измерения их координат и параметров движения

311.33kb.

02 10 2014
1 стр.