private void updateUnitInput() { /* Selecting Units */ if (input.wasKeyJustPressed(GameKeys.UNIT_SELECT)) { selectTimer = 0; startClickX = input.getMouseX(); startClickY = input.getMouseY(); lineTool.setPointsList(new List<Vector3>()); } else if (input.wasKeyJustReleased(GameKeys.UNIT_SELECT)) { currClickX = input.getMouseX(); currClickY = input.getMouseY(); // select a single unit if ((startClickX == currClickX && startClickY == currClickY) || selectTimer < 6) { Vector3 mousePoint = terrain.projectToTerrain(startClickX, startClickY); if (mousePoint != Terrain.BAD_POSITION) { float minDist = 2.5f; MovableEntity selected = null; foreach (MovableEntity entity in entities) { entity.setSelected(false); if (!entity.isDead()) { Vector3 dist = mousePoint - entity.getPosition(); if (dist.Length() < minDist) { minDist = dist.Length(); selected = entity; } } } if (selected != null) selected.setSelected(true); } } //select a group of units else { int topX = Math.Min(startClickX, currClickX); int topY = Math.Min(startClickY, currClickY); int bottomX = Math.Max(startClickX, currClickX); int bottomY = Math.Max(startClickY, currClickY); Rectangle bounds = new Rectangle(topX, topY, bottomX - topX, bottomY - topY); foreach (MovableEntity entity in entities) { entity.setSelected(false); if (!entity.isDead()) { Vector3 entityPos = terrain.projectToScreen(entity.getPosition()); if (entityPos.Z < 1 && bounds.Contains(new Point((int)entityPos.X, (int)entityPos.Y))) entity.setSelected(true); } } } } if (input.isKeyPressed(GameKeys.UNIT_SELECT)) { selectTimer++; currClickX = input.getMouseX(); currClickY = input.getMouseY(); if (selectTimer >= 6) { int screenX = getGraphics().Viewport.Width / 2; int screenY = getGraphics().Viewport.Height / 2; List<Vector3> boundingBox = new List<Vector3>(); boundingBox.Add(new Vector3((startClickX - screenX) / (float)screenX, -(startClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((currClickX - screenX) / (float)screenX, -(startClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((currClickX - screenX) / (float)screenX, -(currClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((startClickX - screenX) / (float)screenX, -(currClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((startClickX - screenX) / (float)screenX, -(startClickY - screenY) / (float)screenY, 0)); lineTool.setPointsList(boundingBox); } } /* Commanding Units */ if (input.wasKeyJustPressed(GameKeys.UNIT_COMMAND)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { foreach (MovableEntity entity in entities) { if (entity.IsSelected) { bool pathFound; Path p = aStar.computePath(entity.getPosition().X, entity.getPosition().Y, mousePoint.X, mousePoint.Y, out pathFound); if (pathFound) entity.setPath(p); } } } } /* Spawning Units */ if (input.wasKeyJustReleased(GameKeys.UNIT_SPAWN_GUARD)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { List<Vector3> dummyPath = new List<Vector3>(); dummyPath.Add(mousePoint); MovableEntity newEntity = new Guard(this, levelInfo, modelLoader, new Path(dummyPath), 0, projectileManager); entities.Add(newEntity); soundManager.playSound(SoundHandle.Truck, newEntity); } } else if (input.wasKeyJustReleased(GameKeys.UNIT_SPAWN_SCOUT)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { List<Vector3> dummyPath = new List<Vector3>(); dummyPath.Add(mousePoint); MovableEntity newEntity = new Scout(this, levelInfo, modelLoader, new Path(dummyPath), 0); entities.Add(newEntity); soundManager.playSound(SoundHandle.Truck, newEntity); } } else if (input.wasKeyJustReleased(GameKeys.UNIT_SPAWN_TANKER)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { List<Vector3> dummyPath = new List<Vector3>(); dummyPath.Add(mousePoint); MovableEntity newEntity = new Tanker(this, levelInfo, modelLoader, new Path(dummyPath), 0); entities.Add(newEntity); soundManager.playSound(SoundHandle.Truck, newEntity); } } /* Deleting Units */ if (input.wasKeyJustReleased(GameKeys.UNIT_DELETE)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { float minDist = 5.0f; MovableEntity deleted = null; foreach (MovableEntity entity in entities) { Vector3 dist = mousePoint - entity.getPosition(); if (dist.Length() < minDist) { minDist = dist.Length(); deleted = entity; } } if (deleted != null) entities.Remove(deleted); } } }
private void updateUnits() { /* Selecting Units */ if (input.wasKeyJustPressed(GameKeys.UNIT_SELECT)) { selectTimer = 0; startClickX = input.getMouseX(); startClickY = input.getMouseY(); lineTool.setPointsList(new List<Vector3>()); } else if (!input.isKeyPressed(GameKeys.UNIT_SELECT)) { currClickX = input.getMouseX(); currClickY = input.getMouseY(); // select a single unit if ((startClickX == currClickX && startClickY == currClickY) || selectTimer < 6) { Vector3 mousePoint = terrain.projectToTerrain(startClickX, startClickY); if (mousePoint != Terrain.BAD_POSITION) { float minDist = 2.5f; MovableEntity selected = null; foreach (MovableEntity entity in localEntities) { entity.setSelected(false); Vector3 dist = mousePoint - entity.getPosition(); if (dist.Length() < minDist) { minDist = dist.Length(); selected = entity; } } if (selected != null) selected.setSelected(true); } } //select a group of units else { int topX = Math.Min(startClickX, currClickX); int topY = Math.Min(startClickY, currClickY); int bottomX = Math.Max(startClickX, currClickX); int bottomY = Math.Max(startClickY, currClickY); Rectangle bounds = new Rectangle(topX, topY, bottomX - topX, bottomY - topY); foreach (MovableEntity entity in localEntities) { entity.setSelected(false); Vector3 entityPos = terrain.projectToScreen(entity.getPosition()); if (entityPos.Z < 1) { if (bounds.Contains(new Point((int)entityPos.X, (int)entityPos.Y))) { entity.setSelected(true); } } } } } if (input.isKeyPressed(GameKeys.UNIT_SELECT)) { selectTimer++; currClickX = input.getMouseX(); currClickY = input.getMouseY(); if (selectTimer >= 6) { int screenX = getGraphics().Viewport.Width / 2; int screenY = getGraphics().Viewport.Height / 2; List<Vector3> boundingBox = new List<Vector3>(); boundingBox.Add(new Vector3((startClickX - screenX) / (float)screenX, -(startClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((currClickX - screenX) / (float)screenX, -(startClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((currClickX - screenX) / (float)screenX, -(currClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((startClickX - screenX) / (float)screenX, -(currClickY - screenY) / (float)screenY, 0)); boundingBox.Add(new Vector3((startClickX - screenX) / (float)screenX, -(startClickY - screenY) / (float)screenY, 0)); lineTool.setPointsList(boundingBox); } } /* Commanding Units */ if (input.wasKeyJustPressed(GameKeys.UNIT_COMMAND)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { foreach (MovableEntity entity in localEntities) { if (entity.IsSelected) { bool pathFound; Path p = aStar.computePath(entity.getPosition().X, entity.getPosition().Y, mousePoint.X, mousePoint.Y, out pathFound); if (pathFound) entity.setPath(p); } } } } /* Spawning Units */ if (input.wasKeyJustReleased(GameKeys.UNIT_SPAWN_GUARD)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { List<Vector3> dummyPath = new List<Vector3>(); dummyPath.Add(mousePoint); MovableEntity newEntity = new Scout(this, levelInfo, modelLoader, new Path(dummyPath), 0); localEntities.Add(newEntity); soundManager.playSound(SoundHandle.Truck, newEntity); } } else if (input.wasKeyJustReleased(GameKeys.UNIT_SPAWN_SCOUT)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { List<Vector3> dummyPath = new List<Vector3>(); dummyPath.Add(mousePoint); MovableEntity newEntity = new Scout(this, levelInfo, modelLoader, new Path(dummyPath), 0); localEntities.Add(newEntity); soundManager.playSound(SoundHandle.Truck, newEntity); } } else if (input.wasKeyJustReleased(GameKeys.UNIT_SPAWN_TANKER)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { List<Vector3> dummyPath = new List<Vector3>(); dummyPath.Add(mousePoint); MovableEntity newEntity = new Tanker(this, levelInfo, modelLoader, new Path(dummyPath), 0); localEntities.Add(newEntity); soundManager.playSound(SoundHandle.Truck, newEntity); } } /* Deleting Units */ if (input.wasKeyJustReleased(GameKeys.UNIT_DELETE)) { Vector3 mousePoint = terrain.projectToTerrain(input.getMouseX(), input.getMouseY()); if (mousePoint != Terrain.BAD_POSITION) { float minDist = 5.0f; MovableEntity deleted = null; foreach (MovableEntity entity in localEntities) { Vector3 dist = mousePoint - entity.getPosition(); if (dist.Length() < minDist) { minDist = dist.Length(); deleted = entity; } } if (deleted != null) localEntities.Remove(deleted); } } for (int i = 0; i < localEntities.Count; i++) localEntities[i].update(); for (int i = 0; i < localEntities.Count; i++) { MovableEntity a = localEntities[i]; for (int j = i + 1; j < localEntities.Count; j++) { MovableEntity b = localEntities[j]; if (MovableEntity.checkStaticCollision(a, b)) { float xDiff = a.getPosition().X - b.getPosition().X; float yDiff = a.getPosition().Y - b.getPosition().Y; Vector3 diff = new Vector3(xDiff, yDiff, 0); Vector3 dist = diff; if (diff.Length() != 0) diff.Normalize(); diff *= a.radius + b.radius; Vector3 displacement = diff - dist; Vector3 aNewPos = a.getPosition() + displacement / 2; aNewPos.Z = levelInfo.getHeight(aNewPos.X, aNewPos.Y); a.setPosition(aNewPos); Vector3 bNewPos = b.getPosition() - displacement / 2; bNewPos.Z = levelInfo.getHeight(bNewPos.X, bNewPos.Y); b.setPosition(bNewPos); List<Vector3> aPos = new List<Vector3>(); aPos.Add(a.getPosition()); a.setPath(new Path(aPos)); List<Vector3> bPos = new List<Vector3>(); bPos.Add(b.getPosition()); b.setPath(new Path(bPos)); } } } }