Gibt es eine Möglichkeit, abgerundete Ecken auf einem in XNA gerenderten Rechteck durch Grundelemente (Linienstreifen) zu erstellen? Ich möchte meine Benutzeroberfläche etwas ausgefallener gestalten als sie bereits ist, und ich möchte, dass der Code flexibel ist, ohne dass zu viele Texturen beteiligt sind.
10
Antworten:
Sie können Ihr Grundelement rendern und einen Shader erstellen, mit dem diese abgerundeten Ecken erstellt werden können.
Hier ist ein einfacher Pixel-Shader im Pseudocode, der ein abgerundetes Quadrat zeichnen kann:
Ergebnis dieses Pixel-Shaders:
Wenn Sie Shader verwenden, können Sie eine wirklich ausgefallene Benutzeroberfläche erstellen, sogar eine animierte.
Für mich ist das Programm EvalDraw ein großartiger Prototyp für einfache Pixel-Shader
quelle
Eine andere Möglichkeit, dies zu tun, ist die Verwendung eines "Button Stretch" (auch als "Box Stretch" oder "Nine-Patch" bezeichnet). Im Wesentlichen erstellen Sie ein Bild, das aus 9 Teilen besteht:
Um diesen Knopf in einer beliebigen Größe zu zeichnen, zeichnen Sie jedes Stück (von oben nach unten, von links nach rechts):
width - ((1) + (2)).Width
) am oberen Rand des Zielrechtecks, wobei die linke Seite um die Breite von (1) versetzt ist.height - ((1) + (2)).Height
) links vom Zielrechteck skaliert , wobei die Oberseite um die Höhe von (1) versetzt ist.Wenn Sie sich die Schaltfläche ansehen, werden Sie feststellen, dass es keine Rolle spielt, ob (2), (5) und (7) horizontal skaliert werden (da es sich im Wesentlichen um eine gerade Linie handelt). Auf die gleiche Weise können (4), (5) und (6) vertikal skaliert werden, ohne die Bildqualität zu beeinträchtigen.
quelle
Hier ist der Code für den "Neun-Patch" -Ansatz:
Es wird aufgerufen als:
quelle
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();