Пример #1
0
        public override void Render(GameTime gameTime)
        {
            SystemCore.GraphicsDevice.Clear(Color.Black);
            DebugShapeRenderer.VisualiseAxes(5f);

            RenderLineDefs();

            RenderFloodFill();

            RenderPath();

            //RenderPartition();

            if (playerObj != null)
            {
                DoomComponent playerDoomComponent = playerObj.GetComponent <DoomComponent>();

                Color forwardColor = Color.Red;
                Color leftColor    = Color.Red;
                Color rightColor   = Color.Red;

                if (playerDoomComponent.ForwardHitVector)
                {
                    forwardColor = Color.Blue;
                }
                if (playerDoomComponent.LeftHitVector)
                {
                    leftColor = Color.Blue;
                }
                if (playerDoomComponent.RightHightVector)
                {
                    rightColor = Color.Blue;
                }


                Vector3 pos        = playerObj.Transform.AbsoluteTransform.Translation;
                Vector3 forwardVec = playerObj.Transform.AbsoluteTransform.Translation + playerObj.Transform.AbsoluteTransform.Forward * playerDoomComponent.HitVectorSize;
                Vector3 rightVec   = MonoMathHelper.RotateAroundPoint(forwardVec, playerObj.Transform.AbsoluteTransform.Translation, Vector3.Up, MathHelper.PiOver4);
                Vector3 leftVec    = MonoMathHelper.RotateAroundPoint(forwardVec, playerObj.Transform.AbsoluteTransform.Translation, Vector3.Up, -MathHelper.PiOver4);

                DebugShapeRenderer.AddLine(pos, forwardVec, forwardColor);
                DebugShapeRenderer.AddLine(pos, leftVec, leftColor);
                DebugShapeRenderer.AddLine(pos, rightVec, rightColor);



                DebugText.Write(playerObj.Transform.AbsoluteTransform.Translation.ToString());
                DebugText.Write(playerAngle.ToString());
            }



            base.Render(gameTime);
        }
Пример #2
0
        private void CreateLocalWorldObject(double id, string type, out GameObject worldObject, out DoomComponent component)
        {
            var shape = CreateShape(type);

            worldObject = GameObjectFactory.CreateRenderableGameObjectFromShape(
                shape, EffectLoader.LoadSM5Effect("flatshaded"));

            component = new DoomComponent();
            worldObject.AddComponent(component);
            worldObject.ID = (int)id;
            SystemCore.GameObjectManager.AddAndInitialiseGameObject(worldObject);
            worldObjects.Add(worldObject.ID, worldObject);
        }
Пример #3
0
        private void UpdateObject(GameObject objectToUpdate, double angle, double x, double y, string type, double health, double distance)
        {
            //position the object in the world
            objectToUpdate.Transform.SetPosition(new Vector3((float)x / scale, 0, (float)y / scale));

            //turn to face the appopriate angle
            float   angleInRadians = MathHelper.ToRadians((float)angle);
            Vector3 headingVector  = new Vector3((float)Math.Cos(angleInRadians), 0, (float)Math.Sin(angleInRadians));

            objectToUpdate.Transform.SetLookAndUp(headingVector, Vector3.Up);

            DoomComponent component = objectToUpdate.GetComponent <DoomComponent>();

            component.DoomType = type;
            component.Health   = health;
            component.Angle    = angle;
            component.Distance = distance;
        }
Пример #4
0
        private void RequestHitVectorData()
        {
            if (playerObj == null)
            {
                return;
            }


            DoomComponent playerDoomComponent = playerObj.GetComponent <DoomComponent>();

            Vector3 forwardVec = playerObj.Transform.AbsoluteTransform.Translation
                                 + playerObj.Transform.AbsoluteTransform.Forward * playerDoomComponent.HitVectorSize;

            Vector3 rightVec = MonoMathHelper.RotateAroundPoint(forwardVec, playerObj.Transform.AbsoluteTransform.Translation, Vector3.Up, MathHelper.PiOver4);
            Vector3 leftVec  = MonoMathHelper.RotateAroundPoint(forwardVec, playerObj.Transform.AbsoluteTransform.Translation, Vector3.Up, -MathHelper.PiOver4);


            forwardVec *= scale;
            leftVec    *= scale;
            rightVec   *= scale;


            string paramString      = "id=" + playerObj.ID + "&x=" + forwardVec.X + "&y=" + forwardVec.Z;
            string paramStringLeft  = "id=" + playerObj.ID + "&x=" + leftVec.X + "&y=" + leftVec.Z;
            string paramStringRight = "id=" + playerObj.ID + "&x=" + rightVec.X + "&y=" + rightVec.Z;

            if (requestVec == 0)
            {
                apiHandler.EnqueueRequest(false, "leftHitVec", new RestRequest("world/movetest?" + paramStringLeft));
                requestVec++;
            }
            if (requestVec == 1)
            {
                apiHandler.EnqueueRequest(false, "rightHitVec", new RestRequest("world/movetest?" + paramStringRight));
                requestVec++;
            }
            if (requestVec == 2)
            {
                apiHandler.EnqueueRequest(false, "forwardHitVec", new RestRequest("world/movetest?" + paramString));
                requestVec = 0;
                timeOfLastHitVectorUpdate = DateTime.Now;
            }
        }
