Archived
1
0
This repository has been archived on 2025-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
cs-vampi/Output_GUI.cs

162 lines
7.7 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Output_GUI.cs created with MonoDevelop at 6:00 PM 1/29/2009
// @author mbirth
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace vampi {
public class Output_GUI : Output {
const int statsHeight = 45;
int scale = 1;
Form f;
FastPixel fp;
Graphics fg;
Bitmap field;
Bitmap stats;
public Output_GUI() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
this.f = new Form();
this.field = new Bitmap(Settings.size, Settings.size, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
this.stats = new Bitmap(f.ClientSize.Width, Output_GUI.statsHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
f.Text = "Vampi GUI --- ©2008 Markus Birth, FA76";
// attach some events
f.Closing += new System.ComponentModel.CancelEventHandler(FormClosing); // fires when "X" clicked
f.Resize += new EventHandler(FormResize); // fires while resizing
f.ResizeEnd += new EventHandler(FormResize); // fires after finish resizing or moving window
// clear gameField with emptyColor
Graphics g = Graphics.FromImage(this.field);
g.Clear(Settings.guiColorEmpty);
g.Dispose();
if (Math.Min(f.ClientSize.Width, f.ClientSize.Height-Output_GUI.statsHeight) < Settings.size) {
f.ClientSize = new Size(Settings.size, Settings.size+Output_GUI.statsHeight);
}
fp = new FastPixel(field);
fg = Graphics.FromHwnd(f.Handle);
fg.InterpolationMode = InterpolationMode.NearestNeighbor;
fg.Clear(Color.White); // clear window background
f.Show();
calculateScale();
}
~Output_GUI() {
fg.Dispose();
f.Dispose();
}
public void FormClosing(object sender, System.ComponentModel.CancelEventArgs e) {
requestAbort = true;
f.Hide();
}
public void calculateScale() {
scale = (int)Math.Floor((double)Math.Min(f.ClientSize.Height - Output_GUI.statsHeight, f.ClientSize.Width) / (double)Settings.size);
if (scale<1) scale = 1;
}
public void FormResize(object sender, EventArgs e) {
calculateScale();
stats = new Bitmap(f.ClientSize.Width, Output_GUI.statsHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
fg = Graphics.FromHwnd(f.Handle);
fg.InterpolationMode = InterpolationMode.NearestNeighbor;
fg.Clear(Color.White);
}
public override void doOutput() {
this.drawGameMap();
this.drawStatistics();
Application.DoEvents();
}
protected Color getGradient(Color[] gradientMap, double percent) {
int mapSteps = gradientMap.GetLength(0)-1;
double percSteps = 100/(double)mapSteps;
int bestMatch = (int)(percent/percSteps);
if (percent/percSteps == Math.Floor(percent/percSteps)) return gradientMap[bestMatch]; // shortcut
int curStep = (int)Math.Floor(percent/percSteps);
if (curStep == gradientMap.GetLength(0)-1) curStep--;
Color left = gradientMap[curStep];
double leftPerc = curStep*percSteps;
Color right = gradientMap[curStep+1];
double rightPerc = (curStep+1)*percSteps;
percent = (percent-leftPerc) * (100/(rightPerc-leftPerc));
Color final = Color.FromArgb(getPercentage(left.R, right.R, percent), getPercentage(left.G, right.G, percent), getPercentage(left.B, right.B, percent));
return final;
}
protected Color getGradient(Color fixedColor, double percent) {
return fixedColor;
}
protected byte getPercentage(byte col1, byte col2, double percent) {
return (byte)(col1 + (col2-col1)*percent/100);
}
public void drawGameMap() {
fp.Lock();
Position pos;
Color c = Color.Black;
for (pos.y = 1; pos.y <= Settings.size; pos.y++) {
for (pos.x = 1; pos.x <= Settings.size; pos.x++) {
Spielfigur sf = Program.sflaeche.getSpielfeld(pos).Sfigur;
if (sf == null) c = Settings.guiColorEmpty; //Spielfeld leer
else { //Spielfeld besetzt
switch (sf.Typ) {
case Spielfigur.TYPE_HUMAN:
if (((Einwohner)sf).Infected)
c = getGradient(Settings.guiColorHumanInfected, 100-(double)(sf.Age-Settings.humanMaxAge+Settings.humanInfectedMaxAge)*100/(double)Settings.humanInfectedMaxAge);
else
if (sf.props[Einwohner.F_SEX] == Einwohner.SEX_MALE)
c = getGradient(Settings.guiColorHumanMale, 100-(double)sf.Age*100/(double)Settings.humanMaxAge);
else
c = getGradient(Settings.guiColorHumanFemale, 100-(double)sf.Age*100/(double)Settings.humanMaxAge);
break;
case Spielfigur.TYPE_VAMPIRE:
c = getGradient(Settings.guiColorVampire, 100-(double)sf.Age*100/(double)Settings.vampireMaxAge);
break;
}
}
fp.SetPixel(pos.x-1, pos.y-1, c);
}
}
fp.Unlock(true);
fg.DrawImage(this.field, 0, Output_GUI.statsHeight, Settings.size * this.scale, Settings.size * this.scale);
f.Update();
}
public void drawStatistics() {
if (!f.Visible) this.requestAbort = true;
Graphics g = Graphics.FromImage(this.stats);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
g.Clear(Color.White);
int lineSpc = 10;
int Ecount = Einwohner.Count; // sflaeche.countTypeOccurrences(Typliste.EINWOHNER);
int Vcount = Vampir.Count; // sflaeche.countTypeOccurrences(Typliste.VAMPIR);
g.DrawString(String.Format("Step: {0:D5}", Program.AnzSimDone), Settings.guiFont, Settings.guiFontBrush, 5, 0);
g.DrawString(String.Format("T{0:N} = {1:D}/sec", Program.lastOverallTime, (int)Math.Floor(1000/(Program.lastOverallTime))), Settings.guiFont, Settings.guiFontBrush, 100, 0);
g.DrawString(String.Format("C{0:N} D{1:N}", Program.lastCalcTime, Program.lastStatsTime), Settings.guiFont, Settings.guiFontBrush, 200, 0);
g.DrawString(String.Format(String.Format("Humans: {0:D} / Vampires: {1:D}", Ecount, Vcount), Program.AnzSimDone), Settings.guiFont, Settings.guiFontBrush, 5, 1*lineSpc);
g.DrawString(String.Format(String.Format("V/H Ratio = 1/{0:N5}", (double)Ecount / Vcount), Program.AnzSimDone), Settings.guiFont, Settings.guiFontBrush, 5, 2*lineSpc);
g.DrawString(String.Format(String.Format("Coverage: {0:N5} %", (double)(Ecount + Vcount) / (Settings.size*Settings.size) * 100), Program.AnzSimDone), Settings.guiFont, Settings.guiFontBrush, 5, 3*lineSpc);
g.Dispose();
g = Graphics.FromHwnd(f.Handle);
g.DrawImageUnscaled(this.stats, 0, 0);
g.Dispose();
}
}
}