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);
}
|