/// <summary> /// 読み込み処理 /// </summary> /// <param name="clXmlNode">xmlノード</param> public void Load(XmlNode clXmlNode) { XmlNodeList clListNode = clXmlNode.ChildNodes; string clTypeOption = ClsTool.GetStringFromXmlNodeList(clListNode, "TypeOption"); this.mTypeOption = (EnmTypeOption)Enum.Parse(typeof(EnmTypeOption), clTypeOption); //以下、各管理クラス作成処理 foreach (XmlNode clNode in clListNode) { if (!"KeyFrame".Equals(clNode.Name)) { continue; } bool isEnable1 = false; bool isEnable2 = false; object clValue1 = ClsParam.GetDefaultValue1(this.mTypeOption); object clValue2 = ClsParam.GetDefaultValue2(this.mTypeOption); ClsDatKeyFrame clDatKeyFrame = new ClsDatKeyFrame(this.mTypeOption, 0, isEnable1, isEnable2, null, null, clValue1, clValue2); clDatKeyFrame.Load(clNode); this.mDicKeyFrame[clDatKeyFrame.mFrameNo] = clDatKeyFrame; continue; } }
/// <summary> /// オプションの全てを削除する処理 /// </summary> public void RemoveAll() { //以下、キーフレーム全削除処理 foreach (int inKey in this.mDicKeyFrame.Keys) { ClsDatKeyFrame clDatKeyFrame = this.mDicKeyFrame[inKey]; clDatKeyFrame.RemoveAll(); } this.mDicKeyFrame.Clear(); }
/// <summary> /// キーフレーム取得処理 /// </summary> /// <param name="inFrameNo">フレーム番号</param> /// <returns>キーフレーム</returns> public ClsDatKeyFrame GetKeyFrame(int inFrameNo) { bool isExist = this.mDicKeyFrame.ContainsKey(inFrameNo); if (!isExist) { return(null); } ClsDatKeyFrame clKeyFrame = this.mDicKeyFrame[inFrameNo]; return(clKeyFrame); }
private Dictionary <int, ClsDatKeyFrame> mDicKeyFrame; //キーはフレーム番号 値はキーフレーム管理クラス /// <summary> /// コンストラクタ /// </summary> /// <param name="clElemParent">親エレメント</param> /// <param name="enType">オプションタイプ</param> /// <param name="isEnable1">有効フラグ1</param> /// <param name="isEnable2">有効フラグ2</param> /// <param name="clTween1">トゥイーン1</param> /// <param name="clTween2">トゥイーン2</param> /// <param name="clValue1">初期状態の値1</param> /// <param name="clValue2">初期状態の値2</param> public ClsDatOption(ClsDatElem clElemParent, EnmTypeOption enTypeOption, bool isEnable1, bool isEnable2, ClsDatTween clTween1, ClsDatTween clTween2, object clValue1, object clValue2) { this.mTypeItem = TYPE_ITEM.OPTION; this.mElemParent = clElemParent; this.mTypeOption = enTypeOption; this.mDicKeyFrame = new Dictionary <int, ClsDatKeyFrame>(); //以下、0フレーム目にキーフレームを登録する処理(0フレーム目には必ずキーフレームが存在する) ClsDatKeyFrame clKeyFrame = new ClsDatKeyFrame(enTypeOption, 0, isEnable1, isEnable2, clTween1, clTween2, clValue1, clValue2); this.mDicKeyFrame.Add(0, clKeyFrame); }
/// <summary> /// 保存処理 /// </summary> /// <param name="clHeader">ヘッダー</param> public void Save(string clHeader) { //以下、オプション保存処理 ClsTool.AppendElementStart(clHeader, "Option"); ClsTool.AppendElement(clHeader + ClsSystem.FILE_TAG, "TypeOption", this.mTypeOption.ToString()); //以下、キーフレーム保存処理 foreach (int inKey in this.mDicKeyFrame.Keys) { ClsDatKeyFrame clDatKeyFrame = this.mDicKeyFrame[inKey]; clDatKeyFrame.Save(clHeader + ClsSystem.FILE_TAG); } ClsTool.AppendElementEnd(clHeader, "Option"); }
/// <summary> /// 選択中のキーフレームを取得する処理 /// </summary> /// <returns>選択中のキーフレーム</returns> private static ClsDatKeyFrame GetKeyFrameFromSelectFrame() { ClsDatItem clItem = ClsSystem.GetItemFromSelectLineNo(); if (clItem == null) { return(null); } //以下、エレメント設定 ClsDatElem clElem = null; ClsDatOption clOption = null; if (clItem.mTypeItem == ClsDatItem.TYPE_ITEM.ELEM) { clElem = clItem as ClsDatElem; clOption = clElem.mDicOption[EnmTypeOption.DISPLAY]; } else if (clItem.mTypeItem == ClsDatItem.TYPE_ITEM.OPTION) { clOption = clItem as ClsDatOption; clElem = clOption.mElemParent; } if (clOption == null) { return(null); } int inIndex = ClsSystem.GetSelectFrameNo(); if (inIndex != 0) { bool isExist = clOption.IsExistKeyFrame(inIndex); if (!isExist) { return(null); } } //以下、キーフレーム取得処理 ClsDatKeyFrame clKeyFrame = clOption.GetKeyFrame(inIndex); return(clKeyFrame); }
/// <summary> /// キーフレーム削除処理 /// </summary> /// <param name="inFrameNo">フレーム番号</param> public void RemoveKeyFrame(int inFrameNo) { if (inFrameNo == 0) { return; //0フレーム目のキーフレームは消せない } bool isExist = this.IsExistKeyFrame(inFrameNo); if (!isExist) { return; } ClsDatKeyFrame clDatKeyFrame = this.mDicKeyFrame[inFrameNo]; clDatKeyFrame.RemoveAll(); this.mDicKeyFrame.Remove(inFrameNo); }
/// <summary> /// キーフレーム登録・更新処理 /// </summary> /// <param name="inFrameNo">フレーム番号</param> /// <param name="isEnable1">有効フラグ1</param> /// <param name="isEnable2">有効フラグ2</param> /// <param name="clTween1">トゥイーン1</param> /// <param name="clTween2">トゥイーン2</param> /// <param name="clValue1">値1</param> /// <param name="clValue2">値2</param> public void SetKeyFrame(int inFrameNo, bool isEnable1, bool isEnable2, ClsDatTween clTween1, ClsDatTween clTween2, object clValue1, object clValue2) { bool isExist = this.mDicKeyFrame.ContainsKey(inFrameNo); if (isExist) { ClsDatKeyFrame clKeyFrame = this.mDicKeyFrame[inFrameNo]; clKeyFrame.mEnable1 = isEnable1; clKeyFrame.mEnable2 = isEnable2; clKeyFrame.mValue1 = clValue1; clKeyFrame.mValue2 = clValue2; clKeyFrame.mTween1 = clTween1; clKeyFrame.mTween2 = clTween2; } else { this.mDicKeyFrame[inFrameNo] = new ClsDatKeyFrame(this.mTypeOption, inFrameNo, isEnable1, isEnable2, clTween1, clTween2, clValue1, clValue2); } }
private void ToolStripMenuItem_AddKeyFrame_Click(object sender, EventArgs e) { int inIndex = (int)this.numericUpDown_NowFlame.Value; if (inIndex <= 0) { return; //0フレーム目には作成できない } ClsDatMotion clMotion = ClsSystem.GetSelectMotion(); if (clMotion == null) { return; } ClsDatOption clOption = ClsSystem.GetOptionFromSelectLineNo(); if (clOption == null) { return; } //以下、キーフレーム作成・更新処理 ClsDatElem clElem = clOption.mElemParent; bool isParentFlag = ClsParam.GetDefaultParentFlag(clElem.mElem, clOption.mTypeOption); //以下、現在の値を取得する処理 object clValue1 = clOption.GetValue1(inIndex); object clValue2 = clOption.GetValue2(inIndex); ClsDatKeyFrame clKeyFrame = new ClsDatKeyFrame(clOption.mTypeOption, inIndex, false, false, null, null, clValue1, clValue2); clOption.SetKeyFrame(inIndex, false, false, null, null, clValue1, clValue2); //存在していたら更新、存在していなかったら追加 //以下、コントロール更新処理 this.RefreshControl(); this.panel_Control.Refresh(); this.panel_Time.Refresh(); this.mFormMain.Refresh(); }
/// <summary> /// 重みを返す処理 /// </summary> /// <param name="clDatTween">トゥイーン情報</param> /// <param name="puchRate">重みリスト</param> /// <param name="inFrmCurrent">カレントフレーム</param> /// <returns>重み(0.0~1.0)</returns> public static float GetRate(ClsDatKeyFrame clDatKeyFrame, ClsDatTween clDatTween, byte[] puchRate, int inFrmCurrent) { if (clDatTween == null) { return(0.0f); } if (clDatTween.mRate == null) { return(0.0f); } if (!(clDatKeyFrame.mFrameNo <= inFrmCurrent && inFrmCurrent <= clDatKeyFrame.mFrameNo + clDatTween.mLength)) { return(0.0f); } float flFrmLength = clDatTween.mLength; inFrmCurrent -= clDatKeyFrame.mFrameNo; byte uchRate = (byte)((float)inFrmCurrent / flFrmLength * ClsDatTween.MAX_WEIGHT); float flRate = (float)uchRate / byte.MaxValue; return(flRate); }
/// <summary> /// エレメントのタイムライン描画処理 /// </summary> /// <param name="g">描画管理クラス</param> /// <param name="inSelectLineNo">選択中のライン番号</param> /// <param name="inSelectFrameNo">選択中のフレーム</param> /// <param name="inMaxFrameNum">最大フレーム数</param> /// <param name="inWidth">描画先の幅</param> /// <param name="inHeight">描画先の高さ</param> public void DrawTime(Graphics g, int inSelectLineNo, int inSelectFrameNo, int inMaxFrameNum, int inWidth, int inHeight) { //以下、表示しなくてはいけない種別かどうかチェックする処理 bool isDraw = ClsDatOption.IsDraw(this.mTypeOption); if (!isDraw) { return; } //以下、背景を塗る処理 SolidBrush clBrush; int inX = inSelectFrameNo * FormControl.CELL_WIDTH; int inY = this.mLineNo * FormControl.CELL_HEIGHT; if (inSelectLineNo == this.mLineNo) { //選択中Elementsの背景強調 clBrush = new SolidBrush(Color.DarkGreen); g.FillRectangle(clBrush, 0, inY, inWidth, FormControl.CELL_HEIGHT); } else { if (this.mLineNo % 2 == 0) { clBrush = new SolidBrush(Color.Black); g.FillRectangle(clBrush, 0, inY, inWidth, FormControl.CELL_HEIGHT); } else { clBrush = new SolidBrush(Color.FromArgb(0xFF, 20, 20, 30)); g.FillRectangle(clBrush, 0, inY, inWidth, FormControl.CELL_HEIGHT); } } //以下、フレームの背景(Tweenの影響下にあるかどうか)を表示する処理 Color stColorTween = Color.FromArgb(128, Color.LightBlue); SolidBrush clBrushTween = new SolidBrush(stColorTween); bool isFlag = false; int inFrameNo = 0; for (inFrameNo = 0; inFrameNo < inMaxFrameNum; inFrameNo++) { //以下、キーフレームが存在するかチェックする処理 if (inFrameNo == 0) { isFlag = true; } else { bool isExist = this.IsExistKeyFrame(inFrameNo); if (isExist) { ClsDatKeyFrame clKeyFrame = this.GetKeyFrame(inFrameNo); isFlag = (clKeyFrame.mTween1 != null || clKeyFrame.mTween2 != null); } } if (!isFlag) { continue; } inX = inFrameNo * FormControl.CELL_WIDTH; inY = this.mLineNo * FormControl.CELL_HEIGHT; g.FillRectangle(clBrushTween, inX, inY + 10, FormControl.CELL_WIDTH, FormControl.CELL_HEIGHT / 2 - 4); } //以下、選択中のフレーム描画処理 inX = inSelectFrameNo * FormControl.CELL_WIDTH; inY = this.mLineNo * FormControl.CELL_HEIGHT; if (inSelectLineNo == this.mLineNo) { Color stColor = Color.FromArgb(128, Color.Green); clBrush = new SolidBrush(stColor); } else { Color stColor = Color.FromArgb(128, Color.DarkGreen); clBrush = new SolidBrush(stColor); } g.FillRectangle(clBrush, inX, inY, FormControl.CELL_WIDTH, FormControl.CELL_HEIGHT); //以下、境界線描画処理 Pen clPen = new Pen(Color.Green); inY = this.mLineNo * FormControl.CELL_HEIGHT + FormControl.CELL_HEIGHT - 1; g.DrawLine(clPen, 0, inY, inWidth, inY); //以下、キーフレーム表示処理 for (inFrameNo = 0; inFrameNo < inMaxFrameNum; inFrameNo++) { bool isExist = this.mDicKeyFrame.ContainsKey(inFrameNo); if (!isExist) { continue; } g.DrawImage(Properties.Resources.markRed, inFrameNo * FormControl.CELL_WIDTH + 2, this.mLineNo * FormControl.CELL_HEIGHT + 1); } }
/// <summary> /// 指定フレームの値2を取得する処理 /// </summary> /// <param name="inFrameNo">フレームNo</param> /// <returns>値2</returns> public object GetValue2(int inFrameNo) { ClsDatMotion clMotion = ClsSystem.GetSelectMotion(); if (clMotion == null) { goto RETURN_DEFAULT2; } int inMaxFrameNum = clMotion.GetMaxFrameNum(); int inFrameNoBefore = 0; int inFrameNoAfter = 0; this.GetKeyFrameNo(inFrameNo, inMaxFrameNum, out inFrameNoBefore, out inFrameNoAfter); //以下、キーフレーム存在チェック bool isExist = this.mDicKeyFrame.ContainsKey(inFrameNoBefore); if (!isExist) { goto RETURN_DEFAULT2; } isExist = this.mDicKeyFrame.ContainsKey(inFrameNoAfter); if (!isExist) { goto RETURN_DEFAULT2; } //以下、キーフレーム取得処理 ClsDatKeyFrame clKeyFrameBefore = this.mDicKeyFrame[inFrameNoBefore]; if (clKeyFrameBefore == null) { goto RETURN_DEFAULT2; } if (clKeyFrameBefore.mTween2 == null) { object clValueTmp = clKeyFrameBefore.mValue2; return(clValueTmp); } ClsDatKeyFrame clKeyFrameAfter = this.mDicKeyFrame[inFrameNoAfter]; if (clKeyFrameAfter == null) { goto RETURN_DEFAULT2; } //以下、キーフレームの値取得処理 object clValueBefore = clKeyFrameBefore.mValue2; if (clValueBefore == null) { goto RETURN_DEFAULT2; } if (clValueBefore is bool && clValueBefore is string) { return(clValueBefore); } object clValueAfter = clKeyFrameAfter.mValue2; if (clValueAfter == null) { goto RETURN_DEFAULT2; } if (clValueAfter is bool && clValueAfter is string) { goto RETURN_DEFAULT2; } //以下、現在フレームの値(トゥイーン込みの)計算処理 if (clValueBefore is int && clValueAfter is int) { //Tweenを見て値を分割する処理 } else if (clValueBefore is float && clValueAfter is float) { //Tweenを見て値を分割する処理 } RETURN_DEFAULT2: object clValue = ClsParam.GetDefaultValue2(this.mTypeOption); return(clValue); }
/// <summary> /// 指定フレームの値1を取得する処理 /// </summary> /// <param name="inFrameNo">フレームNo</param> /// <returns>値1</returns> public object GetValue1(int inFrameNo) { ClsDatMotion clMotion = ClsSystem.GetSelectMotion(); if (clMotion == null) { goto RETURN_DEFAULT1; } int inMaxFrameNum = clMotion.GetMaxFrameNum(); int inFrameNoBefore = 0; int inFrameNoAfter = 0; this.GetKeyFrameNo(inFrameNo, inMaxFrameNum, out inFrameNoBefore, out inFrameNoAfter); ClsDatKeyFrame clKeyFrameBefore = this.mDicKeyFrame[inFrameNoBefore]; if (clKeyFrameBefore == null) { goto RETURN_DEFAULT1; } if (clKeyFrameBefore.mTween1 == null) { object clValueTmp = clKeyFrameBefore.mValue1; return(clValueTmp); } bool isExist = this.mDicKeyFrame.ContainsKey(inFrameNoAfter); if (!isExist) { goto RETURN_DEFAULT1; } ClsDatKeyFrame clKeyFrameAfter = this.mDicKeyFrame[inFrameNoAfter]; if (clKeyFrameAfter == null) { goto RETURN_DEFAULT1; } object clValueBefore = clKeyFrameBefore.mValue1; if (clValueBefore == null) { goto RETURN_DEFAULT1; } if (clValueBefore is bool && clValueBefore is string) { return(clValueBefore); } object clValueAfter = clKeyFrameAfter.mValue1; if (clValueAfter == null) { goto RETURN_DEFAULT1; } if (clValueAfter is bool && clValueAfter is string) { goto RETURN_DEFAULT1; } //以下、現在フレームの値(トゥイーン込みの)計算処理 if (clValueBefore is int && clValueAfter is int) { //Tweenを見て値を分割する処理 //clKeyFrameBefore.mTween1.GetRate //←中でその場で256の重みリストを作成してない? //もしそうなら、そのリストをメンバ内に保持するようにする } else if (clValueBefore is float && clValueAfter is float) { //Tweenを見て値を分割する処理 //clKeyFrameBefore.mTween1.GetRate //←中でその場で256の重みリストを作成してない? //もしそうなら、そのリストをメンバ内に保持するようにする } RETURN_DEFAULT1: object clValue = ClsParam.GetDefaultValue1(this.mTypeOption); return(clValue); }