/// <summary> /// モーション移動対象パーツを1モーションステップ分 進める /// </summary> /// <returns>true=もう一度自己Invalidateでモーション継続が必要</returns> private bool move1step() { var dels = new List <PartsBase>(); var nDone = 0; var ret = false; lock (_tarPos) { foreach (var kv in _tarPos) { var part = kv.Key; var tar = kv.Value; if (part.Rect.LT.Equals(tar.Pos)) { dels.Add(part); tar.StepN = 0; } else { tar.StepN--; if (tar.StepN == 0) { part.Rect = CodeRect.FromLTWH(tar.Pos.X, tar.Pos.Y, part.Rect.Width, part.Rect.Height); dels.Add(part); } else { float dx = tar.Pos.X - part.Rect.LT.X; float dy = tar.Pos.Y - part.Rect.LT.Y; var div = (float)tar.StepN * 2; dx /= div; dy /= div; part.Rect += CodePos.FromInt((int)dx, (int)dy); } nDone++; } } } if (nDone > 0) { ret = true; } foreach (var del in dels) { _tarPos.Remove(del); } _isMoving |= _tarPos.Count > 0 ? Moving.Parts : Moving.None; return(ret); }
/// <summary> /// インスタンスを初期化する /// </summary> /// <param name="with">基準位置とパーツの種類の元情報</param> /// <param name="pane">基準位置のスクロールとズーム値を記憶するためのインプット</param> public void Initialize(PartsCollectionBase with) { Clear(); _lastDevelpType = DevelopType.Unknown; foreach (PartsCollectionBase.PartsEntry pe in with) { var p = new Pos3 { OrgPane = RichPaneBinder.CreateCopyComplete(pe.Pane), NowPane = pe.Pane, Org = (CodeRect)pe.Parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Pre = (CodeRect)pe.Parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Now = (CodeRect)pe.Parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Offset = CodePos.FromInt(0, 0) }; base[pe.Parts] = p; } }