Пример #1
0
        /// <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;
        }
Пример #2
0
        // Удаление и добавление лиц
        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;
                }
            }
        }