Пример #5
0
        private void UpdatePlayer(RestResponse x)
        {
            IDictionary <string, object> jsonValues = Json.JsonParser.FromJson(x.Content);

            //in doom, 0 degrees is East. Increased value turns us counter clockwise, so north is 90, west 180 etc
            var playerAngle = (double)jsonValues["angle"];



            IDictionary <string, object> pos = jsonValues["position"] as IDictionary <string, object>;
            double xpos = (double)pos["x"];
            double ypos = (double)pos["y"];

            //create if first time
            if (playerObj == null)
            {
                playerObj = GameObjectFactory.CreateRenderableGameObjectFromShape(
                    new ProceduralCube(), EffectLoader.LoadSM5Effect("flatshaded"));
                playerObj.Transform.Scale = 0.5f;
                var id = (double)jsonValues["id"];
                playerObj.ID = (int)id;
                playerId     = playerObj.ID;
                DoomComponent component = new DoomComponent();
                component.DoomType      = "Player";
                component.HitVectorSize = 0.5f;
                playerObj.AddComponent(component);
                playerObj.AddComponent(new DoomMovementComponent(mapHandler, apiHandler));
                playerObj.AddComponent(new DoomCombatComponent(mapHandler, apiHandler, worldObjects));
                SystemCore.GameObjectManager.AddAndInitialiseGameObject(playerObj);
            }



            //remember to scale it appropriately. In doom, Z is up, but here it's Y, so swap those coords
            playerObj.Transform.SetPosition(new Vector3((float)xpos / mapHandler.scale, 0, (float)ypos / mapHandler.scale));

            //turn us to face the appopriate angle
            float   playerAngleInRadians = MathHelper.ToRadians((float)playerAngle);
            Vector3 headingVector        = new Vector3((float)Math.Cos(playerAngleInRadians), 0, (float)Math.Sin(playerAngleInRadians));

            playerObj.Transform.SetLookAndUp(headingVector, Vector3.Up);
        }
Пример #6
0
        private void ResponseHitVector(RestResponse response, string vec)
        {
            DoomComponent playerDoomComponent = playerObj.GetComponent <DoomComponent>();

            if (vec == "leftHitVec")
            {
                var content = Json.JsonParser.FromJson(response.Content);
                playerDoomComponent.LeftHitVector = (bool)content["result"];
            }
            if (vec == "forwardHitVec")
            {
                var content = Json.JsonParser.FromJson(response.Content);
                playerDoomComponent.ForwardHitVector = (bool)content["result"];
            }
            if (vec == "rightHitVec")
            {
                var content = Json.JsonParser.FromJson(response.Content);
                playerDoomComponent.RightHightVector = (bool)content["result"];
            }
        }
Пример #7
0
        private void PickUpObjects()
        {
            List <GameObject> visiblePickups = new List <GameObject>();

            foreach (GameObject o in worldObjects.Values)
            {
                if (mapHandler.IntersectsLevel(playerObj.Transform.AbsoluteTransform.Translation, o.Transform.AbsoluteTransform.Translation))
                {
                    continue;
                }

                DoomComponent d = o.GetComponent <DoomComponent>();

                if (d.DoomType.ToLower().Contains("armor"))
                {
                    visiblePickups.Add(o);
                }
                if (d.DoomType.ToLower().Contains("health"))
                {
                    visiblePickups.Add(o);
                }
                if (d.DoomType.ToLower().Contains("shotgun"))
                {
                    visiblePickups.Add(o);
                }
                if (d.DoomType.ToLower().Contains("ammo"))
                {
                    visiblePickups.Add(o);
                }
                if (d.DoomType.ToLower().Contains("keycard"))
                {
                    visiblePickups.Add(o);
                }
            }

            float      closest          = float.MaxValue;
            GameObject newClosestPickup = null;

            foreach (GameObject o in visiblePickups)
            {
                float dist = (playerObj.Transform.AbsoluteTransform.Translation - o.Transform.AbsoluteTransform.Translation).Length();
                if (dist < closest)
                {
                    newClosestPickup = o;
                    closest          = dist;
                }
            }

            //if we've collected the item, but the path is still there, drop the path
            if (!visiblePickups.Contains(currentClosestPickup) && !endOfLevelSeeking)
            {
                if (playerObj != null)
                {
                    playerObj.GetComponent <DoomMovementComponent>().path = null;
                }
            }


            if (newClosestPickup != null)
            {
                if (playerObj.GetComponent <DoomMovementComponent>().path == null || endOfLevelSeeking)
                {
                    endOfLevelSeeking = false;
                    playerObj.GetComponent <DoomMovementComponent>().PathToPoint(newClosestPickup.Transform.AbsoluteTransform.Translation);
                    currentClosestPickup = newClosestPickup;
                }
                else if (newClosestPickup != currentClosestPickup)
                {
                    playerObj.GetComponent <DoomMovementComponent>().PathToPoint(newClosestPickup.Transform.AbsoluteTransform.Translation);
                    currentClosestPickup = newClosestPickup;
                }
            }
        }