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