public void AddVertex(ref CCVector2 vertex, CCColor4B color, PrimitiveType primitiveType) { if (!hasBegun) { throw new InvalidOperationException("Begin must be called before AddVertex can be called."); } if (primitiveType == PrimitiveType.LineStrip || primitiveType == PrimitiveType.TriangleStrip) { throw new NotSupportedException("The specified primitiveType is not supported by PrimitiveBatch."); } if (primitiveType == PrimitiveType.TriangleList) { if (triangleVertsCount >= triangleVertices.Length) { FlushTriangles(); } triangleVertices[triangleVertsCount].Position = new Vector3(vertex.ToVector2(), -0.1f); triangleVertices[triangleVertsCount].Color = color.ToColor(); triangleVertsCount++; } if (primitiveType == PrimitiveType.LineList) { if (lineVertsCount >= lineVertices.Length) { FlushLines(); } lineVertices[lineVertsCount].Position = new Vector3(vertex.ToVector2(), 0f); lineVertices[lineVertsCount].Color = color.ToColor(); lineVertsCount++; } }
void InitWithString(string text, CCSize dimensions, CCTextAlignment hAlignment, CCVerticalTextAlignment vAlignment, string fontName, float fontSize) { try { Debug.Assert(dimensions.Width >= 0 || dimensions.Height >= 0); if (string.IsNullOrEmpty(text)) { return; } float loadedSize = fontSize; SpriteFont font = CCSpriteFontCache.SharedInstance.TryLoadFont(fontName, fontSize, out loadedSize); if (font == null) { CCLog.Log("Failed to load default font. No font supported."); return; } float scale = 1f; if (loadedSize != 0) { scale = fontSize / loadedSize * CCSpriteFontCache.FontScale; } if (dimensions.Equals(CCSize.Zero)) { CCVector2 temp = font.MeasureString(text).ToCCVector2(); dimensions.Width = temp.X * scale; dimensions.Height = temp.Y * scale; } var textList = new List <String>(); var nextText = new StringBuilder(); string[] lineList = text.Split('\n'); float spaceWidth = font.MeasureString(" ").X *scale; for (int j = 0; j < lineList.Length; ++j) { string[] wordList = lineList[j].Split(' '); float lineWidth = 0; bool firstWord = true; for (int i = 0; i < wordList.Length; ++i) { float wordWidth = font.MeasureString(wordList[i]).X *scale; if ((lineWidth + wordWidth) > dimensions.Width) { lineWidth = wordWidth; if (nextText.Length > 0) { firstWord = true; textList.Add(nextText.ToString()); nextText.Length = 0; } else { lineWidth += wordWidth; firstWord = false; textList.Add(wordList[i]); continue; } } else { lineWidth += wordWidth; } if (!firstWord) { nextText.Append(' '); lineWidth += spaceWidth; } nextText.Append(wordList[i]); firstWord = false; } textList.Add(nextText.ToString()); nextText.Clear(); } if (dimensions.Height == 0) { dimensions.Height = textList.Count * font.LineSpacing * scale; } //* for render to texture RenderTarget2D renderTarget = CCDrawManager.SharedDrawManager.CreateRenderTarget( (int)dimensions.Width, (int)dimensions.Height, DefaultAlphaPixelFormat, CCRenderTargetUsage.DiscardContents ); CCDrawManager.SharedDrawManager.CurrentRenderTarget = renderTarget; CCDrawManager.SharedDrawManager.Clear(CCColor4B.Transparent); SpriteBatch sb = CCDrawManager.SharedDrawManager.SpriteBatch; sb.Begin(); float textHeight = textList.Count * font.LineSpacing * scale; float nextY = 0; if (vAlignment == CCVerticalTextAlignment.Bottom) { nextY = dimensions.Height - textHeight; } else if (vAlignment == CCVerticalTextAlignment.Center) { nextY = (dimensions.Height - textHeight) / 2.0f; } for (int j = 0; j < textList.Count; ++j) { string line = textList[j]; var position = new CCVector2(0, nextY); if (hAlignment == CCTextAlignment.Right) { position.X = dimensions.Width - font.MeasureString(line).X *scale; } else if (hAlignment == CCTextAlignment.Center) { position.X = (dimensions.Width - font.MeasureString(line).X *scale) / 2.0f; } sb.DrawString(font, line, position.ToVector2(), Color.White, 0f, Vector2.Zero, scale, SpriteEffects.None, 0); nextY += font.LineSpacing * scale; } sb.End(); CCDrawManager.SharedDrawManager.XnaGraphicsDevice.RasterizerState = RasterizerState.CullNone; CCDrawManager.SharedDrawManager.DepthStencilState = DepthStencilState.Default; CCDrawManager.SharedDrawManager.CurrentRenderTarget = (RenderTarget2D)null; InitWithTexture(renderTarget, (CCSurfaceFormat)renderTarget.Format, true, false); cacheInfo.CacheType = CCTextureCacheType.String; cacheInfo.Data = new CCStringCache() { Dimensions = dimensions, Text = text, FontName = fontName, FontSize = fontSize, HAlignment = hAlignment, VAlignment = vAlignment }; } catch (Exception ex) { CCLog.Log(ex.ToString()); } }