Show terrain map behind field item view

Adds a transparency slider to have the field items fade so you can see the underlying terrain tile.

Not really optimized (allocates every time), but it should be fine for now.

Make the None item transparent, so that the entire map bleeds through (clear clarity).
This commit is contained in:
Kurt
2020-04-28 21:08:57 -07:00
parent 8808eadb20
commit 33b9e7f170
6 changed files with 80 additions and 9 deletions

View File

@@ -57,7 +57,7 @@ public static Color GetItemColor(FieldItem item)
{
var kind = ItemInfo.GetItemKind(item);
if (kind == ItemKind.Unknown)
return item.DisplayItemId == FieldItem.NONE ? Color.LimeGreen : Color.DarkGreen;
return item.DisplayItemId == FieldItem.NONE ? Color.Transparent : Color.DarkGreen;
return Colors[(int)kind];
}

View File

@@ -60,7 +60,7 @@ private static void LoadPixelsFromLayer(FieldItemLayer layer, int x0, int y0, in
}
// non-allocation image generator
public static Bitmap GetBitmapLayerAcre(FieldItemLayer layer, int x0, int y0, int scale, int[] acre1, int[] acreScale, Bitmap dest)
public static Bitmap GetBitmapLayerAcre(FieldItemLayer layer, int x0, int y0, int scale, int[] acre1, int[] acreScale, Bitmap dest, int transparency = -1)
{
var w = layer.GridWidth;
var h = layer.GridHeight;
@@ -69,6 +69,9 @@ public static Bitmap GetBitmapLayerAcre(FieldItemLayer layer, int x0, int y0, in
h *= scale;
ImageUtil.ScalePixelImage(acre1, acreScale, w, h, scale);
if (transparency >> 24 != 0xFF)
ImageUtil.SetAllTransparencyTo(acreScale, transparency);
// draw symbols over special items now?
DrawDirectionals(acreScale, layer, w, x0, y0, scale);
@@ -185,9 +188,11 @@ public static Bitmap GetBitmapLayer(FieldItemLayer layer, int x, int y, int scal
return DrawViewReticle(map, layer, x, y, scale);
}
public static Bitmap GetBitmapLayer(FieldItemLayer layer, int x, int y, int[] data, Bitmap dest)
public static Bitmap GetBitmapLayer(FieldItemLayer layer, int x, int y, int[] data, Bitmap dest, int transparency = -1)
{
LoadBitmapLayer(layer.Tiles, data, layer.MapWidth, layer.MapHeight);
if (transparency >> 24 != 0xFF)
ImageUtil.SetAllTransparencyTo(data, transparency);
ImageUtil.SetBitmapData(dest, data);
return DrawViewReticle(dest, layer, x, y);
}

View File

@@ -142,5 +142,23 @@ private static void GetBuildingCoordinate(MapGrid g, ushort bx, ushort by, int s
x = (int) (((bx / 2f) - buildingShift) * scale);
y = (int) (((by / 2f) - buildingShift) * scale);
}
public static Image GetAcre(in int topX, in int topY, TerrainManager terrain, int acreScale)
{
int[] data = new int[16 * 16];
int index = 0;
for (int y = 0; y < 16; y++)
{
var yi = y + topY;
for (int x = 0; x < 16; x++, index++)
{
var tile = terrain.GetTile(x + topX, yi);
data[index] = GetTileColor(tile).ToArgb();
}
}
var final = ImageUtil.ScalePixelImage(data, acreScale, 16, 16, out int fw, out int fh);
return ImageUtil.GetBitmap(final, fw, fh);
}
}
}

View File

@@ -108,5 +108,14 @@ public static void ScalePixelImage(int[] data, int[] scaled, int fW, int fH, int
Array.Copy(scaled, baseIndex, scaled, baseIndex + (y1 * fW), fW);
}
}
/// <summary>
/// Sets a bitwise and of the requested transparency; this is assuming the pixel value is 0xFF_xx_xx_xx. Single operation laziness!
/// </summary>
public static void SetAllTransparencyTo(int[] data, int trans)
{
for (int i = 0; i < data.Length; i++)
data[i] &= trans;
}
}
}

View File

