/// <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))); } } } }