C# XNA弹出文本对话框
嘿,伙计们,我正在做一个游戏,想添加一个屏幕,当用户点击某些对象时会打开。屏幕将被布置为在左边有一个图像,在右上角有一个标题,标题下面有文本 我有一些问题, 1) 如何创建弹出框?(最好是圆边) 2) 如何包装文本(在图片前面,但不是在弹出框之外,我甚至可能需要垂直滚动条) 3) 我如何解释不同的屏幕分辨率(它们是否会产生差异?) 谢谢你的帮助,C# XNA弹出文本对话框,c#,popup,xna,word-wrap,C#,Popup,Xna,Word Wrap,嘿,伙计们,我正在做一个游戏,想添加一个屏幕,当用户点击某些对象时会打开。屏幕将被布置为在左边有一个图像,在右上角有一个标题,标题下面有文本 我有一些问题, 1) 如何创建弹出框?(最好是圆边) 2) 如何包装文本(在图片前面,但不是在弹出框之外,我甚至可能需要垂直滚动条) 3) 我如何解释不同的屏幕分辨率(它们是否会产生差异?) 谢谢你的帮助, Max我已经多年没有接触XNA了,但我建议您看看游戏状态示例。现在可能有点过时了,但它将为您管理游戏状态和“弹出窗口”、菜单等提供一个良好的起点。
Max我已经多年没有接触XNA了,但我建议您看看游戏状态示例。现在可能有点过时了,但它将为您管理游戏状态和“弹出窗口”、菜单等提供一个良好的起点。
您只需查看sprite batch对象,该对象在游戏状态管理示例中处理ui通过制作您希望弹出窗口外观的图像并按您的要求设置样式,可以最好地处理圆角等 假设你做了一个盒子,300px乘以300px 然后从那里你会想包装你的文字内,并可能有它滚动或无论如何你想处理它检查文本的高度和宽度,找到在哪里包装的文字 例如,您可以创建一个这样的函数,它将根据一些度量值获取全文并将其包装
private string WrapText(string text)
{
string[] words = text.Split(' ');
StringBuilder sb = new StringBuilder();
float linewidth = 0f;
float maxLine = 250f; //a bit smaller than the box so you can have some padding...etc
float spaceWidth = spriteFont.MeasureString(" ").X;
foreach (string word in words)
{
Vector2 size = spriteFont.MeasureString(word);
if (linewidth + size.X < 250)
{
sb.Append(word + " ");
linewidth += size.X + spaceWidth;
}
else
{
sb.Append("\n" + word + " ");
linewidth = size.X + spaceWidth;
}
}
return sb.ToString();
}
希望这至少能将您推向正确的方向。对于任何人来说,这是我编写的完整代码,代码有点鸡爪,但它确实起到了作用 请注意,我将FillText加载器放在主函数中,如果您使用此代码,您应该将其移到外部(这样它就不会被重复调用)
public void DisplayPopup (string Title, string Text, string AssetPicturePath, SpriteBatch batch)
{
FillText = new Texture2D(game.GraphicsDevice, 1, 1);
FillText.SetData(new Color[] { Color.White });
//Draw rectangle, center screen,
Rectangle MainBox;
MainBox.Width = 700;
MainBox.Height = 400;
MainBox.X = game.Window.ClientBounds.Width / 2 - MainBox.Width / 2;
MainBox.Y = game.Window.ClientBounds.Height / 2 - MainBox.Height / 2;
//Draw Title
Rectangle TitleBox;
TitleBox.Width = 650;
TitleBox.Height = (int)ArialFont.MeasureString(Title).Y;
Padding = MainBox.Width / 2 - TitleBox.Width / 2;
TitleBox.X = (int)Padding + MainBox.X;
TitleBox.Y = (int)Padding + MainBox.Y;
//Draw Line Between Title and TextBox
Rectangle TextSeperator;
TextSeperator.Width = MainBox.Width - (int)Padding * 2;
TextSeperator.Height = 1;
TextSeperator.X = MainBox.X + (int)Padding;
TextSeperator.Y = TitleBox.Y + (int)(Padding * 1.2);
//Draw PictureBox
Rectangle PictureBox;
if (AssetPicturePath != string.Empty)
PictureBox.Width = 200;
else
PictureBox.Width = 0;
PictureBox.Height = 250;
PictureBox.X = MainBox.X + (int)Padding;
PictureBox.Y = MainBox.Y + TitleBox.Height + (int)Padding * 2;
MainBox.Height = PictureBox.Y - MainBox.Y + PictureBox.Height + (int)Padding;
//Draw TextBody
Rectangle TextBody;
if (AssetPicturePath == string.Empty)
TextBody.Width = MainBox.Width - ((int)Padding * 2);
else
TextBody.Width = MainBox.Width - ((int)Padding * 3) - PictureBox.Width;
TextBody.Height = MainBox.Height - ((int)Padding * 3) - TitleBox.Height;
if (AssetPicturePath == string.Empty)
TextBody.X = PictureBox.X;
else
TextBody.X = PictureBox.X + PictureBox.Width + (int)Padding;
TextBody.Y = TitleBox.Y + TitleBox.Height + (int)Padding;
//Draw MainBox
batch.Draw(FillText, MainBox, Color.Wheat);
//Draw PictureBox
//batch.Draw(FillText, PictureBox, Color.Green);
if (AssetPicturePath != string.Empty)
batch.Draw(game.Content.Load<Texture2D>(AssetPath + AssetPicturePath.TrimStart(new char[] { '/' })), PictureBox, Color.White);
//Draw TitleBox
//batch.Draw(FillText, TitleBox, Color.BlueViolet);
batch.DrawString(ArialFont, Title, new Vector2(TitleBox.X, TitleBox.Y),Color.Blue);
//Draw Line Between Title And TextBody
batch.Draw(FillText, TextSeperator, Color.Gray);
//Draw TextBody
//batch.Draw(FillText, TextBody, Color.Indigo);
int LineNumber = 0;
foreach (string Line in WrapText(Text, TextBody.Width))
{
batch.DrawString(ArialFont, Line, new Vector2(TextBody.X, TextBody.Y + (LineNumber * ArialFont.MeasureString(Line).Y)), Color.Black);
LineNumber++;
}
}
private object[] WrapText(string text, float Length)
{
string[] words = text.Split(' ');
ArrayList Lines = new ArrayList();
float linewidth = 0f;
float spaceWidth = ArialFont.MeasureString(" ").X;
int CurLine = 0;
Lines.Add(string.Empty);
foreach (string word in words)
{
Vector2 size = ArialFont.MeasureString(word);
if (linewidth + size.X < Length)
{
Lines[CurLine] += word + " ";
linewidth += size.X + spaceWidth;
}
else
{
Lines.Add(word + " ");
linewidth = size.X + spaceWidth;
CurLine++;
}
}
return Lines.ToArray();
}
public void display弹出窗口(字符串标题、字符串文本、字符串AssetPicturePath、SpriteBatch批处理)
{
FillText=新纹理2D(game.GraphicsDevice,1,1);
FillText.SetData(新颜色[]{Color.White});
//绘制矩形,中心屏幕,
矩形主盒;
主机箱。宽度=700;
主机箱高度=400;
MainBox.X=game.Window.ClientBounds.Width/2-MainBox.Width/2;
MainBox.Y=game.Window.ClientBounds.Height/2-MainBox.Height/2;
//抽签标题
矩形标题盒;
标题栏宽度=650;
TitleBox.Height=(int)ArialFont.MeasureString(Title.Y);
填充=主框宽度/2-标题框宽度/2;
TitleBox.X=(int)Padding+MainBox.X;
TitleBox.Y=(int)Padding+MainBox.Y;
//在标题和文本框之间画一条线
矩形文本分离器;
text separator.Width=MainBox.Width-(int)Padding*2;
文本分隔符。高度=1;
textsepider.X=MainBox.X+(int)填充;
text separator.Y=标题框.Y+(int)(填充*1.2);
//画框
矩形图文盒;
if(AssetPicturePath!=string.Empty)
图片框。宽度=200;
其他的
PictureBox.Width=0;
图片框。高度=250;
PictureBox.X=MainBox.X+(int)填充;
PictureBox.Y=MainBox.Y+标题框高度+(int)填充*2;
MainBox.Height=PictureBox.Y-MainBox.Y+PictureBox.Height+(int)填充;
//绘制文本体
矩形文本体;
if(AssetPicturePath==string.Empty)
TextBody.Width=MainBox.Width-((int)Padding*2);
其他的
TextBody.Width=MainBox.Width-((int)Padding*3)-PictureBox.Width;
TextBody.Height=MainBox.Height-((int)Padding*3)-TitleBox.Height;
if(AssetPicturePath==string.Empty)
TextBody.X=PictureBox.X;
其他的
TextBody.X=PictureBox.X+PictureBox.Width+(int)填充;
TextBody.Y=TitleBox.Y+TitleBox.Height+(int)填充;
//牵引主机箱
绘制(填充文本、主框、颜色、小麦);
//画框
//batch.Draw(填充文本、图片框、颜色.绿色);
if(AssetPicturePath!=string.Empty)
batch.Draw(game.Content.Load(AssetPath+AssetPicturePath.TrimStart(新字符[]{'/'})),PictureBox,Color.White);
//绘制标题框
//绘制(填充文本、标题框、颜色、蓝紫色);
batch.DrawString(阿里亚尔字体,标题,新矢量2(TitleBox.X,TitleBox.Y),颜色.蓝色);
//在标题和正文之间画一条线
绘制(填充文本、文本分隔符、颜色、灰色);
//绘制文本体
//batch.Draw(FillText、TextBody、Color.Indigo);
int LineNumber=0;
foreach(WrapText(Text,TextBody.Width)中的字符串行)
{
batch.DrawString(ArialFont,Line,新矢量2(TextBody.X,TextBody.Y+(行号*ArialFont.MeasureString(Line.Y)),颜色.黑色);
LineNumber++;
}
}
私有对象[]WrapText(字符串文本,浮点长度)
{
string[]words=text.Split(“”);
ArrayList行=新的ArrayList();
浮动线宽=0f;
float spaceWidth=ArialFont.MeasureString(“”.X);
int CurLine=0;
line.Add(string.Empty);
foreach(单词中的字符串)
{
Vector2大小=ArialFont.MeasureString(字);
if(线宽+尺寸.X<长度)
{
行[CurLine]+=word+“”;
线宽+=大小。X+空格宽度;
}
其他的
{
行。添加(word+“”);
线宽=大小.X+空格宽度;
CurLine++;
}
}
返回行。ToArray();
}
这对我的游戏来说有点太强大了,我只需要一个作为游戏一部分的弹出窗口。。示例:单击一所房子,弹出窗口会显示房子的图片、标题中的所有者以及房子的概要。@mazzzz-XNA是相当低级的,它是
public void DisplayPopup (string Title, string Text, string AssetPicturePath, SpriteBatch batch)
{
FillText = new Texture2D(game.GraphicsDevice, 1, 1);
FillText.SetData(new Color[] { Color.White });
//Draw rectangle, center screen,
Rectangle MainBox;
MainBox.Width = 700;
MainBox.Height = 400;
MainBox.X = game.Window.ClientBounds.Width / 2 - MainBox.Width / 2;
MainBox.Y = game.Window.ClientBounds.Height / 2 - MainBox.Height / 2;
//Draw Title
Rectangle TitleBox;
TitleBox.Width = 650;
TitleBox.Height = (int)ArialFont.MeasureString(Title).Y;
Padding = MainBox.Width / 2 - TitleBox.Width / 2;
TitleBox.X = (int)Padding + MainBox.X;
TitleBox.Y = (int)Padding + MainBox.Y;
//Draw Line Between Title and TextBox
Rectangle TextSeperator;
TextSeperator.Width = MainBox.Width - (int)Padding * 2;
TextSeperator.Height = 1;
TextSeperator.X = MainBox.X + (int)Padding;
TextSeperator.Y = TitleBox.Y + (int)(Padding * 1.2);
//Draw PictureBox
Rectangle PictureBox;
if (AssetPicturePath != string.Empty)
PictureBox.Width = 200;
else
PictureBox.Width = 0;
PictureBox.Height = 250;
PictureBox.X = MainBox.X + (int)Padding;
PictureBox.Y = MainBox.Y + TitleBox.Height + (int)Padding * 2;
MainBox.Height = PictureBox.Y - MainBox.Y + PictureBox.Height + (int)Padding;
//Draw TextBody
Rectangle TextBody;
if (AssetPicturePath == string.Empty)
TextBody.Width = MainBox.Width - ((int)Padding * 2);
else
TextBody.Width = MainBox.Width - ((int)Padding * 3) - PictureBox.Width;
TextBody.Height = MainBox.Height - ((int)Padding * 3) - TitleBox.Height;
if (AssetPicturePath == string.Empty)
TextBody.X = PictureBox.X;
else
TextBody.X = PictureBox.X + PictureBox.Width + (int)Padding;
TextBody.Y = TitleBox.Y + TitleBox.Height + (int)Padding;
//Draw MainBox
batch.Draw(FillText, MainBox, Color.Wheat);
//Draw PictureBox
//batch.Draw(FillText, PictureBox, Color.Green);
if (AssetPicturePath != string.Empty)
batch.Draw(game.Content.Load<Texture2D>(AssetPath + AssetPicturePath.TrimStart(new char[] { '/' })), PictureBox, Color.White);
//Draw TitleBox
//batch.Draw(FillText, TitleBox, Color.BlueViolet);
batch.DrawString(ArialFont, Title, new Vector2(TitleBox.X, TitleBox.Y),Color.Blue);
//Draw Line Between Title And TextBody
batch.Draw(FillText, TextSeperator, Color.Gray);
//Draw TextBody
//batch.Draw(FillText, TextBody, Color.Indigo);
int LineNumber = 0;
foreach (string Line in WrapText(Text, TextBody.Width))
{
batch.DrawString(ArialFont, Line, new Vector2(TextBody.X, TextBody.Y + (LineNumber * ArialFont.MeasureString(Line).Y)), Color.Black);
LineNumber++;
}
}
private object[] WrapText(string text, float Length)
{
string[] words = text.Split(' ');
ArrayList Lines = new ArrayList();
float linewidth = 0f;
float spaceWidth = ArialFont.MeasureString(" ").X;
int CurLine = 0;
Lines.Add(string.Empty);
foreach (string word in words)
{
Vector2 size = ArialFont.MeasureString(word);
if (linewidth + size.X < Length)
{
Lines[CurLine] += word + " ";
linewidth += size.X + spaceWidth;
}
else
{
Lines.Add(word + " ");
linewidth = size.X + spaceWidth;
CurLine++;
}
}
return Lines.ToArray();
}