void Align() { int nLineGap = 0; // 先让Y轴居中吧 float fOffsetY = m_fLineOffsetY + m_fCurLineHeight * 0.5f; for (int i = m_nStartLineIndex; i < m_nTitleNumb; ++i) { HUDTilteLine title = m_TitleLine[i]; HudTitleAttribute titleAttrib = HudSetting.Instance.TitleSets[(int)title.m_nType].GetTitle(title.m_nColorIndex); if (titleAttrib.AlignType == HUDAlignType.align_right) { OffsetXY(title.m_nStart, title.m_nEnd, m_fCurLineWidth * 0.5f + titleAttrib.CharGap, fOffsetY); } else if (titleAttrib.AlignType == HUDAlignType.align_left) { OffsetXY(title.m_nStart, title.m_nEnd, -m_fCurLineWidth * 0.5f - title.m_fWidth - titleAttrib.CharGap, fOffsetY); } else { OffsetXY(title.m_nStart, title.m_nEnd, title.m_fWidth * -0.5f, fOffsetY); } if (nLineGap < titleAttrib.LineGap) { nLineGap = titleAttrib.LineGap; } } m_fLineOffsetY += m_fCurLineHeight + nLineGap; m_nStartLineIndex = m_nTitleNumb; }
void RebuildCharUV(ref CharacterInfo tempCharInfo) { if (m_aSprite.size == 0) { return; } UIFont uiFont = GetHUDTitleFont(); int nStart = 0, nEnd = 0; for (int i = 0; i < m_nTitleNumb; ++i) { HUDTilteLine title = m_TitleLine[i]; if (string.IsNullOrEmpty(title.m_szValidText)) { continue; } uiFont.PrepareQueryText(title.m_szValidText); nEnd = title.m_nEnd; nStart = title.m_nStart; for (; nStart < nEnd; ++nStart) { HUDVertex v = m_aSprite[nStart]; if (0 == v.AtlasID) { uiFont.GetCharacterInfo(v.ch, ref tempCharInfo); v.RebuildCharUV(tempCharInfo); if (v.hudMesh != null) { v.hudMesh.VertexDirty(); } } } } }
public void HideMeridianNumber() { if (m_nMeridianIndex > 0 && m_nMeridianIndex != m_nTitleNumb - 1) { return; } HUDTilteLine title = m_TitleLine[m_nMeridianIndex]; if (title.m_nType != HUDTilteType.HeadIcon) { return; } int nStart = title.m_nStart; int nEnd = title.m_nEnd; for (--nEnd; nEnd >= nStart && nEnd < m_aSprite.size; --nEnd) { HUDVertex v = m_aSprite[nEnd]; if (v.hudMesh != null) { v.hudMesh.EraseHUDVertex(v); } v.hudMesh = null; m_aSprite.RemoveAt(nEnd); HUDVertex.ReleaseVertex(v); } m_nMeridianIndex = 0; --m_nTitleNumb; --m_nLines; }
// 功能:显示头顶充脉数字 void PushMeridianNumber(int nNumb) { if (m_nTitleNumb <= 0) { return; } if (m_nMeridianIndex != m_nTitleNumb - 1) { m_nMeridianIndex = m_nTitleNumb; // 添加 if (m_TitleLine[m_nTitleNumb] == null) { m_TitleLine[m_nTitleNumb] = new HUDTilteLine(); } m_TitleLine[m_nTitleNumb].m_nType = HUDTilteType.HeadIcon; m_TitleLine[m_nTitleNumb].m_fWidth = 0; m_TitleLine[m_nTitleNumb].m_nHeight = 0; m_TitleLine[m_nTitleNumb].m_nStart = m_aSprite.size; m_TitleLine[m_nTitleNumb].m_nEnd = m_aSprite.size; m_TitleLine[m_nTitleNumb].m_szText = string.Empty; m_TitleLine[m_nTitleNumb].m_nColorIndex = 0; m_TitleLine[m_nTitleNumb].m_nLine = m_nLines; m_TitleLine[m_nTitleNumb].m_nSpriteID = 0; ++m_nTitleNumb; } UpdateMeridianNumber(nNumb); m_nStartLineIndex = m_nMeridianIndex; }
protected void RebuildForEditor() { Transform tf = m_tf; Vector3 vPos = m_vPos; Vector2 vScreenPos = m_vScreenPos; HUDBloodType nBloodType = m_nBloodType; float fPos = HudSetting.Instance.m_fTestBloodPos; HUDTilteLine[] titles = new HUDTilteLine[m_nTitleNumb]; int nNumb = m_nTitleNumb; for (int i = 0; i < m_nTitleNumb; ++i) { titles[i] = new HUDTilteLine(); titles[i].m_szText = m_TitleLine[i].m_szText; titles[i].m_nType = m_TitleLine[i].m_nType; titles[i].m_nColorIndex = m_TitleLine[i].m_nColorIndex; titles[i].m_nLine = m_TitleLine[i].m_nLine; titles[i].m_nSpriteID = m_TitleLine[i].m_nSpriteID; } Clear(); m_tf = tf; m_vPos = vPos; m_vScreenPos = vScreenPos; m_nBloodType = nBloodType; int nOldLine = -1; bool bStartLine = false; for (int i = 0; i < nNumb; ++i) { HUDTilteLine title = titles[i]; if (nOldLine != title.m_nLine) { if (bStartLine) { EndTitle(); } bStartLine = true; BeginTitle(); } if (title.m_nType == HUDTilteType.Blood) { PushBlood(m_nBloodType, fPos); } else if (title.m_nSpriteID != 0) { PushIcon(title.m_nType, title.m_nSpriteID); } else { PushTitle(title.m_szText, title.m_nType, title.m_nColorIndex); } nOldLine = title.m_nLine; } if (bStartLine) { EndTitle(); } }
// 功能:设置血条 // 参数:nType - 血条的类型 // fBloodPos - 血条的进度(百分比) public void PushBlood(HUDBloodType nType, float fBloodPos) { if (m_nTitleNumb >= m_TitleLine.Length) { return; } int nStart = m_aSprite.size; // 添加背景 int nBkWidth = HudSetting.Instance.m_nBloodBkWidth; int nBkHeight = HudSetting.Instance.m_nBloodBkHeight; int nBloodWidth = HudSetting.Instance.m_nBloodWidth; int nHeight = HudSetting.Instance.m_nBloodHeight; m_nBloodSpriteID = 0; if (nType == HUDBloodType.Blood_Green) { m_nBloodSpriteID = HudSetting.Instance.m_nBloodGreen; } else if (nType == HUDBloodType.Blood_Red) { m_nBloodSpriteID = HudSetting.Instance.m_nBloodRed; } else if (nType == HUDBloodType.Blood_Blue) { m_nBloodSpriteID = HudSetting.Instance.m_nBloodBlue; } PushSprite(HudSetting.Instance.m_nBloodBk, nBkWidth, nBkHeight, (nBloodWidth - nBkWidth) * 0.5f, 0);// (nBkHeight - nHeight) * 0.5f); PushSliceTitle(m_nBloodSpriteID, nBloodWidth, nHeight, 0.0f, 0.0f, fBloodPos); if (m_TitleLine[m_nTitleNumb] == null) { m_TitleLine[m_nTitleNumb] = new HUDTilteLine(); } m_TitleLine[m_nTitleNumb].m_nType = HUDTilteType.Blood; m_TitleLine[m_nTitleNumb].m_fWidth = nBloodWidth; m_TitleLine[m_nTitleNumb].m_nHeight = nHeight; m_TitleLine[m_nTitleNumb].m_nStart = nStart; m_TitleLine[m_nTitleNumb].m_nEnd = m_aSprite.size; m_TitleLine[m_nTitleNumb].m_szText = string.Empty; m_TitleLine[m_nTitleNumb].m_nSpriteID = 0; m_nBloodType = nType; m_nBloodIndex = m_nTitleNumb; m_fCurLineWidth = nBloodWidth; m_fCurLineHeight = nHeight; ++m_nTitleNumb; }
public void PushIcon(HUDTilteType titleType, int nSpriteID) { HudTitleAttribute titleAttrib = HudSetting.Instance.TitleSets[(int)titleType].GetTitle(0); UISpriteInfo sp = CAtlasMng.instance.GetSafeSpriteByID(nSpriteID); int nWidth = 0; int nHeight = 0; int nStart = m_aSprite.size; if (sp != null) { nWidth = (int)sp.outer.width; nHeight = (int)sp.outer.height; PushSprite(nSpriteID, nWidth, nHeight, 0.0f, titleAttrib.SpriteOffsetY); } if (m_TitleLine[m_nTitleNumb] == null) { m_TitleLine[m_nTitleNumb] = new HUDTilteLine(); } m_TitleLine[m_nTitleNumb].m_nType = titleType; m_TitleLine[m_nTitleNumb].m_fWidth = nWidth; m_TitleLine[m_nTitleNumb].m_nHeight = nHeight; m_TitleLine[m_nTitleNumb].m_nStart = nStart; m_TitleLine[m_nTitleNumb].m_nEnd = m_aSprite.size; m_TitleLine[m_nTitleNumb].m_szText = string.Empty; m_TitleLine[m_nTitleNumb].m_nColorIndex = 0; m_TitleLine[m_nTitleNumb].m_nLine = m_nLines; m_TitleLine[m_nTitleNumb].m_nSpriteID = nSpriteID; if (titleAttrib.AlignType == HUDAlignType.align_center) { m_fCurLineWidth = nWidth; } nHeight += titleAttrib.SpriteReduceHeight; if (nHeight < titleAttrib.LockMaxHeight && titleAttrib.LockMaxHeight > 0) { nHeight = titleAttrib.LockMaxHeight; } if (m_fCurLineHeight < nHeight) { m_fCurLineHeight = nHeight; } ++m_nTitleNumb; }
void UpdateMeridianNumber(int nMeridianNumb) { // 必须是在最后 if (0 == m_nMeridianIndex || m_nMeridianIndex != m_nTitleNumb - 1) { return; } // 先释放旧的吧 HUDTilteLine title = m_TitleLine[m_nMeridianIndex]; if (title.m_nType != HUDTilteType.HeadIcon) { return; } if (nMeridianNumb < 0) { nMeridianNumb = 0; } m_nMeridianNumb = nMeridianNumb; HudTitleAttribute titleAttrib = HudSetting.Instance.TitleSets[(int)HUDTilteType.HeadIcon].GetTitle(0); int nCharGap = titleAttrib.CharGap; int nPow = 1; while (nPow * 10 <= nMeridianNumb) { nPow *= 10; } int nWidth = 0; int nHeight = 0; int nMaxWidth = 0; int nMaxHeight = 0; int[] PicID = HudSetting.Instance.MeridianPic; int nSpriteID = 0; int nValue = nMeridianNumb; int nStart = title.m_nStart; int nEnd = title.m_nEnd; int nX = 0; while (nPow > 0) { int nIndex = nValue / nPow; nValue %= nPow; nPow /= 10; nSpriteID = PicID[nIndex]; UISpriteInfo sp = CAtlasMng.instance.GetSafeSpriteByID(nSpriteID); nWidth = (int)sp.outer.width; nHeight = (int)sp.outer.height; nMaxWidth += nWidth + nCharGap; if (nMaxHeight < nHeight) { nMaxHeight = nHeight; } HUDVertex v = null; if (nStart < m_aSprite.size) { v = m_aSprite[nStart]; if (v.AtlasID != sp.m_nAtlasID) { if (v.hudMesh != null) { v.hudMesh.EraseHUDVertex(v); } v.hudMesh = null; v.AtlasID = sp.m_nAtlasID; } v.SpriteID = nSpriteID; v.Offset.Set(nX, titleAttrib.SpriteOffsetY); v.InitSprite(nWidth, nHeight); } else { v = PushSprite(nSpriteID, nWidth, nHeight, nX, titleAttrib.SpriteOffsetY); } v.Scale = m_fScale; if (v.hudMesh == null) { if (m_bInitHUDMesh) { v.hudMesh = m_pBatcher.m_MeshRender.QueryMesh(sp.m_nAtlasID); v.hudMesh.PushHUDVertex(v); } } else { v.hudMesh.VertexDirty(); } nX = nMaxWidth; ++nStart; } title.m_nEnd = nStart; // 删除多余的 for (--nEnd; nEnd >= nStart; --nEnd) { HUDVertex v = m_aSprite[nEnd]; if (v.hudMesh != null) { v.hudMesh.EraseHUDVertex(v); } v.hudMesh = null; m_aSprite.RemoveAt(nEnd); HUDVertex.ReleaseVertex(v); } nMaxWidth -= nCharGap; title.m_fWidth = nMaxWidth; title.m_nHeight = nMaxHeight; nMaxHeight += titleAttrib.SpriteReduceHeight; m_fCurLineWidth = nMaxWidth; m_fCurLineHeight = nMaxHeight; }
// 必须先有居中的 public void PushTitle(string szText, HUDTilteType titleType, int nColorIndex) { if (m_nTitleNumb >= m_TitleLine.Length) { return; } UIFont mFont = GetHUDTitleFont(); CharacterInfo tempCharInfo = new CharacterInfo(); HudTitleAttribute titleAttrib = HudSetting.Instance.TitleSets[(int)titleType].GetTitle(nColorIndex); int nLineGap = titleAttrib.LineGap; int nCharGap = titleAttrib.CharGap; HUDTextParse hudParse = HUDTextParse.Instance; hudParse.ParseText(szText); mFont.PrepareQueryText(hudParse.m_szText); HudTitleAttribute.Effect nStyle = titleAttrib.Style; int nSpriteCount = hudParse.m_SpriteCount; HUDCharInfo[] Sprites = hudParse.m_Sprites; char ch; float fShadowX = titleAttrib.OffsetX; float fShadowY = titleAttrib.OffsetY; float fx = 0.0f; Color32 clrLeftUp = titleAttrib.clrLeftUp; Color32 clrLeftDown = titleAttrib.clrLeftDown; Color32 clrRightUp = titleAttrib.clrRightUp; Color32 clrRightDown = titleAttrib.clrRightDown; Color32 clrShadow = titleAttrib.clrShadow; Color32 clrCustom; int nStart = m_aSprite.size; int nHeight = mFont.GetFontHeight(); int nFontH = titleAttrib.Height; int nFontOffsetY = titleAttrib.FontOffsetY; int nY = 0; for (int i = 0; i < nSpriteCount; ++i) { if (Sprites[i].bChar) { ch = Sprites[i].ch; mFont.GetCharacterInfo(ch, ref tempCharInfo); nY = (tempCharInfo.glyphHeight - nFontH) / 2 + nFontOffsetY; if (nStyle != HudTitleAttribute.Effect.None) { PushShadow(ref tempCharInfo, ch, fx, nY, clrShadow, fShadowX, fShadowY); if (nStyle == HudTitleAttribute.Effect.Outline) { PushShadow(ref tempCharInfo, ch, fx, nY, clrShadow, fShadowX, -fShadowY); PushShadow(ref tempCharInfo, ch, fx, nY, clrShadow, -fShadowX, fShadowY); PushShadow(ref tempCharInfo, ch, fx, nY, clrShadow, -fShadowX, -fShadowY); } } if (Sprites[i].bCustomColor) { clrCustom = Sprites[i].CustomColor; HUDVertex node = PushChar(ref tempCharInfo, ch, fx, nY, clrCustom, clrCustom, clrCustom, clrCustom); fx += node.width + nCharGap; } else { HUDVertex node = PushChar(ref tempCharInfo, ch, fx, nY, clrLeftUp, clrLeftDown, clrRightUp, clrRightDown); fx += node.width + nCharGap; } } else { // 图片 if (Sprites[i].CharType == UIFontUnitType.UnitType_Icon) { HUDVertex node = PushSprite(Sprites[i].SpriteID, Sprites[i].SpriteWidth, Sprites[i].SpriteHeight, fx, titleAttrib.SpriteOffsetY); fx += node.width + nCharGap; if (nHeight < node.height - titleAttrib.SpriteReduceHeight) { nHeight = node.height - titleAttrib.SpriteReduceHeight; } } } } if (m_TitleLine[m_nTitleNumb] == null) { m_TitleLine[m_nTitleNumb] = new HUDTilteLine(); } m_TitleLine[m_nTitleNumb].m_nType = titleType; m_TitleLine[m_nTitleNumb].m_fWidth = fx - nCharGap; m_TitleLine[m_nTitleNumb].m_nHeight = nHeight; m_TitleLine[m_nTitleNumb].m_nStart = nStart; m_TitleLine[m_nTitleNumb].m_nEnd = m_aSprite.size; m_TitleLine[m_nTitleNumb].m_szText = szText; m_TitleLine[m_nTitleNumb].m_szValidText = hudParse.m_szText; m_TitleLine[m_nTitleNumb].m_nColorIndex = nColorIndex; m_TitleLine[m_nTitleNumb].m_nLine = m_nLines; m_TitleLine[m_nTitleNumb].m_nSpriteID = 0; if (titleAttrib.AlignType == HUDAlignType.align_center) { m_fCurLineWidth = fx - nCharGap; } if (nHeight < titleAttrib.LockMaxHeight && titleAttrib.LockMaxHeight > 0) { nHeight = titleAttrib.LockMaxHeight; } if (m_fCurLineHeight < nHeight) { m_fCurLineHeight = nHeight; } ++m_nTitleNumb; }