Я пишу приложение XNA 3.1 для класса C # / XNA, которое сейчас беру.Это очень простое вводное назначение, в котором пользователь просто меняет цвет экрана, нажимая кнопки R, G или B на клавиатуре, чтобы выбрать цветовой канал, а затем стрелки вверх и вниз, чтобы увеличить или уменьшить значение этого канала..
Если я увеличиваю байт после 255
, он возвращается к 0
, и наоборот для уменьшения, предположительно потому, что C # фактически преобразовывает byte
в int
при выполнении арифметики над ними.Однако мой профессор специально спрашивает, что, как только канал достигает своего максимального или минимального значения, он остается там, если пользователь пытается выйти за эти пределы.Я сам нашел способ исправить это, но ничего не нашел, когда искал решения этой проблемы здесь или в Google.Вот как я решил эту проблему:
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
// ...
Color color;
private int Red
{
set { color.R = NoWrapIntToByte(value); }
get { return (int)color.R; }
}
private int Green
{
set { color.G = NoWrapIntToByte(value); }
get { return (int)color.G; }
}
private int Blue
{
set {color.B = NoWrapIntToByte(value); }
get { return (int)color.B; }
}
/// <summary>
/// Converts an integer to a byte but doesn't wrap.
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
static byte NoWrapIntToByte(int x)
{
if (x < Byte.MinValue)
return Byte.MinValue;
else if (x > Byte.MaxValue)
return Byte.MaxValue;
else
return (byte)x;
}
}
Каждый раз, когда вызывается метод Draw()
, цвет, сохраненный в color
, устанавливается как цвет экрана.
Просто для ясности, я понимаю, что не могу сделать что-то вроде
byte x = 256; // compiler error
, компилятор будет жаловаться.Однако, когда пользователь нажимает стрелки вверх или вниз, этот цветной канал увеличивается или уменьшается, и если канал уменьшается ниже 0 или увеличивается выше 255, он будет перенесен.Я использовал int
в качестве типа свойств канала, потому что, если я использую что-то вроде Red -= 1
или Red += 1
, могут возникнуть разные ожидания, если я выйду за пределы.Если я добавлю, я ожидаю, что результирующее значение будет меньше исходного значения, и наоборот, если я уменьшу.Я использую int
, потому что это позволяет мне обнаруживать это в свойстве и обрабатывать соответственно.
Я думаю, что мое решение в порядке, но мне любопытно, если я что-то пропускаю.Я не могу быть единственным человеком, который пытался решить эту проблему, поэтому мне любопытно, каким будет идиоматический или наилучший способ решения этой проблемы.Я не прошу ответов на мою домашнюю проблему, так как у меня уже есть решение, которое работает.Тем не менее, я не очень хорошо знаю C #, поэтому мне любопытно, есть ли гораздо более простой способ сделать то же самое, или с меньшим количеством кода, чем у меня здесь.Я знаю, что могу заставить C # генерировать исключение Overflow
, но это требует изменения настроек проекта, и оно также не говорит мне конкретно, какого рода.
Спасибо!