/// <summary> /// Отобразить действующих лиц диалога /// </summary> /// <param name="arrangements">Какие изменения нужно произвести в расположении лиц</param> /// <param name="actorImages">Какие изображения должны быть у лиц диалога</param> /// <param name="leadingActor">Имя говорящего лица</param> public void ShowActors(CDialogueActorsArrangements arrangements, CDialogueActorImage[] actorImages, string leadingActor) { // Уберём ненужные последствия с предыдущей сцены ClearPrevScene(); // Удалим и добавим актёров PrepareActors(arrangements, out bool mustChangeArrangement); // Учтём главное лицо (обеспечим, чтобы оно точно отобразилось) if (_actorNameToIndex.ContainsKey(leadingActor)) { if (!_shownActorsIndices.Contains(_actorNameToIndex[leadingActor])) { mustChangeArrangement = true; } MakeLeading(leadingActor); } DefineShownIndices(); // Изменим расположение всех актёров с учётом новой информации if (mustChangeArrangement) { MakeArrangements(); } // Меняем изображения SetActorsImages(actorImages); MoveActors(); _prevActorsCount = _allActors.Count; }
// Удаление и добавление лиц private void PrepareActors(CDialogueActorsArrangements arrangements, out bool mustChangeArrangement) { _removedActorsIndices.Clear(); // Сначала определим изменения в расположении лиц mustChangeArrangement = false; int prevMaxActorsOnScreen = _maxActorsOnScreen; _maxActorsOnScreen = arrangements.UseDefaultMaxActorsOnScreen ? DialogueStatementDefaultValues.MaxActorsOnScreen : arrangements.MaxActorsOnScreen; if (prevMaxActorsOnScreen != _maxActorsOnScreen) { mustChangeArrangement = true; } // Рассмотрим все описания аранжировок, добавим и удалим лица при необходимости, определим, нужно ли менять расположение лиц диалога. foreach (var arrangement in arrangements.Arrangements) { switch (arrangement.ArrangementAction) { case TDialogueActorArrangementAction.Appear: AddActor(arrangement.ActorName); mustChangeArrangement = true; break; case TDialogueActorArrangementAction.Leave: DeleteActor(arrangement.ActorName); mustChangeArrangement = true; break; case TDialogueActorArrangementAction.ChangePosition: Assert.IsTrue(_actorNameToIndex.ContainsKey(arrangement.ActorName), "Arrangement with type 'changePosition' is applied to the absent actor"); CActorInfo actorInfo = _allActors[_actorNameToIndex[arrangement.ActorName]]; if (actorInfo.PositionType != arrangement.Position || (arrangement.Position == TDialogueActorArrangementPosition.Custom && arrangement.ExactPosistion != actorInfo.Position)) { mustChangeArrangement = true; } break; default: Assert.IsTrue(false); break; } if (arrangement.ArrangementAction != TDialogueActorArrangementAction.Leave) { CActorInfo actorInfo = _allActors[_actorNameToIndex[arrangement.ActorName]]; actorInfo.PositionType = arrangement.Position; if (arrangement.Position == TDialogueActorArrangementPosition.Custom) { actorInfo.Position = arrangement.ExactPosistion; } actorInfo.UseAutosize = arrangement.UseAutoSize; actorInfo.UseCustomScale = arrangement.UseCustomScale; actorInfo.Scale = arrangement.Scale; actorInfo.Size = arrangement.Size; } } }