Иван Андреев

andreev. *****@***com

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

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

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

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

Перед тем как перейти к работе следует вспомнить теоретические основы. В двумерной графике каждый пиксель характеризуется координатами и цветом. На экране монитора (а также в любом компьютерном изображении, например, картинке, созданной в 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 - черный), а также позволяет создавать собственные цвета.

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

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. ;

using Microsoft. Xna. Framework. Storage;

namespace BlendModeTest

{

/// <summary>

/// This is the main type for your game

/// </summary>

public class Game1 : Microsoft. Xna. Framework. Game

{

GraphicsDeviceManager graphics;

SpriteBatch spriteBatch;

Texture2D tex;

public Game1()

{

graphics = new GraphicsDeviceManager(this);

Content. RootDirectory = "Content";

graphics. PreferredBackBufferWidth = 640;

graphics. PreferredBackBufferHeight = 480;

}

/// <summary>

/// 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.

/// </summary>

protected override void Initialize()

{

// TODO: Add your initialization logic here

Color[] colors = new Color[640 * 480];

Random rand = new Random();

for (int i = 0; i < colors. Length; i++)

{

byte r = (byte)rand. Next(255);

byte g = (byte)rand. Next(255);

byte b = (byte)rand. Next(255);

colors[i] = new Color(r, g, b);

}

tex = new Texture2D(GraphicsDevice, 640, 480);

tex. SetData<Color>(colors);

base. Initialize();

}

/// <summary>

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

/// all of your content.

/// </summary>

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

}

/// <summary>

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

/// all content.

/// </summary>

protected override void UnloadContent()

{

// TODO: Unload any non ContentManager content here

}

/// <summary>

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

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

/// </summary>

/// <param name="gameTime">Provides a snapshot of timing values.</param>

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);

}

/// <summary>

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

/// </summary>

/// <param name="gameTime">Provides a snapshot of timing values.</param>

protected override void Draw(GameTime gameTime)

{

GraphicsDevice. Clear(Color. CornflowerBlue);

// TODO: Add your drawing code here

spriteBatch. Begin();

spriteBatch. Draw(tex, new Vector2(0, 0), Color. White);

spriteBatch. End();

base. Draw(gameTime);

}

}

}

Результирующее изображение