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

在WP7XNA游戏中,如何在屏幕上创建一个半透明的矩形作为通知消息框?,xna,message,transparent,Xna,Message,Transparent,是否可以创建一个透明的消息框(矩形),可以在其上写入多行文本?在类似Paint.NET(免费)的内容中创建一个纹理,允许您编辑颜色的alpha值 将纹理的一个小区域设置为白色,alpha值类似于255255100(r,g,b,a),下面的图像在红方块内有你需要的东西,尽管它在白色上没有明显的显示 现在,您可以在屏幕上绘制纹理,它将显示您在纹理中设置的alpha值 // Texture2D is a reference to the texture from above. // Rectangl

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

在类似Paint.NET(免费)的内容中创建一个纹理,允许您编辑颜色的alpha值

将纹理的一个小区域设置为白色,alpha值类似于255255100(r,g,b,a),下面的图像在红方块内有你需要的东西,尽管它在白色上没有明显的显示

现在,您可以在屏幕上绘制纹理,它将显示您在纹理中设置的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)
//Texture2D是对上面纹理的引用。
//矩形是要在其中绘制灰色框的屏幕矩形。
//Nullable是红色框中白色数据的位置。
//颜色是您希望灰色方框的颜色(灰色?)
SpriteBatch.Draw(纹理2D、矩形、可空、颜色)

在你想要的文本上方使用一个SpriteFont。

Andy的解决方案就足够了,但可能需要几次尝试,直到你找到你想要的透明度,它还包括在你的程序中创建和加载一个新的资源。幸运的是,您可以避免这种情况,并且可以通过在运行时生成一个透明像素来配置该过程,该像素将延伸到
SpriteBatch.Draw(Texture2D,Rectangle,Nullable,Color)中
Rectangle
参数的边界。
调用:

//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);
我将给出另一个提示,帮助您确定纹理的绘图矩形的大小:

//spits out a vector2 *size* of the multiline text
Vector2 measurements = font.MeasureString(sb); //works with StringBuilder
然后,您可以根据此信息创建一个
矩形
,甚至给它一些填充:

Rectangle rectangle = new Rectangle(window_x, window_y, (int)measurements.X, (int)measurements.Y);
rectangle.Inflate(5); //pad by 5 pixels
然后将所有内容放入draw调用,包括绘制窗口的颜色

SpriteBatch.Draw (texture, rectangle, Color.Black); //draw window first
SpriteBatch.DrawString(font, sb, position, Color.GreenYellow); //draw text second
其结果是外观更美观、自动化程度更高、可配置性更强。您应该能够为通知消息将所有这些内容包装到一个可重用的可配置类中

注意:绘图代码以外的任何内容都应该在LoadContent()或其他地方,而不是实际游戏的Draw()调用中


请原谅我的语法错误,我只是把它写在了我的头上……)

我建议在纹理上使用预定义区域的原因是,您可能已经为您的游戏准备了一个精灵表,即使它仅用于UI,您应该尽可能避免切换纹理,将此区域放置到UI精灵表中,并且没有理由切换。然后,您还可以将sprite工作表替换为新的UI“皮肤”,它甚至可以在不更改代码的情况下控制透明度等内容。
SpriteBatch.Draw (texture, rectangle, Color.Black); //draw window first
SpriteBatch.DrawString(font, sb, position, Color.GreenYellow); //draw text second