private void InsertChild(CCNode child, int z) { m_bReorderChildDirty = true; m_pChildren.Add(child); //child.m_nOrderOfArrival = s_globalOrderOfArrival++; child.m_nZOrder = z; }
// addChild helper, faster than insertChild public void AppendChild(CCSprite sprite) { m_bReorderChildDirty = true; sprite.BatchNode = this; sprite.Dirty = true; if (m_pobTextureAtlas.TotalQuads == m_pobTextureAtlas.Capacity) { IncreaseAtlasCapacity(); } m_pobDescendants.Add(sprite); int index = m_pobDescendants.Count - 1; sprite.AtlasIndex = index; m_pobTextureAtlas.InsertQuad(ref sprite.m_sQuad, index); // add children recursively CCRawList <CCNode> children = sprite.Children; if (children != null && children.count > 0) { CCNode[] elements = children.Elements; int count = children.count; for (int i = 0; i < count; i++) { AppendChild((CCSprite)elements[i]); } } }
public void AddTargetWithActionForControlEvent(object target, Action <object, CCControlEvent> action, CCControlEvent controlEvent) { // Create the invocation object var invocation = new CCInvocation(target, action, controlEvent); // Add the invocation into the dispatch list for the given control event CCRawList <CCInvocation> eventInvocationList = DispatchListforControlEvent(controlEvent); eventInvocationList.Add(invocation); }
/** draw a dot at a position, with a given radius and color */ public void DrawDot(CCPoint pos, float radius, CCColor4F color) { var cl = new Color(color.R, color.G, color.B, color.A); var a = new VertexPositionColor(new Vector3(pos.X - radius, pos.Y - radius, 0), cl); //{-1.0, -1.0} var b = new VertexPositionColor(new Vector3(pos.X - radius, pos.Y + radius, 0), cl); //{-1.0, 1.0} var c = new VertexPositionColor(new Vector3(pos.X + radius, pos.Y + radius, 0), cl); //{ 1.0, 1.0} var d = new VertexPositionColor(new Vector3(pos.X + radius, pos.Y - radius, 0), cl); //{ 1.0, -1.0} m_pVertices.Add(a); m_pVertices.Add(b); m_pVertices.Add(c); m_pVertices.Add(a); m_pVertices.Add(c); m_pVertices.Add(d); m_bDirty = true; }
private CCBMFontConfiguration InitializeFont(string fontName, float fontSize, string charset) { if (m_pData == null) { InitializeTTFAtlas(1024, 1024); } if (String.IsNullOrEmpty(charset)) { charset = " "; } var chars = new CCRawList <char>(); var fontKey = GetFontKey(fontName, fontSize); CCBMFontConfiguration fontConfig; if (!s_pConfigurations.TryGetValue(fontKey, out fontConfig)) { fontConfig = new CCBMFontConfiguration(); s_pConfigurations.Add(fontKey, fontConfig); } for (int i = 0; i < charset.Length; i++) { var ch = charset[i]; if (!fontConfig.m_pFontDefDictionary.ContainsKey(ch) && chars.IndexOf(ch) == -1) { chars.Add(ch); } } if (chars.Count == 0) { return(fontConfig); } CreateFont(fontName, fontSize * CCMacros.CCContentScaleFactor(), chars); fontConfig.m_nCommonHeight = (int)Math.Ceiling(GetFontHeight()); int[] data = null; for (int i = 0; i < chars.Count; i++) { var s = chars[i].ToString(); var charSize = GetMeasureString(s); int w = (int)Math.Ceiling(charSize.Width + 2); int h = (int)Math.Ceiling(charSize.Height + 2); if (data == null || data.Length < (w * h)) { data = new int[w * h]; } unsafe { int stride; byte *pBase = GetBitmapData(s, out stride); int minX = w; int maxX = 0; int minY = h; int maxY = 0; for (int y = 0; y < h; y++) { var row = (int *)(pBase + y * stride); for (int x = 0; x < w; x++) { if (row[x] != 0) { minX = Math.Min(minX, x); maxX = Math.Max(maxX, x); minY = Math.Min(minY, y); maxY = Math.Max(maxY, y); } } } w = Math.Max(maxX - minX + 1, 1); h = Math.Max(maxY - minY + 1, 1); //maxX = minX + w; //maxY = minY + h; int index = 0; for (int y = minY; y <= maxY; y++) { var row = (int *)(pBase + y * stride); for (int x = minX; x <= maxX; x++) { data[index] = row[x]; index++; } } var region = AllocateRegion(w, h); if (region.x >= 0) { SetRegionData(region, data, w); var info = GetKerningInfo(chars[i]); var fontDef = new CCBMFontConfiguration.CCBMFontDef() { charID = chars[i], rect = new CCRect(region.x, region.y, region.width, region.height), xOffset = minX, // + (int)Math.Ceiling(info.A), yOffset = minY, xAdvance = (int)Math.Ceiling(info.A + info.B + info.C) }; fontConfig.CharacterSet.Add(chars[i]); fontConfig.m_pFontDefDictionary.Add(chars[i], fontDef); } else { CCLog.Log("Texture atlas is full"); } } } m_bTextureDirty = true; return(fontConfig); }
protected void UpdateLabel() { SetString(m_sInitialString, true); if (m_fWidth > 0) { // Step 1: Make multiline string str_whole = m_sString; int stringLength = m_sString.Length; var multiline_string = new StringBuilder(stringLength); var last_word = new StringBuilder(stringLength); int line = 1, i = 0; bool start_line = false, start_word = false; float startOfLine = -1, startOfWord = -1; int skip = 0; CCRawList <CCNode> children = m_pChildren; for (int j = 0; j < children.count; j++) { CCSprite characterSprite; while ((characterSprite = (CCSprite)GetChildByTag(j + skip)) == null) { skip++; } if (!characterSprite.Visible) { continue; } if (i >= stringLength) { break; } char character = str_whole[i]; if (!start_word) { startOfWord = GetLetterPosXLeft(characterSprite); start_word = true; } if (!start_line) { startOfLine = startOfWord; start_line = true; } // Newline. if (character == '\n') { int len = last_word.Length; while (len > 0 && Char.IsWhiteSpace(last_word[len - 1])) { len--; last_word.Remove(len, 1); } multiline_string.Append(last_word); multiline_string.Append('\n'); #if XBOX || XBOX360 last_word.Length = 0; #else last_word.Clear(); #endif start_word = false; start_line = false; startOfWord = -1; startOfLine = -1; i++; line++; if (i >= stringLength) { break; } character = str_whole[i]; if (startOfWord == 0) { startOfWord = GetLetterPosXLeft(characterSprite); start_word = true; } if (startOfLine == 0) { startOfLine = startOfWord; start_line = true; } } // Whitespace. if (Char.IsWhiteSpace(character)) { last_word.Append(character); multiline_string.Append(last_word); #if XBOX || XBOX360 last_word.Length = 0; #else last_word.Clear(); #endif start_word = false; startOfWord = -1; i++; continue; } // Out of bounds. if (GetLetterPosXRight(characterSprite) - startOfLine > m_fWidth) { if (!m_bLineBreakWithoutSpaces) { last_word.Append(character); int len = multiline_string.Length; while (len > 0 && Char.IsWhiteSpace(multiline_string[len - 1])) { len--; multiline_string.Remove(len, 1); } if (multiline_string.Length > 0) { multiline_string.Append('\n'); } line++; start_line = false; startOfLine = -1; i++; } else { int len = last_word.Length; while (len > 0 && Char.IsWhiteSpace(last_word[len - 1])) { len--; last_word.Remove(len, 1); } multiline_string.Append(last_word); multiline_string.Append('\n'); #if XBOX || XBOX360 last_word.Length = 0; #else last_word.Clear(); #endif start_word = false; start_line = false; startOfWord = -1; startOfLine = -1; line++; if (i >= stringLength) { break; } if (startOfWord == 0) { startOfWord = GetLetterPosXLeft(characterSprite); start_word = true; } if (startOfLine == 0) { startOfLine = startOfWord; start_line = true; } j--; } continue; } else { // Character is normal. last_word.Append(character); i++; continue; } } multiline_string.Append(last_word); m_sString = multiline_string.ToString(); UpdateString(true); } // Step 2: Make alignment if (m_pAlignment != CCTextAlignment.CCTextAlignmentLeft) { int i = 0; int lineNumber = 0; int str_len = m_sString.Length; var last_line = new CCRawList <char>(); for (int ctr = 0; ctr <= str_len; ++ctr) { if (ctr == str_len || m_sString[ctr] == '\n') { float lineWidth = 0.0f; int line_length = last_line.Count; // if last line is empty we must just increase lineNumber and work with next line if (line_length == 0) { lineNumber++; continue; } int index = i + line_length - 1 + lineNumber; if (index < 0) { continue; } var lastChar = (CCSprite)GetChildByTag(index); if (lastChar == null) { continue; } lineWidth = lastChar.Position.X + lastChar.ContentSize.Width / 2.0f; float shift = 0; switch (m_pAlignment) { case CCTextAlignment.CCTextAlignmentCenter: shift = ContentSize.Width / 2.0f - lineWidth / 2.0f; break; case CCTextAlignment.CCTextAlignmentRight: shift = ContentSize.Width - lineWidth; break; default: break; } if (shift != 0) { for (int j = 0; j < line_length; j++) { index = i + j + lineNumber; if (index < 0) { continue; } var characterSprite = (CCSprite)GetChildByTag(index); characterSprite.Position = characterSprite.Position + new CCPoint(shift, 0.0f); } } i += line_length; lineNumber++; last_line.Clear(); continue; } last_line.Add(m_sString[ctr]); } } }