在WP7 XNA游戏中,如何在屏幕上创建一个半透明矩形作为通知消息框?

时间:2012-05-29 06:26:15

标签: xna message transparent

是否可以创建一个可以在其上书写多行文字的透明消息框(矩形)?

2 个答案:

答案 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),下面的图像具有红色方块内所需的内容,但显然不会显示在白色上。

White Square

现在使用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以获取所需的文本。