Example #1
0
        /// <summary>
        /// Обновить данные для рендеринга
        /// </summary>
        public override void UpdateRenderingData()
        {
            if (_modelProviderComponent != null)
            {
                if (_modelProviderComponent.GameReady)
                {
                    //всегда есть задний фон, шары, очки и счетчик жизней
                    if (_currentRenderingBg == null)
                    {
                        _currentRenderingBg =
                            new RenderingData.RenderingData(
                                new RenderingSprite(ActualSubassetsDataLibrary.GetSprite(NORMAL_GAMEFIELD_BG_SPRITE), 0,
                                                    0,
                                                    0,
                                                    Color.White, 5));
                    }

                    if (_ballsRenderingData == null)
                    {
                        _ballsRenderingData = new LinkedList <RenderingData.RenderingData?>();
                    }

                    _ballsRenderingData.Clear();

                    foreach (var modelBall in _modelProviderComponent.BallsInGame)
                    {
                        BallGraphicsBind graphicsBind = GameFieldViewConsts.BallGraphicsBinds[modelBall.BallType];
                        _ballsRenderingData.AddLast(new RenderingData.RenderingData(new RenderingSprite(
                                                                                        ActualSubassetsDataLibrary.GetSprite(graphicsBind.StillSpriteKey),
                                                                                        GameFieldViewConsts.FIELD_MODEL_RENDER_LEFT_TOP_OFFSET_X + modelBall.Center.X,
                                                                                        GameFieldViewConsts.FIELD_MODEL_RENDER_LEFT_TOP_OFFSET_Y +
                                                                                        (GameFieldViewConsts.FIELD_HEIGHT - modelBall.Center.Y),
                                                                                        0, graphicsBind.BlendColor, 1, 1, 1, EHorizontalAlign.Middle, EVerticalAlign.Middle)));
                    }

                    if (_playerScoreAndLifeCounter == null)
                    {
                        _playerScoreAndLifeCounter = new LinkedList <RenderingData.RenderingData?>();
                    }

                    _playerScoreAndLifeCounter.Clear();

                    //очки
                    _playerScoreAndLifeCounter.AddLast(new RenderingData.RenderingData(new RenderingString(1,
                                                                                                           SCORE_RIGHT_X_OFFSET,
                                                                                                           SCORE_TOP_Y_OFFSET, _modelProviderComponent.ActualPlayer.Score.ToString(),
                                                                                                           ActualSubassetsDataLibrary.GetFont(ViewBehaviourConsts.RED_SHADOW_APP_FONT), Color.White, 1, 1,
                                                                                                           EHorizontalAlign.Right, EVerticalAlign.Top)));

                    //счетчик жизней
                    int line1Lifes = 0;
                    int line2Lifes = 0;

                    int actualPlayerLifesNumber = _modelProviderComponent.ActualPlayer.LifeCount / 2 +
                                                  _modelProviderComponent.ActualPlayer.LifeCount % 2;
                    bool isLastLifeHalfed = _modelProviderComponent.ActualPlayer.LifeCount % 2 == 1;

                    if (actualPlayerLifesNumber > 2 * LIFES_ON_ONE_LINE)
                    {
                        line1Lifes = LIFES_ON_ONE_LINE;
                        line2Lifes = LIFES_ON_ONE_LINE;
                    }
                    else
                    {
                        if (actualPlayerLifesNumber >= LIFES_ON_ONE_LINE)
                        {
                            line1Lifes = LIFES_ON_ONE_LINE;
                            line2Lifes = actualPlayerLifesNumber - LIFES_ON_ONE_LINE;
                        }
                        else
                        {
                            line1Lifes = actualPlayerLifesNumber;
                            line2Lifes = 0;
                        }
                    }

                    int currentY = LIFECOUNTER_LINE1_START_MIDDLE_Y;
                    int currentX = LIFECOUNTER_LINE1_START_MIDDLE_X;
                    for (int i = 0; i < line1Lifes; i++)
                    {
                        string chosenSpriteKey = LIFE_INDICATOR;

                        if (i == line1Lifes - 1)
                        {
                            if (line2Lifes == 0)
                            {
                                if (isLastLifeHalfed)
                                {
                                    chosenSpriteKey = LIFE_INDICATOR_HALF;
                                }
                            }
                        }


                        _playerScoreAndLifeCounter.AddLast(new RenderingData.RenderingData(new RenderingSprite(
                                                                                               ActualSubassetsDataLibrary.GetSprite(chosenSpriteKey), currentX, currentY, 0, Color.White,
                                                                                               0,
                                                                                               1, 1,
                                                                                               EHorizontalAlign.Middle, EVerticalAlign.Middle)));
                        currentX += LIFECOUNTER_X_ELEM_OFFSET;
                    }


                    currentY += LIFECOUNTER_Y_ELEM_OFFSET;
                    currentX  = LIFECOUNTER_LINE1_START_MIDDLE_X;
                    for (int i = 0; i < line2Lifes; i++)
                    {
                        string chosenSpriteKey = LIFE_INDICATOR;

                        if (i == line2Lifes - 1)
                        {
                            if (isLastLifeHalfed)
                            {
                                chosenSpriteKey = LIFE_INDICATOR_HALF;
                            }
                        }

                        _playerScoreAndLifeCounter.AddLast(new RenderingData.RenderingData(new RenderingSprite(
                                                                                               ActualSubassetsDataLibrary.GetSprite(chosenSpriteKey), currentX, currentY, 0, Color.White,
                                                                                               0,
                                                                                               1, 1,
                                                                                               EHorizontalAlign.Middle, EVerticalAlign.Middle)));
                        currentX += LIFECOUNTER_X_ELEM_OFFSET;
                    }

                    //дальнейший рендеринг зависит от текущего состояния игры
                    if (_playerCueRenderingData == null)
                    {
                        _playerCueRenderingData = new LinkedList <RenderingData.RenderingData?>();
                    }

                    _playerCueRenderingData.Clear();

                    if (_modelProviderComponent.CurrentGameState == EPocketGameState.Aiming)
                    {
                        _upperShotChoosePanelOverlay = null;

                        //прицел
                        SpVector3 whiteBallPosOrigin = _modelProviderComponent.PlayerWhiteBall.Center;
                        whiteBallPosOrigin.X += GameFieldViewConsts.FIELD_MODEL_RENDER_LEFT_TOP_OFFSET_X;
                        whiteBallPosOrigin.Y  = GameFieldViewConsts.FIELD_MODEL_RENDER_LEFT_TOP_OFFSET_Y +
                                                (GameFieldViewConsts.FIELD_HEIGHT - whiteBallPosOrigin.Y);


                        double additionalRotOffset = 0;
                        if (_modelProviderComponent.PlayerCurrentAimingAngle > 10 &&
                            _modelProviderComponent.PlayerCurrentAimingAngle < 80)
                        {
                            additionalRotOffset = ANGLE_ADJUST_TOLERANCE;
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle <= 10 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle > 0)
                        {
                            additionalRotOffset =
                                CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 0, 10, 0,
                                                                ANGLE_ADJUST_TOLERANCE);
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle >= 80 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle < 90)
                        {
                            additionalRotOffset =
                                CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 80, 90,
                                                                ANGLE_ADJUST_TOLERANCE,
                                                                0);
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle > 100 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle < 170)
                        {
                            additionalRotOffset = -ANGLE_ADJUST_TOLERANCE;
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle > 90 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle <= 100)
                        {
                            additionalRotOffset = -
                                                  CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 90, 100, 0,
                                                                                  ANGLE_ADJUST_TOLERANCE);
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle >= 170 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle < 180)
                        {
                            additionalRotOffset = -
                                                  CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 170, 180,
                                                                                  ANGLE_ADJUST_TOLERANCE,
                                                                                  0);
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle > 190 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle < 260)
                        {
                            additionalRotOffset = ANGLE_ADJUST_TOLERANCE;
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle > 180 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle <= 190)
                        {
                            additionalRotOffset =
                                CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 180, 190, 0,
                                                                ANGLE_ADJUST_TOLERANCE);
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle >= 260 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle < 270)
                        {
                            additionalRotOffset =
                                CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 260, 270,
                                                                ANGLE_ADJUST_TOLERANCE,
                                                                0);
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle > 280 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle < 350)
                        {
                            additionalRotOffset = -ANGLE_ADJUST_TOLERANCE;
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle > 270 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle <= 280)
                        {
                            additionalRotOffset = -
                                                  CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 270, 280, 0,
                                                                                  ANGLE_ADJUST_TOLERANCE);
                        }
                        else if (_modelProviderComponent.PlayerCurrentAimingAngle >= 350 &&
                                 _modelProviderComponent.PlayerCurrentAimingAngle < 360)
                        {
                            additionalRotOffset = -
                                                  CustomLerp.GetInterpolatedValue(_modelProviderComponent.PlayerCurrentAimingAngle, 350, 360,
                                                                                  ANGLE_ADJUST_TOLERANCE,
                                                                                  0);
                        }


                        _playerCueRenderingData.AddLast(new RenderingData.RenderingData(whiteBallPosOrigin.X + 8,
                                                                                        whiteBallPosOrigin.Y, 100, 1, Color.Bisque, -1,
                                                                                        _modelProviderComponent.GetAngleApproximated() + additionalRotOffset, whiteBallPosOrigin.X,
                                                                                        whiteBallPosOrigin.Y));
                    }
                    else if (_modelProviderComponent.CurrentGameState == EPocketGameState.ChooseShotPower)
                    {
                        _choosingShotAnimationInfobar.CurrentFrame =
                            _modelProviderComponent.GetShotForcePercent() * ANIM_INFOBAR_MAX_FRAME;

                        _choosingShotPlayerCueAnimation.CurrentFrame =
                            _modelProviderComponent.GetShotForcePercent() * ANIM_HANDSHOT_CUE_MAX_FRAME;

                        //панель с информацией о силе удара

                        _upperShotChoosePanelOverlay = new RenderingData.RenderingData(new RenderingSprite(
                                                                                           _choosingShotAnimationInfobar.GetCurrentAnimSpriteFrame(), 145, 1, 0, Color.White, -5, 1,
                                                                                           1));

                        //анимация кия

                        SpVector3 whiteBallPosOrigin = _modelProviderComponent.PlayerWhiteBall.Center;
                        whiteBallPosOrigin.X += GameFieldViewConsts.FIELD_MODEL_RENDER_LEFT_TOP_OFFSET_X;
                        whiteBallPosOrigin.Y  = GameFieldViewConsts.FIELD_MODEL_RENDER_LEFT_TOP_OFFSET_Y +
                                                (GameFieldViewConsts.FIELD_HEIGHT - whiteBallPosOrigin.Y);

                        _playerCueRenderingData.AddLast(new RenderingData.RenderingData(new RenderingSprite(
                                                                                            _choosingShotPlayerCueAnimation.GetCurrentAnimSpriteFrame(), whiteBallPosOrigin.X + 8,
                                                                                            whiteBallPosOrigin.Y + 4, _modelProviderComponent.PlayerCurrentAimingAngle - 180,
                                                                                            Color.White,
                                                                                            -6, 1, 1, EHorizontalAlign.Left, EVerticalAlign.Middle, whiteBallPosOrigin.X,
                                                                                            whiteBallPosOrigin.Y)));
                    }
                }
            }
        }