コード例 #1
0
 public PositionTrigger(CurveRasterization curve, int index, bool preventReverse, bool keepProgress)
     : base(curve)
 {
     this.triggerPointIndex = index;
     this.preventReverse    = preventReverse;
     this.keepProgress      = keepProgress;
 }
コード例 #2
0
        public override void Initialize()
        {
            checkpointRasterization = raceTrack.GetCurveRasterization(checkpoints);

            List <AbstractTrigger> checkpointTriggers = new List <AbstractTrigger>();

            for (int i = 0; i < checkpoints; i++)
            {
                PositionTrigger trigger     = new PositionTrigger(checkpointRasterization, i, true, true);
                string          outputDebug = "Passing checkpoint " + i;
                trigger.Triggered += (sender, e) =>
                {
                    Console.WriteLine(outputDebug);

                    var now = DateTime.Now;
                    if (lastCheckpointPass != DateTime.MinValue)
                    {
                        gameInstance.GetService <HUDComponent>().ShowTextNotification(Color.BurlyWood, (now - lastCheckpointPass).ToString(@"m\:ss\:ff"));
                    }
                    lastCheckpointPass = now;

                    var current  = states[CurrentState];
                    var aTrigger = sender as AbstractTrigger;
                    if (e.Object == car && current.Triggers.ContainsKey(aTrigger))
                    {
                        current.Triggers[aTrigger] = e;
                    }
                    AudioEngineManager.PlaySound("passfinishline");
                };

                string checkpointID = "checkpoint" + i;
                gameInstance.GetService <TriggerManager>().Triggers.Add(checkpointID, trigger);
                checkpointTriggers.Add(trigger);
                addedTriggers.Add(checkpointID);
            }

            // Keep track of times when passing goal line
            var goalTrigger = checkpointTriggers[0];

            goalTrigger.Triggered += (sender, e) =>
            {
                goalLineTimes.Add(e.Time.TotalGameTime);
                var    player       = gameInstance.GetService <Player>();
                string notification = (++player.Lap) > laps ? "Race finished!" : "Lap " + (player.Lap);
                gameInstance.GetService <HUDComponent>().ShowTextNotification(Color.Teal, notification);
            };

            for (int i = 0; i < laps; i++)
            {
                List <AbstractTrigger> lapTriggers = new List <AbstractTrigger>();
                lapTriggers.AddRange(checkpointTriggers);

                states.Add(new GameModeState(lapTriggers));
            }

            // Add state for passing the finish line
            states.Add(new GameModeState(checkpointTriggers.GetRange(index: 0, count: 1)));
        }
コード例 #3
0
        public SimpleRaceMode(GameManager gameInstance, int laps, int noOfCheckpoints, RaceTrack raceTrack, Car localCar)
            : base(gameInstance)
        {
            this.laps                   = laps;
            this.checkpoints            = noOfCheckpoints;
            this.raceTrack              = raceTrack;
            this.car                    = localCar;
            this.placementRasterization = raceTrack.GetCurveRasterization(100);
            PlayerPlace                 = 1;
            GameStarted                 = false;
            TotalRaceTime               = TimeSpan.Zero;

            var player = gameInstance.GetService <Player>();

            player.Lap = 0;
            players.Add(player);

            Initialize();
        }
コード例 #4
0
        public NavMesh(GraphicsDevice device, datx02_rally.GameLogic.Curve curve, int resolution, float width, Vector3 terrainScale)
        {
            this.device = device;

            #region Vertices

            //vertices = new NavMeshTriangleVertex[2 * resolution];
            vertices = new VertexPositionColor[2 * resolution];
            {
                int i = 0;
                var curveRasterization = new CurveRasterization(curve, resolution).Points;
                foreach (var point in curveRasterization)
                {
                    vertices[i++] = new VertexPositionColor(10 * Vector3.Up + point.Position - (terrainScale * width * point.Side), Color.White);
                    vertices[i++] = new VertexPositionColor(10 * Vector3.Up + point.Position + (terrainScale * width * point.Side), Color.White);
                }
            }

            #endregion

            #region Indicies

            int[] indices = new int[6 * resolution];

            int[] offsets = { 0, 1, 2, 2, 1, 0 };
            for (int i = 0; i < indices.Length; i++)
            {
                int v = i / 3 + offsets[i % 6];
                if (v >= vertices.Length)
                {
                    v -= vertices.Length;
                }
                indices[i] = v;
            }

            #endregion

            #region Triangles

            triangles = new NavMeshTriangle[2 * resolution];

            for (int i = 0; i < indices.Length; i += 3)
            {
                triangles[i / 3] = new NavMeshTriangle(vertices[indices[i]].Position,
                                                       vertices[indices[i + 1]].Position,
                                                       vertices[indices[i + 2]].Position);
            }


            // Smoothen out normals
            for (int i = 1; i < triangles.Length; i += 2)
            {
                int j = i - 1, c = i - 2, d = j - 2;
                if (c < 0)
                {
                    c += triangles.Length;
                    d += triangles.Length;
                }

                Vector3 normal = Vector3.Lerp(triangles[i].normal, triangles[j].normal, .5f);
                Vector3 others = Vector3.Lerp(triangles[c].normal, triangles[d].normal, .5f);
                normal = Vector3.Lerp(normal, others, .6f);
                triangles[i].normal = triangles[j].normal = normal;
            }

            #endregion

            #region Buffers

            indexBuffer = new IndexBuffer(device, typeof(int), indices.Length, BufferUsage.None);
            indexBuffer.SetData(indices);
            indexBuffer.SetData(indices, 0, 6);

            vertexbuffer = new VertexBuffer(device,
                                            typeof(VertexPositionColor), vertices.Length,
                                            BufferUsage.None);
            vertexbuffer.SetData(vertices);
            vertexbuffer.SetData(vertices, 0, 6);

            #endregion

            Effect = new BasicEffect(device);
        }
コード例 #5
0
 public AbstractTrigger(CurveRasterization curve) : this()
 {
     Curve = curve;
 }