@@ -65,12 +65,14 @@ private void InitializeComponent()
this.B_RemoveObjects = new System.Windows.Forms.Button();
this.GB_Remove = new System.Windows.Forms.GroupBox();
this.B_RemovePlacedItems = new System.Windows.Forms.Button();
this.TR_Transparency = new System.Windows.Forms.TrackBar();
this.CM_Click.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.PB_Map)).BeginInit();
this.CM_Picture.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.NUD_Layer)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PB_Acre)).BeginInit();
this.GB_Remove.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.TR_Transparency)).BeginInit();
this.SuspendLayout();
//
// B_Cancel
@@ -420,11 +422,23 @@ private void InitializeComponent()
this.B_RemovePlacedItems.UseVisualStyleBackColor = true;
this.B_RemovePlacedItems.Click += new System.EventHandler(this.B_RemovePlacedItems_Click);
//
// TR_Transparency
//
this.TR_Transparency.Location = new System.Drawing.Point(535, 250);
this.TR_Transparency.Maximum = 100;
this.TR_Transparency.Name = "TR_Transparency";
this.TR_Transparency.Size = new System.Drawing.Size(226, 45);
this.TR_Transparency.TabIndex = 36;
this.TR_Transparency.TickFrequency = 10;
this.TR_Transparency.Value = 90;
this.TR_Transparency.Scroll += new System.EventHandler(this.TR_Transparency_Scroll);
//
// FieldItemEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(981, 537);
this.Controls.Add(this.TR_Transparency);
this.Controls.Add(this.GB_Remove);
this.Controls.Add(this.PB_Acre);
this.Controls.Add(this.L_Layer);
@@ -458,6 +472,7 @@ private void InitializeComponent()
((System.ComponentModel.ISupportInitialize)(this.NUD_Layer)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PB_Acre)).EndInit();
this.GB_Remove.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.TR_Transparency)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -499,5 +514,6 @@ private void InitializeComponent()
private System.Windows.Forms.Button B_RemoveObjects;
private System.Windows.Forms.GroupBox GB_Remove;
private System.Windows.Forms.Button B_RemovePlacedItems;
private System.Windows.Forms.TrackBar TR_Transparency;
}
}

View File

@@ -24,6 +24,8 @@ public partial class FieldItemEditor : Form
private readonly int[] Map;
private readonly Bitmap MapReticle;
private readonly TerrainManager Terrain;
private int X;
private int Y;
@@ -43,6 +45,9 @@ public FieldItemEditor(MainSave sav)
Map = new int[l1.MapWidth * l1.MapHeight * MapScale * MapScale];
MapReticle = new Bitmap(l1.MapWidth * MapScale, l1.MapHeight * MapScale);
Terrain = new TerrainManager(sav.GetTerrain());
PB_Map.BackgroundImage = TerrainSprite.CreateMap(Terrain, 2);
foreach (var acre in MapGrid.Acres)
CB_Acre.Items.Add(acre.Name);
@@ -65,19 +70,29 @@ private void ChangeViewToAcre(int acre)
private void ReloadMap()
{
PB_Map.Image = FieldItemSpriteDrawer.GetBitmapLayer(Layer, X, Y, Map, MapReticle);
var transparency = TR_Transparency.Value / 100d;
var t = ((int)(0xFF * transparency) << 24) | 0x00FF_FFFF;
PB_Map.Image = FieldItemSpriteDrawer.GetBitmapLayer(Layer, X, Y, Map, MapReticle, t);
}
private void LoadGrid(int topX, int topY)
{
ReloadGrid(Layer, topX, topY);
ReloadBackground(topX, topY);
UpdateArrowVisibility();
ReloadMap();
}
private void ReloadBackground(int topX, int topY)
{
PB_Acre.BackgroundImage = TerrainSprite.GetAcre(topX/2, topY/2, Terrain, AcreScale * 2);
}
private void ReloadGrid(FieldItemLayer layer, int topX, int topY)
{
PB_Acre.Image = FieldItemSpriteDrawer.GetBitmapLayerAcre(layer, topX, topY, AcreScale, Scale1, ScaleX, ScaleAcre);
var transparency = TR_Transparency.Value / 100d;
var t = ((int) (0xFF * transparency) << 24) | 0x00FF_FFFF;
PB_Acre.Image = FieldItemSpriteDrawer.GetBitmapLayerAcre(layer, topX, topY, AcreScale, Scale1, ScaleX, ScaleAcre, t);
}
private void UpdateArrowVisibility()
@@ -179,7 +194,7 @@ private void B_Up_Click(object sender, EventArgs e)
if (ModifierKeys != Keys.Shift)
{
if (Y != 0)
LoadGrid(X, --Y);
LoadGrid(X, Y -= 2);
return;
}
@@ -191,7 +206,7 @@ private void B_Left_Click(object sender, EventArgs e)
if (ModifierKeys != Keys.Shift)
{
if (X != 0)
LoadGrid(--X, Y);
LoadGrid(X -= 2, Y);
return;
}
@@ -202,8 +217,8 @@ private void B_Right_Click(object sender, EventArgs e)
{
if (ModifierKeys != Keys.Shift)
{
if (X != Layer.MapWidth - 1)
LoadGrid(++X, Y);
if (X != Layer.MapWidth - 2)
LoadGrid(X += 2, Y);
return;
}
@@ -340,6 +355,8 @@ private void ClickMapAt(MouseEventArgs e, bool skipLagCheck)
int mY = e.Y;
bool centerReticle = CHK_SnapToAcre.Checked;
GetViewAnchorCoordinates(mX, mY, out var x, out var y, centerReticle);
x &= 0xFFFE;
y &= 0xFFFE;
var acre = layer.GetAcre(x, y);
bool sameAcre = AcreIndex == acre;
@@ -431,5 +448,11 @@ private void Remove(Control sender, Func<int, int, int, int, int> removal)
private void B_RemovePlacedItems_Click(object sender, EventArgs e) => Remove(B_RemovePlacedItems, Layer.RemoveAllPlacedItems);
private void PG_Tile_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) => PG_Tile.SelectedObject = PG_Tile.SelectedObject;
private void TR_Transparency_Scroll(object sender, EventArgs e)
{
ReloadGrid(Layer, X, Y);
ReloadMap();
}
}
}