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

advertisement
Иван Андреев
andreev.ia@gmail.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
using
using
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
Microsoft.Xna.Framework;
Microsoft.Xna.Framework.Audio;
Microsoft.Xna.Framework.Content;
Microsoft.Xna.Framework.GamerServices;
Microsoft.Xna.Framework.Graphics;
Microsoft.Xna.Framework.Input;
Microsoft.Xna.Framework.Media;
Microsoft.Xna.Framework.Net;
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);
}
}
}
Результирующее изображение
Download