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); }
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); }
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; }
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; } }
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); }
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"]; } }
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; } } }