Иван Андреев
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);
}
}
}

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


