public static void draw(SpriteBatch sb, GraphicsDevice gd, Matrix matrix, GameTime gameTime, List <Craft> craftlist) { gd.Clear(Color.Black); #region rendertarget foreach (Craft c in craftlist) { if (c.needsrerendering > 0) { c.rendertarget = new RenderTarget2D(gd, (int)((c.size.X - c.posoffset.X) * 1000), (int)((c.size.Y - c.posoffset.Y) * 1000)); gd.SetRenderTarget(c.rendertarget); gd.Clear(Color.Transparent); sb.Begin(); foreach (Part p in c.partlist) { sb.Draw(Drawing.dictionary[p.type], new Rectangle((int)((p.pos.X - c.posoffset.X) * 1000), (int)((p.pos.Y - c.posoffset.Y) * 1000), (int)(p.size.X * 1000), (int)(p.size.Y * 1000)), Color.White); } sb.End(); c.needsrerendering--; gd.SetRenderTarget(null); } } #endregion #region draw world sb.Begin(SpriteSortMode.Immediate, null, null, null, null, null, Camera.matrix(gd.Viewport)); #region draw path if (Camera.zoom < 1.76313472) { //drawaccurateorbits(sb, gd, matrix, gameTime, craftlist); draworbits(sb, gd, matrix, gameTime, craftlist); sb.Draw(Drawing.arrow, craftlist[0].pos, null, Color.White, (float)craftlist[0].rotation, new Vector2(32, 32), (1 / Camera.zoom) * 0.25f, SpriteEffects.None, 1); } #endregion #region draw planets if (Flight.planet[0].hasatmosphere) { Rectangle arec = new Rectangle((int)((Flight.planet[0].posx - (Flight.planet[0].radius + Flight.planet[0].atmosphereradius)) * worldscale), (int)((Flight.planet[0].posy - (Flight.planet[0].radius + Flight.planet[0].atmosphereradius)) * worldscale), (int)((Flight.planet[0].radius + Flight.planet[0].atmosphereradius) * 2 * worldscale), (int)((Flight.planet[0].radius + Flight.planet[0].atmosphereradius) * 2 * worldscale)); sb.Draw(Drawing.atmosphere, arec, Color.White); } Rectangle rec = new Rectangle((int)((Flight.planet[0].posx - Flight.planet[0].radius * 1) * worldscale), (int)((Flight.planet[0].posy - Flight.planet[0].radius * 1) * worldscale), (int)(Flight.planet[0].radius * 2 * worldscale), (int)(Flight.planet[0].radius * 2 * worldscale)); sb.Draw(Flight.planet[0].texture, rec, Color.White); //sb.Draw(Drawing.white, new Rectangle((int)craftlist[0].pos.X,(int)craftlist[0].pos.Y,1,1), Color.Green); #endregion #region draw crafts sb.End(); sb.Begin(); foreach (Craft c in craftlist) { Rectangle srec = new Rectangle(0, 0, c.rendertarget.Width, c.rendertarget.Height); sb.Draw(c.rendertarget, Camera.screencenter + (c.pos * worldscale), srec, Color.White, c.rotation, new Vector2(0, 0), Camera.zoom / 1000, SpriteEffects.None, 1); } sb.End(); #endregion #endregion #region draw menus sb.Begin(); sb.DrawString(Drawing.font, "Throttle = " + (craftlist[0].throttle * 100).ToString(), new Vector2(0, 0), Color.White); sb.DrawString(Drawing.font, "vel = " + Drawing.getsiprefix(craftlist[0].vel.Length()) + "M/S", new Vector2(0, 20), Color.White); foreach (Part p in craftlist[0].partlist) { if (p.type == "engine" & p.on) { sb.DrawString(Drawing.font, "TWR = " + (craftlist[0].throttle * p.thrust / (craftlist[0].mass * 9.81f)), new Vector2(0, 40), Color.White); } } sb.DrawString(Drawing.font, "Timewarp = " + Flight.timewarp.ToString() + "* speed", new Vector2(0, 60), Color.White); sb.DrawString(Drawing.font, "Altitude = " + Drawing.getsiprefix((Flight.planet[0].pos - craftlist[0].pos).Length()) + "m", new Vector2(200, 0), Color.White); sb.DrawString(Drawing.font, "Alt surf = " + Drawing.getsiprefix((Flight.planet[0].pos - craftlist[0].pos).Length() - Flight.planet[0].radius) + "m", new Vector2(200, 20), Color.White); if (Camera.zoom < 1.76313472) { sb.DrawString(Drawing.font, "Apoapsis = " + Drawing.getsiprefix(apoapsis) + "m", new Vector2(500, 0), Color.White); sb.DrawString(Drawing.font, "Periapsis = " + Drawing.getsiprefix(periapsis) + "m", new Vector2(500, 20), Color.White); sb.DrawString(Drawing.font, "Time to apoapsis = " + Drawing.getsiprefix(timetoapoapsis) + "s", new Vector2(800, 0), Color.White); sb.DrawString(Drawing.font, "Time to periapsis = " + Drawing.getsiprefix(timetoperiapsis) + "s", new Vector2(800, 20), Color.White); sb.DrawString(Drawing.font, "Eccentricity = " + eccentricity.ToString(), new Vector2(1100, 0), Color.White); } #region deltavstats if (Editor.stage != null & craftlist.Count != 0 & true) { Craft c = new Craft(); int laststage = 10; c.partlist = new List <Part>(craftlist[0].partlist); foreach (Part p in c.partlist) { p.dontcalculatemymass = false; } float[] deltav = new float[10]; float[] twr = new float[10]; for (int s = 0; s < 10; s++) { if (Editor.stage[s] != null) { foreach (int i in Editor.stage[s]) { for (int j = 0; j < c.partlist.Count(); j++) { Part p = c.partlist[j]; if (c.partlist[j].id == i) { if (c.partlist[j].type == "separator") { //separator part List <Part> lista = new List <Part>(); List <int> used = new List <int>(); foreach (Part pa in c.partlist) { if (pa.id != p.parent) { foreach (int n in p.neibours) { if (n == pa.id) { lista.Add(pa); } } } } for (int k = 0; k < lista.Count(); k++) { bool partused = false; foreach (int l in used) { if (lista[k].id == l) { partused = true; } } if (!partused) { foreach (Part pa in c.partlist) { foreach (int n in lista[k].neibours) { if (n == pa.id) { lista.Add(pa); used.Add(pa.id); } } } } } foreach (Part pa in lista) { pa.dontcalculatemymass = true; } } } } } for (int i = 0; i < c.partlist.Count(); i++) { if (c.partlist[i].removeme) { c.partlist.Remove(c.partlist[i]); } } if (Editor.stage[s].Count == 0 & laststage == 10) { laststage = s; } foreach (int i in Editor.stage[s]) { for (int j = 0; j < c.partlist.Count(); j++) { if (c.partlist[j].id == i) { if (c.partlist[j].type == "engine") { //engine part foreach (int k in c.partlist[j].neibours) { for (int l = 0; l < c.partlist.Count(); l++) { if (c.partlist[l].id == k) { //neibour of the engine float mass = DrawEditor.getmass(c); deltav[s] += (float)(Math.Log(mass / (mass - c.partlist[l].fuel)) * c.partlist[j].isp * 9.81f); //why ar u lying to me??? twr[s] = c.partlist[j].thrust / (mass * 9.81f); } } } } } } } } else { laststage = s; } } //explanations here int ssep = 50; sb.Draw(Drawing.white, new Rectangle(0, (int)Camera.screencenter.Y * 2 + 10 - (laststage + 1) * ssep, 600, (laststage + 2) * ssep), Color.Gray); for (int i = 0; i < laststage; i++) { sb.Draw(Drawing.white, new Rectangle(10, (int)Camera.screencenter.Y * 2 - 50 - i * ssep, 90, ssep), Color.Black); sb.DrawString(Drawing.font, deltav[i].ToString(), new Vector2(10, Camera.screencenter.Y * 2 - 50 - i * ssep), Color.White); sb.Draw(Drawing.white, new Rectangle(110, (int)Camera.screencenter.Y * 2 - 50 - i * ssep, 90, ssep), Color.Black); sb.DrawString(Drawing.font, twr[i].ToString(), new Vector2(110, Camera.screencenter.Y * 2 - 50 - i * ssep), Color.White); } sb.DrawString(Drawing.font, "deltav", new Vector2(10, Camera.screencenter.Y * 2 + 10 - (laststage + 1) * ssep), Color.White); sb.DrawString(Drawing.font, "TWR", new Vector2(110, Camera.screencenter.Y * 2 + 10 - (laststage + 1) * ssep), Color.White); foreach (Part p in c.partlist) { p.dontcalculatemymass = false; } } sb.End(); #endregion #endregion }
public static void draw(SpriteBatch sb, GraphicsDevice gd, Matrix matrix, GameTime gameTime, List <Craft> craftlist) { gd.Clear(Color.CornflowerBlue); sb.Begin(); sb.Draw(Drawing.white, new Rectangle(10, 10, 400, 30), Color.Green); sb.DrawString(Drawing.menufont, "Commandpod", new Vector2(50, 10), Color.White); sb.Draw(Drawing.white, new Rectangle(10, 50, 400, 30), Color.Green); sb.DrawString(Drawing.menufont, "Fueltank", new Vector2(50, 50), Color.White); sb.Draw(Drawing.white, new Rectangle(10, 90, 400, 30), Color.Green); sb.DrawString(Drawing.menufont, "Engine", new Vector2(50, 90), Color.White); sb.Draw(Drawing.white, new Rectangle(10, 130, 400, 30), Color.Green); sb.DrawString(Drawing.menufont, "Separator", new Vector2(50, 130), Color.White); sb.Draw(Drawing.white, new Rectangle(500, 10, 400, 30), Color.Red); sb.DrawString(Drawing.menufont, "Delete craft", new Vector2(550, 10), Color.White); sb.Draw(Drawing.white, new Rectangle(1000, 10, 400, 30), Color.Green); sb.DrawString(Drawing.menufont, "Fly", new Vector2(1050, 10), Color.White); #region part editor if (Editor.parteditor & craftlist.Count != 0) { foreach (Part p in craftlist[0].partlist) { if (p.id == Editor.parteditornumber) { //V2 is startpoint of the parteditor window Vector2 v2 = new Vector2(0, Camera.screencenter.Y * 2 - 500); //draw line from part to parteditorwindow //Drawflight.DrawLine(sb,v2+new Vector2(300,0), new Vector2((p.pos.X)* Camera.zoom + Camera.pos.X, ((p.pos.Y) * Camera.zoom + Camera.pos.Y))); //draw part editor borders sb.Draw(Drawing.white, new Rectangle((int)v2.X, (int)v2.Y, 300, 500), Color.Blue); //part type sb.Draw(Drawing.white, new Rectangle((int)v2.X + 10, (int)v2.Y + 10, 240, 30), Color.White); sb.DrawString(Drawing.menufont, p.type, new Vector2(v2.X + 10, v2.Y + 10), Color.Black); //delete part button sb.Draw(Drawing.redxbutton, new Rectangle((int)v2.X + 260, (int)v2.Y + 10, 30, 30), Color.White); //part width sb.Draw(Drawing.minusbutton, new Rectangle((int)v2.X + 10, (int)v2.Y + 50, 30, 30), Color.White); sb.Draw(Drawing.plusbutton, new Rectangle((int)v2.X + 260, (int)v2.Y + 50, 30, 30), Color.White); sb.Draw(Drawing.white, new Rectangle((int)v2.X + 50, (int)v2.Y + 50, 200, 30), Color.White); sb.DrawString(Drawing.font, "Width: " + (p.size.X / 1000).ToString() + " M", new Vector2(v2.X + 50, v2.Y + 50), Color.Black); //part height sb.Draw(Drawing.minusbutton, new Rectangle((int)v2.X + 10, (int)v2.Y + 100, 30, 30), Color.White); sb.Draw(Drawing.plusbutton, new Rectangle((int)v2.X + 260, (int)v2.Y + 100, 30, 30), Color.White); sb.Draw(Drawing.white, new Rectangle((int)v2.X + 50, (int)v2.Y + 100, 200, 30), Color.White); sb.DrawString(Drawing.font, "Height: " + (p.size.Y / 1000).ToString() + " M", new Vector2(v2.X + 50, v2.Y + 100), Color.Black); //part mass sb.Draw(Drawing.white, new Rectangle((int)v2.X + 10, (int)v2.Y + 150, 280, 30), Color.White); sb.DrawString(Drawing.font, "Mass: " + Drawing.getsiprefix(p.mass * 1000) + "g", new Vector2(v2.X + 50, v2.Y + 150), Color.Black); #region commandpod if (p.type == "commandpod") { } #endregion #region fueltank if (p.type == "fueltank") { //wet mass sb.Draw(Drawing.white, new Rectangle((int)v2.X + 10, (int)v2.Y + 200, 280, 30), Color.White); sb.DrawString(Drawing.font, "Wet mass: " + Drawing.getsiprefix((p.mass + p.fuel) * 1000) + "g", new Vector2(v2.X + 50, v2.Y + 200), Color.Black); //fueltype sb.Draw(Drawing.minusbutton, new Rectangle((int)v2.X + 10, (int)v2.Y + 250, 30, 30), Color.White); sb.Draw(Drawing.plusbutton, new Rectangle((int)v2.X + 260, (int)v2.Y + 250, 30, 30), Color.White); sb.Draw(Drawing.white, new Rectangle((int)v2.X + 50, (int)v2.Y + 250, 200, 30), Color.White); sb.DrawString(Drawing.font, "fueltype: " + p.fueltype, new Vector2(v2.X + 50, v2.Y + 250), Color.Black); } #endregion #region engine if (p.type == "engine") { sb.Draw(Drawing.white, new Rectangle((int)v2.X + 10, (int)v2.Y + 200, 280, 30), Color.White); sb.DrawString(Drawing.font, "ISP: " + p.isp + "S", new Vector2(v2.X + 50, v2.Y + 200), Color.Black); sb.Draw(Drawing.minusbutton, new Rectangle((int)v2.X + 10, (int)v2.Y + 250, 30, 30), Color.White); sb.Draw(Drawing.plusbutton, new Rectangle((int)v2.X + 260, (int)v2.Y + 250, 30, 30), Color.White); sb.Draw(Drawing.white, new Rectangle((int)v2.X + 50, (int)v2.Y + 250, 200, 30), Color.White); sb.DrawString(Drawing.font, "Fuel type: " + p.fueltype, new Vector2(v2.X + 50, v2.Y + 250), Color.Black); sb.Draw(Drawing.minusbutton, new Rectangle((int)v2.X + 10, (int)v2.Y + 300, 30, 30), Color.White); sb.Draw(Drawing.plusbutton, new Rectangle((int)v2.X + 260, (int)v2.Y + 300, 30, 30), Color.White); sb.Draw(Drawing.white, new Rectangle((int)v2.X + 50, (int)v2.Y + 300, 200, 30), Color.White); sb.DrawString(Drawing.font, "thrust: " + Drawing.getsiprefix(p.thrust) + "N", new Vector2(v2.X + 50, v2.Y + 300), Color.Black); } #endregion #region separator if (p.type == "separator") { } #endregion } } } #endregion #region stages if (Editor.stage != null & craftlist.Count != 0) { for (int s = 0; s < 10; s++) { if (Editor.stage[s] != null) { sb.Draw(Drawing.white, Editor.stagerec[s], Color.Red); sb.DrawString(Drawing.menufont, "S" + s.ToString(), new Vector2(Editor.stagerec[s].X + 5, Editor.stagerec[s].Y + (Editor.stagerec[s].Height / 2) - 20), Color.White); foreach (int i in Editor.stage[s]) { foreach (Part p in craftlist[0].partlist) { if (p.id == i) { if (p.id != Editor.stageonhand) { sb.Draw(Drawing.white, new Rectangle((int)Editor.stageiconpositionditictionary[i].X, (int)Editor.stageiconpositionditictionary[i].Y, 40, 40), Color.White); sb.Draw(Drawing.dictionary[p.type], new Rectangle((int)Editor.stageiconpositionditictionary[i].X, (int)Editor.stageiconpositionditictionary[i].Y, 40, 40), Color.White); } } } } } } if (Editor.stageonhand != 0) { foreach (Part p in craftlist[0].partlist) { if (p.id == Editor.stageonhand) { sb.Draw(Drawing.white, new Rectangle((int)Play.mousestate.X - 20, Play.mousestate.Y - 20, 40, 40), Color.White); sb.Draw(Drawing.dictionary[p.type], new Rectangle((int)Play.mousestate.X - 20, Play.mousestate.Y - 20, 40, 40), Color.White); } } } } #endregion #region deltavstats if (Editor.stage != null & craftlist.Count != 0 & true) { Craft c = new Craft(); int laststage = 10; c.partlist = new List <Part>(craftlist[0].partlist); foreach (Part p in c.partlist) { p.dontcalculatemymass = false; } float[] deltav = new float[10]; float[] twr = new float[10]; for (int s = 0; s < 10; s++) { if (Editor.stage[s] != null) { foreach (int i in Editor.stage[s]) { for (int j = 0; j < c.partlist.Count(); j++) { Part p = c.partlist[j]; if (c.partlist[j].id == i) { if (c.partlist[j].type == "separator") { //separator part List <Part> lista = new List <Part>(); List <int> used = new List <int>(); foreach (Part pa in c.partlist) { if (pa.id != p.parent) { foreach (int n in p.neibours) { if (n == pa.id) { lista.Add(pa); } } } } for (int k = 0; k < lista.Count(); k++) { bool partused = false; foreach (int l in used) { if (lista[k].id == l) { partused = true; } } if (!partused) { foreach (Part pa in c.partlist) { foreach (int n in lista[k].neibours) { if (n == pa.id) { lista.Add(pa); used.Add(pa.id); } } } } } foreach (Part pa in lista) { pa.dontcalculatemymass = true; } } } } } for (int i = 0; i < c.partlist.Count(); i++) { if (c.partlist[i].removeme) { c.partlist.Remove(c.partlist[i]); } } if (Editor.stage[s].Count == 0 & laststage == 10) { laststage = s; } foreach (int i in Editor.stage[s]) { for (int j = 0; j < c.partlist.Count(); j++) { if (c.partlist[j].id == i) { if (c.partlist[j].type == "engine") { //engine part foreach (int k in c.partlist[j].neibours) { for (int l = 0; l < c.partlist.Count(); l++) { if (c.partlist[l].id == k) { //neibour of the engine float mass = getmass(c); deltav[s] += (float)(Math.Log(mass / (mass - c.partlist[l].fuel)) * c.partlist[j].isp * 9.81f); //why ar u lying to me??? twr[s] = c.partlist[j].thrust / (mass * 9.81f); } } } } } } } } else { laststage = s; } } //explanations here int ssep = 50; sb.Draw(Drawing.white, new Rectangle(400, (int)Camera.screencenter.Y * 2 + 10 - (laststage + 1) * ssep, 600, (laststage + 2) * ssep), Color.Black); for (int i = 0; i < laststage; i++) { sb.Draw(Drawing.white, new Rectangle(400, (int)Camera.screencenter.Y * 2 - 50 - i * ssep, 90, ssep), Color.Gray); sb.DrawString(Drawing.font, deltav[i].ToString(), new Vector2(400, Camera.screencenter.Y * 2 - 50 - i * ssep), Color.White); sb.Draw(Drawing.white, new Rectangle(500, (int)Camera.screencenter.Y * 2 - 50 - i * ssep, 90, ssep), Color.Gray); sb.DrawString(Drawing.font, twr[i].ToString(), new Vector2(500, Camera.screencenter.Y * 2 - 50 - i * ssep), Color.White); } sb.DrawString(Drawing.font, "deltav", new Vector2(400, Camera.screencenter.Y * 2 + 10 - (laststage + 1) * ssep), Color.White); sb.DrawString(Drawing.font, "TWR", new Vector2(500, Camera.screencenter.Y * 2 + 10 - (laststage + 1) * ssep), Color.White); foreach (Part p in c.partlist) { p.dontcalculatemymass = false; } } sb.End(); #endregion sb.Begin(SpriteSortMode.Immediate, null, null, null, null, null, Camera.matrix(gd.Viewport)); Rectangle rec = new Rectangle((int)(((Play.mousestate.X - Camera.screencenter.X) / Camera.zoom) + Camera.pos.X), (int)(((Play.mousestate.Y - Camera.screencenter.Y) / Camera.zoom) + Camera.pos.Y), (int)Editor.handpart.size.X, (int)Editor.handpart.size.Y); if (Editor.handpart.type != "none") { sb.Draw(Drawing.dictionary[Editor.handpart.type], rec, Color.White); } if (craftlist.Count != 0) { #region drawparts foreach (Part p in craftlist[0].partlist) { sb.Draw(Drawing.dictionary[p.type], new Rectangle((int)p.pos.X * 1, (int)p.pos.Y, (int)p.size.X, (int)p.size.Y), Color.White); if (Editor.stageonhand != 0 & p.id == Editor.stageonhand || Editor.stageitemhovered != 0 & p.id == Editor.stageitemhovered) { Color c = Color.Green; c.A = 100; sb.Draw(Drawing.dictionary[p.type], new Rectangle((int)p.pos.X, (int)p.pos.Y, (int)p.size.X, (int)p.size.Y), c); } #region snap part if (Editor.handpart.type != "none") { //draw part that will snap Vector2 v2 = new Vector2(((Play.mousestate.X - Camera.screencenter.X) / Camera.zoom) + Camera.pos.X, (((Play.mousestate.Y - Camera.screencenter.Y) / Camera.zoom) + Camera.pos.Y)); //snap to bottom if (Play.isinside(v2, new Vector2(p.pos.X + (p.size.X / 2) - Editor.handpart.size.X / 2, (p.pos.Y + p.size.Y)), new Vector2(Editor.handpart.size.X, Editor.handpart.size.Y))) { sb.Draw(Drawing.dictionary[Editor.handpart.type], new Rectangle((int)(p.pos.X + (p.size.X / 2) - (Editor.handpart.size.X / 2)), (int)((p.pos.Y + p.size.Y)), (int)Editor.handpart.size.X, (int)Editor.handpart.size.Y), Color.White); } //snap to top if (Play.isinside(v2, new Vector2((p.pos.X + (p.size.X / 2) - (Editor.handpart.size.X / 2)), (p.pos.Y - Editor.handpart.size.Y)), new Vector2(Editor.handpart.size.X, Editor.handpart.size.Y))) { sb.Draw(Drawing.dictionary[Editor.handpart.type], new Rectangle((int)(p.pos.X + (p.size.X / 2) - (Editor.handpart.size.X / 2)), (int)(p.pos.Y - Editor.handpart.size.Y), (int)Editor.handpart.size.X, (int)Editor.handpart.size.Y), Color.White); } //snap to left if (Play.isinside(v2, new Vector2((p.pos.X - Editor.handpart.size.X), (p.pos.Y + (p.size.Y / 2) - (Editor.handpart.size.Y / 2))), new Vector2(Editor.handpart.size.X, Editor.handpart.size.Y))) { sb.Draw(Drawing.dictionary[Editor.handpart.type], new Rectangle((int)(p.pos.X - Editor.handpart.size.X), (int)(p.pos.Y + (p.size.Y / 2) - (Editor.handpart.size.Y / 2)), (int)Editor.handpart.size.X, (int)Editor.handpart.size.Y), Color.White); } //snap to right if (Play.isinside(v2, new Vector2((p.pos.X + p.size.X), (p.pos.Y + (p.size.Y / 2) - (Editor.handpart.size.Y / 2))), new Vector2(Editor.handpart.size.X, Editor.handpart.size.Y))) { sb.Draw(Drawing.dictionary[Editor.handpart.type], new Rectangle((int)(p.pos.X + p.size.X), (int)(p.pos.Y + (p.size.Y / 2) - (Editor.handpart.size.Y / 2)), (int)Editor.handpart.size.X, (int)Editor.handpart.size.Y), Color.White); } } } #endregion } sb.End(); #endregion }