/// <summary> /// Charactersノードを解析し、設定値を得る。 /// </summary> /// <param name="node">Charactersノード</param> /// <param name="setting">GeneratorSettingオブジェクト</param> private static void LoadCharactersNode(XmlNode node, GeneratorSetting setting) { for (int i = 0; i < node.ChildNodes.Count; i++) { try { if (node.ChildNodes[i].Name != GeneratorSettingFileDefs.NodeCharacter) { continue; } XmlAttribute attr = node.ChildNodes[i].Attributes[GeneratorSettingFileDefs.CharacterAttrNumber]; if (attr == null) { continue; // number 属性がない。 } int index = Int32.Parse(attr.Value) - 1; if ((index < 0) || (index >= setting.GetCharacterCount())) { continue; } LoadCharacterNode(node.ChildNodes[i], setting.GetCharacter(index)); } catch (Exception) { // 解析の例外は無視する。 } } }
/// <summary> /// GeneratorSettingをXMLドキュメントに変換する。 /// </summary> /// <param name="setting">設定</param> /// <returns>XmlDocumentオブジェクト</returns> /// <remarks> /// シリアライズ使った方が良かったかもしれない。 /// </remarks> private XmlDocument GenerateXmlDocument(GeneratorSetting setting) { // データをXMLモデルで構築する。 XmlDocument doc = new XmlDocument(); XmlElement rootNode = doc.CreateElement(GeneratorSettingFileDefs.NodeCharaChipGen); doc.AppendChild(rootNode); // キャラクター設定ノード XmlElement charactersElem = doc.CreateElement(GeneratorSettingFileDefs.NodeCharacters); rootNode.AppendChild(charactersElem); for (int i = 0; i < setting.GetCharacterCount(); i++) { Character data = setting.GetCharacter(i); AddCharacter(doc, charactersElem, i + 1, data); } // エクスポート設定ノード XmlElement exportConfigElem = doc.CreateElement(GeneratorSettingFileDefs.NodeExportSetting); AddConfigNode(doc, exportConfigElem, setting.ExportSetting); rootNode.AppendChild(exportConfigElem); return(doc); }
/// <summary> /// XMLドキュメントを解析して、GeneratorSettingを取得する。 /// </summary> /// <param name="doc">XmlDocumentオブジェクト</param> /// <returns>GeneratorSettingオブジェクト</returns> private GeneratorSetting ParseXmlDocument(XmlDocument doc) { GeneratorSetting setting = new GeneratorSetting(); // ツリーからXMLで取得する。 foreach (XmlNode rootNode in doc.ChildNodes) { if (rootNode.Name != GeneratorSettingFileDefs.NodeCharaChipGen) { throw new NotSupportedException("Unsupported root node. [" + rootNode.Name + "]"); } foreach (XmlNode node in rootNode.ChildNodes) { switch (node.Name) { case GeneratorSettingFileDefs.NodeCharacters: LoadCharactersNode(node, setting); break; case GeneratorSettingFileDefs.NodeExportSetting: LoadConfigNode(node, setting.ExportSetting); break; } } } return(setting); }
/// <summary> /// settingsに設定をコピーする。 /// </summary> /// <param name="setting">コピー先のオブジェクト</param> public void CopyTo(GeneratorSetting setting) { int copyCount = Math.Min(GetCharacterCount(), setting.GetCharacterCount()); for (int i = 0; i < copyCount; i++) { Character src = GetCharacter(i); Character dst = setting.GetCharacter(i); src.CopyTo(dst); } // エクスポート設定 ExportSetting.CopyTo(setting.ExportSetting); }
/// <summary> /// キャラチップデータをエクスポートする /// </summary> public static void ExportCharaChip(GeneratorSetting setting) { if (string.IsNullOrEmpty(setting.ExportSetting.ExportFilePath)) { throw new ArgumentException("ExportFilePath not specified."); } Size charaChipSize = setting.ExportSetting.CharaChipSize; int charaPlaneWidth = charaChipSize.Width * 3; int charaPlaneHeight = charaChipSize.Height * 4; int exportImageWidth = charaPlaneWidth * setting.HorizontalCount; int exportImageHeight = charaPlaneHeight * setting.VerticalCount; ImageBuffer exportBuffer = ImageBuffer.Create(exportImageWidth, exportImageHeight); for (int charaY = 0; charaY < setting.VerticalCount; charaY++) { for (int charaX = 0; charaX < setting.HorizontalCount; charaX++) { int index = charaY * setting.HorizontalCount + charaX; if (index >= setting.GetCharacterCount()) { continue; } try { Character character = setting.GetCharacter(index); // キャラクターをレンダリングする。 ImageBuffer charaChipImage = RenderCharaChip(setting.GetCharacter(charaY * 4 + charaX), charaChipSize); // レンダリングした画像をエクスポートバッファにコピーする。 exportBuffer.WriteImage(charaChipImage, charaX * charaPlaneWidth, charaY * charaPlaneHeight); } catch (Exception e) { throw new Exception($"Character{(index + 1)}:{e.Message}"); } } } Image image = null; image = exportBuffer.GetImage(); image.Save(setting.ExportSetting.ExportFilePath); }
/// <summary> /// 設定を書き出す。 /// </summary> /// <param name="stream">出力ストリーム</param> /// <param name="setting">設定</param> public void Write(System.IO.Stream stream, GeneratorSetting setting) { XmlDocument doc = GenerateXmlDocument(setting); doc.Save(stream); }
/// <summary> /// 設定をwriterに書き出す。 /// </summary> /// <param name="writer">テキストライター</param> /// <param name="setting">設定</param> public void Write(System.IO.TextWriter writer, GeneratorSetting setting) { XmlDocument doc = GenerateXmlDocument(setting); doc.Save(writer); }
/// <summary> /// 設定を書き出す。 /// </summary> /// <param name="path">書き出すファイルパス</param> /// <param name="setting">設定</param> public void Write(string path, GeneratorSetting setting) { XmlDocument doc = GenerateXmlDocument(setting); doc.Save(path); }