tModLoader 类似打字机的文本出现

1.前提准备

​ 要绘制文字,首先得寻找一个绘制的地方,我这里使用PlayerDrawLayer,还得定义要绘制的文字,我这里使用要被显示的全部文本,你猜怎么着

​ 首先创建一个继承PlayerDrawLayer的类,并定义一个string存放文本,PlayerDrawLayer是有要求实现两个方法。

GetDefaultPosition,实现就行,他决定绘制的图层

Draw确切的要绘制的地方

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class ModPlayerLayer : PlayerDrawLayer
{
 	private string drawString = "要被显示的全部文本,你猜怎么着";   
	public override Position GetDefaultPosition() //决定绘制的图层
	{
		return new BeforeParent(PlayerDrawLayers.HandOnAcc);
	}
    
    protected override void Draw(ref PlayerDrawSet drawInfo)
    {
        
    }
    
}

2.开始绘制

​ 准备好类之后就可以开始绘制了,主要代码都写在Draw方法里面,为了让文本是一会出一个,我们可以使用一个定时器,这个定时器决定什么情况下让显示的文本字符+1,或者直接使用这个定时器决定要显示的文本长度

1
2
3
4
5
6
7
private int timer = 0;
protected override void Draw(ref PlayerDrawSet drawInfo)
{
	timer++;
    int length = drawString.Length; //文本的长度
    var viewCount = timer / 10 % (length + 1); //要被绘制的字符数量
}

​ 在决定好要绘制字符数量后,我们就可以对字符串进行截取了并绘制了,使用string.Substring可以对字符串进行截取。绘制有一个参数是位置,它是基于屏幕坐标的,决定了绘制的位置,这里使用玩家中心。

1
2
string draw = drawString.Substring(0, viewCount);//真实要绘制的字符
var DrawPos = drawInfo.drawPlayer.Center - Main.screenPosition; //世界坐标 - 屏幕坐标 = 此世界坐标在屏幕的位置

​ 可以使用Utils中的方法进行文本的绘制,绘制大型文字可以使用DrawBorderStringBig,普通文本可以使用DrawBorderString

1
Utils.DrawBorderStringBig(Main.spriteBatch, draw, DrawPos, Color.Red);

​ 如果想让文本居中,可以使用一些计算,达到类似的效果。下面是全部代码(或许可以使用yield ?)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
private int timer = 0;
private bool IsViewShu = true;
private string drawString = "要被显示的全部文本,你猜怎么着";
protected override void Draw(ref PlayerDrawSet drawInfo)
{
    timer++;
    int length = drawString.Length;                                                 //文本长度
    var DrawPos = drawInfo.drawPlayer.Center - Main.screenPosition;
    var viewCount = timer / 10 % (length + 1);                                   //显示数量
    string draw = drawString.Substring(0, viewCount);                      //真实显示的文本
    DrawPos += new Vector2(-viewCount * (50 - viewCount), -100f);                 //绘制位置调整 需要微调 / 计算

    #region 最后的 | 符号
    if (IsViewShu) draw += "I";
    if (timer % 30 == 0) IsViewShu = false;
    if (timer % 60 == 0) IsViewShu = true;
    #endregion
    Utils.DrawBorderStringBig(Main.spriteBatch, draw, DrawPos, Color.Red, 1.5f);
}
使用 Hugo 构建
主题 StackJimmy 设计