C#/XNA 클래스 용 XNA 3.1 응용 프로그램을 작성하고 있습니다. 사용자가 단순히 화면의 색상을 변경하고 키보드의 R, G 또는 B 버튼을 눌러 색상 채널을 선택한 다음 위아래 화살표를 눌러 해당 채널의 값을 높이거나 낮추는 간단한 소개입니다. . 내가 감소하는의는 다시 0
에 랩 255
과거 바이트, 그 반대를 증가하면 그들에 연산을 수행 할 때255가 넘어갈 때 바이트가 0으로 되돌아 가지 않도록 방지
는 C#을 실제로 int
에 byte
변환 아마도 때문이다. 그러나 교수는 특별히 채널이 최대 값이나 최소값에 도달하면 사용자가이 범위를 벗어나려고하면 채널에 머물러있게됩니다. 나는이 문제를 해결하기위한 방법을 혼자서 찾았지만, 여기 또는 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보다 커지면 줄 바꿈됩니다. Red -= 1
또는 Red += 1
과 같은 것을 사용하고 있다면 범위를 벗어날 경우 다른 기대치가 발생하기 때문에 채널 속성의 유형으로 int
을 사용했습니다. 추가하는 경우 결과 값이 원래 값보다 작을 것으로 예상하고 반대의 경우는 감소시킬 것입니다. int
을 사용하고 있습니다. 속성에서이를 감지하고 이에 따라 처리 할 수 있기 때문입니다.
내 솔루션은 괜찮다고 생각하지만 뭔가를 간과한다면 궁금합니다. 나는이 문제를 해결하려고 노력한 유일한 사람이 될 수 없으므로이 문제를 해결하기 위해 관용적이거나 모범 사례가 될 수있는 것이 궁금합니다. 나는 이미 해결책이 있기 때문에 숙제 문제에 대한 답을 요구하지는 않습니다. 그러나, 나는 C#을 잘 모른다. 그래서 똑같은 일을하는 훨씬 간단한 방법이 있거나 여기에있는 코드보다 적은 코드가 있다면 나는 궁금하다. 나는 C#에서 Overflow
예외를 던지게 할 수 있다는 것을 알고 있지만, 프로젝트 설정을 변경해야하고 또한 어떤 종류인지 구체적으로 알려주지 않는다.
감사합니다!
바이트 x = 256이 한 바이트에 비해 너무 큰 경우 255가 가장 큰 값이므로 컴파일러가 정확합니다. 나는 당신의 해결책이 좋다고 생각합니다. 나는 그것을 확장으로 써야 하겠지만, 그것은 나 뿐이다. –
예, 저는 컴파일러가 불평 할 것이라고 언급했습니다. 어쩌면 나는 명확성을 위해 코멘트를 추가 할 것이다 ... –
왜 처음에'int'를 사용하고 있습니까? 항상 '바이트'를 사용하지 않는 이유는 무엇입니까? 그것은 많은 캐스팅을 피할 것입니다. – DonkeyMaster