示例#1
0
        /// avoid map crash
        private HashSet <IPhysicEvent> calculateAvoidMapCrashEvents(Move currentMove)
        {
            HashSet <IPhysicEvent> pEvents = new HashSet <IPhysicEvent> {
                new MapCrashEvent()
            };

            if (null != moverSelfMapCrashEvent)
            {
                pEvents.Add(moverSelfMapCrashEvent.Copy());
            }

            if (null != passageLineEvent)
            {
                pEvents.Add(passageLineEvent.Copy());
            }

            PCar physicCar = new PCar(car, game);

            physicCar.setEnginePower(currentMove.EnginePower);
            physicCar.setWheelTurn(0);//currentMove.WheelTurn
            physicCar.setBrake(currentMove.IsBrake);

            PhysicEventsCalculator.calculateEvents(physicCar, new MoveWithOutChange(), pEvents, calculateAvoidSideCrashEventCheckEnd);

            return(pEvents);
        }
示例#2
0
        private void move(Move moveResult)
        {
            PCar physicCar = new PCar(car, game);

            physicCar.setEnginePower(enginePowerSign);

            HashSet <IPhysicEvent> events = calculateMoveEvents(physicCar);

            if (events.ComeContaints(PhysicEventType.MapCrash) || events.ComeContaints(PhysicEventType.ObjectsCrash))
            {
                moveResult.WheelTurn = physicCar.WheelTurnForEndZeroWheelTurn(defaultPos, speedSign);
            }
        }
示例#3
0
        private void turn(Move moveResult, Vector needDirAngle)
        {
            PCar iterCar = new PCar(car, game);

            iterCar.setEnginePower(enginePowerSign);

            Vector endPoint = endTile.ToVector(1 - dirMove.X, 1 - dirMove.Y);

            endPoint = endPoint + new Vector(dirMove.X, dirMove.Y) * game.TrackTileMargin;

            double speedSign = Math.Sign(Vector.sincos(car.Angle).Dot(new Vector(car.SpeedX, car.SpeedY)));

            HashSet <IPhysicEvent> events = calculateTurnEvents(iterCar, needDirAngle);

            IPhysicEvent passageLine = events.ComeContaints(PhysicEventType.PassageLine) ? events.GetEvent(PhysicEventType.PassageLine) : null;
            IPhysicEvent outLine     = events.ComeContaints(PhysicEventType.OutLine) ? events.GetEvent(PhysicEventType.OutLine) : null;
            IPhysicEvent speedReach  = events.ComeContaints(PhysicEventType.SpeedReach) ? events.GetEvent(PhysicEventType.SpeedReach) : null;

            if (null != passageLine && null != outLine)
            {
                int speedReachTick = null != speedReach ? speedReach.TickCome : maxIterationCount;

                if (speedReachTick * iterCar.CalculateBrakeFactor() > outLine.TickCome)
                {
                    moveResult.IsBrake = car.Speed() > Constant.MinBrakeSpeed;
                }
            }

            if (!hasReserveTicks(iterCar, needDirAngle))
            {
                HashSet <IPhysicEvent> crashEvents      = calculateTurnMapCrashEvents(iterCar, needDirAngle, moveResult.IsBrake);
                IPhysicEvent           mapBrakeCrash    = crashEvents.ComeContaints(PhysicEventType.ObjectsCrash) ? crashEvents.GetEvent(PhysicEventType.ObjectsCrash) : null;
                IPhysicEvent           passageLineBrake = crashEvents.ComeContaints(PhysicEventType.PassageLine) ? crashEvents.GetEvent(PhysicEventType.PassageLine) : null;

                //bool endMove = checkStrongParallel(mapBrakeCrash);
                int  tickToZeroWheelTurn = (int)Math.Round(Math.Abs(iterCar.WheelTurn / game.CarWheelTurnChangePerTick));
                bool nearEndAndCrash     = (null != mapBrakeCrash && null != passageLine && mapBrakeCrash.TickCome <= tickToZeroWheelTurn && passageLine.TickCome < tickToZeroWheelTurn);
                if ((null == mapBrakeCrash && null != passageLineBrake) || nearEndAndCrash)
                {
                    moveResult.WheelTurn = new PCar(car, game).WheelTurnForEndZeroWheelTurn(needDirAngle.Angle, speedSign);
                }
            }

            if (isMovedOutFromLine(iterCar, needDirAngle))
            {
                moveResult.WheelTurn = new PCar(car, game).WheelTurnForEndZeroWheelTurn(needDirAngle.Angle, speedSign);
            }
        }