Есть ли способ сделать закругленные углы на прямоугольнике, отображаемом в XNA с помощью примитивов (линейных полос)? Я хочу сделать свой пользовательский интерфейс немного более элегантным, чем он есть, и я хотел бы, чтобы код был гибким, без слишком большого количества текстур.
10
Ответы:
Вы можете визуализировать свой примитив и создать шейдер, который может создавать эти закругленные углы.
Вот простой пиксельный шейдер в псевдокоде, который может нарисовать округленный квадрат:
Результат этого пиксельного шейдера:
Если вы используете шейдеры, вы можете сделать действительно модный пользовательский интерфейс, даже анимированный.
Для меня здорово прототипировать простые пиксельные шейдеры - это программа EvalDraw
источник
Другой способ сделать это - использовать «растягивание кнопки» (также называемое «растяжка коробки» или «девять патчей»). По сути, вы создаете изображение, которое состоит из 9 частей:
Чтобы нарисовать эту кнопку любого размера, вы рисуете каждую фигуру (сверху вниз, слева направо):
width - ((1) + (2)).Width
) в верхней части целевого прямоугольника с левым смещением на ширину (1).height - ((1) + (2)).Height
) виде слева от целевого прямоугольника с верхним смещением на высоту (1).Если вы посмотрите на кнопку, то увидите, что не имеет значения, если (2), (5) и (7) масштабировать по горизонтали (потому что это по существу прямая линия); таким же образом (4), (5) и (6) можно масштабировать по вертикали, не влияя на качество изображения.
источник
Вот код для подхода «девять патчей»:
Он вызывается как:
источник
Texture2D _texture = new Texture2D(GraphicsDevice, 1, 1); _texture.SetData(new Color[] { Color.Blue }); SpriteBatch sb = new SpriteBatch(GraphicsDevice); sb.Begin(); //sb.Draw(_texture, new Rectangle(100, 100, 100, 100), Color.White); sb.DrawRoundedRect(_texture, new Rectangle(100, 100, 100, 100), Color.Pink, 16); sb.End();