是否可以创建一个可以在其上书写多行文字的透明消息框(矩形)?
答案 0 :(得分:9)
Andy的解决方案就足够了,但是在您找到所需的透明度之前可能需要几次尝试,它还涉及在程序中创建和加载新资源。幸运的是,您可以避免这种情况,并且可以通过在运行时生成单个透明像素来使进程可配置,该像素将延伸到Rectangle
调用中SpriteBatch.Draw(Texture2D, Rectangle, Nullable<Rectangle>, Color)
参数的范围:
//You can probably turn this in to a re-useable method
Byte transparency_amount = 100; //0 transparent; 255 opaque
Texture2D texture = new Texture2D(Device,1,1,false,SurfaceFormat.Color);
Color[] c = new Color[1];
c[0] = Color.FromNonPreMultiplied(255,255,255,transparency_amount);
texture.SetData<Color>(c);
现在在绘制调用中使用新的texture
变量。
对于多行文本,有一个SpriteBatch.DrawString()
重载接受StringBuilder参数。你理论上可以理解为:
//configure
StringBuilder sb = new StringBuilder();
sb.AppendLine("First line of text");
sb.AppendLine("Second line of text");
//draw
SpriteBatch.DrawString(font, sb, position, Color.White);
我会给你另一个提示,帮助你确定纹理的绘图矩形的大小:
//spits out a vector2 *size* of the multiline text
Vector2 measurements = font.MeasureString(sb); //works with StringBuilder
然后,您可以根据此信息创建Rectangle
,甚至可以为其添加一些填充:
Rectangle rectangle = new Rectangle(window_x, window_y, (int)measurements.X, (int)measurements.Y);
rectangle.Inflate(5); //pad by 5 pixels
然后将所有内容放入绘图调用中,包括绘制窗口的颜色
SpriteBatch.Draw (texture, rectangle, Color.Black); //draw window first
SpriteBatch.DrawString(font, sb, position, Color.GreenYellow); //draw text second
结果是更好看,更自动化和可配置。您应该能够将所有这些内容包装到可重复使用的可配置类中,以用于通知消息。
注意:绘图代码以外的任何内容都应该在LoadContent()或其他地方,而不是实际游戏的Draw()调用。
请原谅任何语法错误,我只是把它写在我的头顶上.. :)
答案 1 :(得分:2)
使用Paint.NET(免费)创建一个纹理,允许您编辑颜色的alpha值。
将纹理的一个小区域设置为白色,其alpha值类似于255,255,255,100(r,g,b,a),下面的图像具有红色方块内所需的内容,但显然不会显示在白色上。
现在使用SpriteBatch.Draw可以将纹理绘制到屏幕上,它将显示您在纹理中设置的alpha值。
// Texture2D is a reference to the texture from above.
// Rectangle is the screen rectangle you want to draw your grey box at.
// Nullable<Rectangle> is the location of the white data inside the red box.
// Color is the colour that you want your grey box to be (grey?)
SpriteBatch.Draw (Texture2D, Rectangle, Nullable<Rectangle>, Color)
在顶部使用SpriteFont以获取所需的文本。