Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA弹出文本对话框_C#_Popup_Xna_Word Wrap - Fatal编程技术网

C# XNA弹出文本对话框

C# XNA弹出文本对话框,c#,popup,xna,word-wrap,C#,Popup,Xna,Word Wrap,嘿,伙计们,我正在做一个游戏,想添加一个屏幕,当用户点击某些对象时会打开。屏幕将被布置为在左边有一个图像,在右上角有一个标题,标题下面有文本 我有一些问题, 1) 如何创建弹出框?(最好是圆边) 2) 如何包装文本(在图片前面,但不是在弹出框之外,我甚至可能需要垂直滚动条) 3) 我如何解释不同的屏幕分辨率(它们是否会产生差异?) 谢谢你的帮助, Max我已经多年没有接触XNA了,但我建议您看看游戏状态示例。现在可能有点过时了,但它将为您管理游戏状态和“弹出窗口”、菜单等提供一个良好的起点。

嘿,伙计们,我正在做一个游戏,想添加一个屏幕,当用户点击某些对象时会打开。屏幕将被布置为在左边有一个图像,在右上角有一个标题,标题下面有文本

我有一些问题, 1) 如何创建弹出框?(最好是圆边) 2) 如何包装文本(在图片前面,但不是在弹出框之外,我甚至可能需要垂直滚动条) 3) 我如何解释不同的屏幕分辨率(它们是否会产生差异?)

谢谢你的帮助,
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();
    }