mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-26 06:28:35 +01:00
renamed examples to demos and added an auto tiling demo
This commit is contained in:
parent
5d2f77e95c
commit
75deef068a
10 changed files with 145 additions and 14 deletions
74
Demos/AutoTilingDemo.cs
Normal file
74
Demos/AutoTilingDemo.cs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using MLEM.Misc;
|
||||||
|
using MLEM.Startup;
|
||||||
|
|
||||||
|
namespace Demos {
|
||||||
|
/// <summary>
|
||||||
|
/// This is a demo for <see cref="AutoTiling"/>.
|
||||||
|
/// </summary>
|
||||||
|
public class AutoTilingDemo : MlemGame {
|
||||||
|
|
||||||
|
private Texture2D texture;
|
||||||
|
private string[] layout;
|
||||||
|
|
||||||
|
protected override void LoadContent() {
|
||||||
|
base.LoadContent();
|
||||||
|
// The layout of the texture is important for auto tiling to work correctly.
|
||||||
|
// It needs to be laid out as follows: Five tiles aligned horizontally within the texture file, with the following information
|
||||||
|
// 1. The texture used for filling big areas
|
||||||
|
// 2. The texture used for straight, horizontal borders, with the borders facing away from the center
|
||||||
|
// 3. The texture used for outer corners, with the corners facing away from the center
|
||||||
|
// 4. The texture used for straight, vertical borders, with the borders facing away from the center
|
||||||
|
// 5. The texture used for inner corners, with the corners facing away from the center
|
||||||
|
// Note that the AutoTiling.png texture contains an example of this layout
|
||||||
|
this.texture = LoadContent<Texture2D>("Textures/AutoTiling");
|
||||||
|
|
||||||
|
// in this example, a simple string array is used for layout purposes. As the AutoTiling method allows any kind of
|
||||||
|
// comparison, the actual implementation can vary (for instance, based on a more in-depth tile map)
|
||||||
|
this.layout = new[] {
|
||||||
|
"XXX X",
|
||||||
|
"XXXXX",
|
||||||
|
"XX ",
|
||||||
|
"XXXX ",
|
||||||
|
" X "
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Draw(GameTime gameTime) {
|
||||||
|
this.GraphicsDevice.Clear(Color.Black);
|
||||||
|
|
||||||
|
// the texture region supplied to the AutoTiling method should only encompass the first filler tile's location and size
|
||||||
|
const int tileSize = 8;
|
||||||
|
var region = new Rectangle(0, 0, tileSize, tileSize);
|
||||||
|
|
||||||
|
// drawing the auto tiles
|
||||||
|
this.SpriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, transformMatrix: Matrix.CreateScale(10));
|
||||||
|
for (var x = 0; x < 5; x++) {
|
||||||
|
for (var y = 0; y < 5; y++) {
|
||||||
|
// don't draw non-grass tiles ( )
|
||||||
|
if (this.layout[y][x] != 'X')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var x1 = x;
|
||||||
|
var y1 = y;
|
||||||
|
// the connectsTo function determines for any given tile if it should connect to, that is, auto-tile with the
|
||||||
|
// neighbor in the supplied offset direction. In this example, the layout determines where grass tiles are (X)
|
||||||
|
// and where there are none ( ).
|
||||||
|
AutoTiling.ConnectsTo connectsTo = (xOff, yOff) => {
|
||||||
|
// don't auto-tile out of bounds
|
||||||
|
if (x1 + xOff < 0 || y1 + yOff < 0 || x1 + xOff >= 5 || y1 + yOff >= 5)
|
||||||
|
return false;
|
||||||
|
// check if the neighboring tile is also grass (X)
|
||||||
|
return this.layout[y1 + yOff][x1 + xOff] == 'X';
|
||||||
|
};
|
||||||
|
AutoTiling.DrawAutoTile(this.SpriteBatch, new Vector2(x, y) * tileSize, this.texture, region, connectsTo, Color.White);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.SpriteBatch.End();
|
||||||
|
|
||||||
|
base.Draw(gameTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,18 @@
|
||||||
/processorParam:TextureFormat=Compressed
|
/processorParam:TextureFormat=Compressed
|
||||||
/build:Fonts/TestFont.spritefont
|
/build:Fonts/TestFont.spritefont
|
||||||
|
|
||||||
|
#begin Textures/AutoTiling.png
|
||||||
|
/importer:TextureImporter
|
||||||
|
/processor:TextureProcessor
|
||||||
|
/processorParam:ColorKeyColor=255,0,255,255
|
||||||
|
/processorParam:ColorKeyEnabled=True
|
||||||
|
/processorParam:GenerateMipmaps=False
|
||||||
|
/processorParam:PremultiplyAlpha=True
|
||||||
|
/processorParam:ResizeToPowerOfTwo=False
|
||||||
|
/processorParam:MakeSquare=False
|
||||||
|
/processorParam:TextureFormat=Color
|
||||||
|
/build:Textures/AutoTiling.png
|
||||||
|
|
||||||
#begin Textures/Test.png
|
#begin Textures/Test.png
|
||||||
/importer:TextureImporter
|
/importer:TextureImporter
|
||||||
/processor:TextureProcessor
|
/processor:TextureProcessor
|
BIN
Demos/Content/Textures/AutoTiling.png
Normal file
BIN
Demos/Content/Textures/AutoTiling.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 896 B After Width: | Height: | Size: 896 B |
39
Demos/Program.cs
Normal file
39
Demos/Program.cs
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
|
namespace Demos {
|
||||||
|
public static class Program {
|
||||||
|
|
||||||
|
private static readonly Dictionary<string, Func<Game>> Demos = new Dictionary<string, Func<Game>>();
|
||||||
|
|
||||||
|
static Program() {
|
||||||
|
Demos.Add("Ui", () => new UiDemo());
|
||||||
|
Demos.Add("AutoTiling", () => new AutoTilingDemo());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Main(string[] args) {
|
||||||
|
Func<Game> demoUsed;
|
||||||
|
if (args.Length <= 0 || !Demos.ContainsKey(args[0])) {
|
||||||
|
beforeDemo:
|
||||||
|
Console.WriteLine("Please type the name of the demo you want to see and press Enter.");
|
||||||
|
Console.WriteLine("The following demos are available: " + string.Join(", ", Demos.Keys));
|
||||||
|
Console.WriteLine("(Alternatively, you can supply the name of the demo you want to see as the first argument)");
|
||||||
|
var demo = Console.ReadLine();
|
||||||
|
if (!Demos.ContainsKey(demo)) {
|
||||||
|
Console.WriteLine("Not a valid demo.");
|
||||||
|
goto beforeDemo;
|
||||||
|
} else {
|
||||||
|
demoUsed = Demos[demo];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
demoUsed = Demos[args[0]];
|
||||||
|
}
|
||||||
|
|
||||||
|
using (var game = demoUsed.Invoke())
|
||||||
|
game.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,13 +11,20 @@ using MLEM.Ui;
|
||||||
using MLEM.Ui.Elements;
|
using MLEM.Ui.Elements;
|
||||||
using MLEM.Ui.Style;
|
using MLEM.Ui.Style;
|
||||||
|
|
||||||
namespace Examples {
|
namespace Demos {
|
||||||
public class GameImpl : MlemGame {
|
/// <remarks>
|
||||||
|
/// NOTE: This ui demo derives from <see cref="MlemGame"/>. To use MLEM.Ui, it's not required to use MLEM.Startup (which MlemGame is a part of).
|
||||||
|
/// If using your own game class that derives from <see cref="Game"/>, however, you will have to do a few additional things to get MLEM.Ui up and running:
|
||||||
|
/// - Create an instance of <see cref="UiSystem"/>
|
||||||
|
/// - Call the instance's Update method in your game's Update method
|
||||||
|
/// - Call the instance's Draw method in your game's Draw method
|
||||||
|
/// </remarks>
|
||||||
|
public class UiDemo : MlemGame {
|
||||||
|
|
||||||
private Texture2D testTexture;
|
private Texture2D testTexture;
|
||||||
private NinePatch testPatch;
|
private NinePatch testPatch;
|
||||||
|
|
||||||
public GameImpl() {
|
public UiDemo() {
|
||||||
this.IsMouseVisible = true;
|
this.IsMouseVisible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +33,11 @@ namespace Examples {
|
||||||
this.testPatch = new NinePatch(new TextureRegion(this.testTexture, 0, 8, 24, 24), 8);
|
this.testPatch = new NinePatch(new TextureRegion(this.testTexture, 0, 8, 24, 24), 8);
|
||||||
base.LoadContent();
|
base.LoadContent();
|
||||||
|
|
||||||
|
// create a new style
|
||||||
|
// this one derives form UntexturedStyle so that stuff like the hover colors don't have to be set again
|
||||||
var style = new UntexturedStyle(this.SpriteBatch) {
|
var style = new UntexturedStyle(this.SpriteBatch) {
|
||||||
|
// when using a SpriteFont, use GenericSpriteFont. When using a MonoGame.Extended BitmapFont, use GenericBitmapFont.
|
||||||
|
// Wrapping fonts like this allows for both types to be usable within MLEM.Ui easily
|
||||||
Font = new GenericSpriteFont(LoadContent<SpriteFont>("Fonts/TestFont")),
|
Font = new GenericSpriteFont(LoadContent<SpriteFont>("Fonts/TestFont")),
|
||||||
TextScale = 0.1F,
|
TextScale = 0.1F,
|
||||||
PanelTexture = this.testPatch,
|
PanelTexture = this.testPatch,
|
||||||
|
@ -40,9 +51,12 @@ namespace Examples {
|
||||||
RadioCheckmark = new TextureRegion(this.testTexture, 32, 0, 8, 8)
|
RadioCheckmark = new TextureRegion(this.testTexture, 32, 0, 8, 8)
|
||||||
};
|
};
|
||||||
var untexturedStyle = this.UiSystem.Style;
|
var untexturedStyle = this.UiSystem.Style;
|
||||||
|
// set the defined style as the current one
|
||||||
this.UiSystem.Style = style;
|
this.UiSystem.Style = style;
|
||||||
|
// scale every ui up by 5
|
||||||
this.UiSystem.GlobalScale = 5;
|
this.UiSystem.GlobalScale = 5;
|
||||||
|
|
||||||
|
// create the root panel that all the other components sit on and add it to the ui system
|
||||||
var root = new Panel(Anchor.Center, new Vector2(80, 100), Vector2.Zero, false, true, new Point(5, 10));
|
var root = new Panel(Anchor.Center, new Vector2(80, 100), Vector2.Zero, false, true, new Point(5, 10));
|
||||||
this.UiSystem.Add("Test", root);
|
this.UiSystem.Add("Test", root);
|
||||||
|
|
||||||
|
@ -62,6 +76,8 @@ namespace Examples {
|
||||||
this.UiSystem.Style = this.UiSystem.Style == untexturedStyle ? style : untexturedStyle;
|
this.UiSystem.Style = this.UiSystem.Style == untexturedStyle ? style : untexturedStyle;
|
||||||
},
|
},
|
||||||
PositionOffset = new Vector2(0, 1),
|
PositionOffset = new Vector2(0, 1),
|
||||||
|
// set HasCustomStyle to true before changing style information so that, when changing the style globally
|
||||||
|
// (like above), these custom values don't get undone
|
||||||
HasCustomStyle = true,
|
HasCustomStyle = true,
|
||||||
Texture = this.testPatch,
|
Texture = this.testPatch,
|
||||||
HoveredColor = Color.LightGray
|
HoveredColor = Color.LightGray
|
|
@ -1,10 +0,0 @@
|
||||||
namespace Examples {
|
|
||||||
public static class Program {
|
|
||||||
|
|
||||||
public static void Main() {
|
|
||||||
using (var game = new GameImpl())
|
|
||||||
game.Run();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
2
MLEM.sln
2
MLEM.sln
|
@ -6,7 +6,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLEM.Extended", "MLEM.Exten
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLEM.Startup", "MLEM.Startup\MLEM.Startup.csproj", "{997F4739-7BEC-4621-B9CA-68DEB2D74412}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLEM.Startup", "MLEM.Startup\MLEM.Startup.csproj", "{997F4739-7BEC-4621-B9CA-68DEB2D74412}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples", "Examples\Examples.csproj", "{1BC4682B-AA14-4937-B5C7-707E20FE88FF}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demos", "Demos\Demos.csproj", "{1BC4682B-AA14-4937-B5C7-707E20FE88FF}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLEM.Ui", "MLEM.Ui\MLEM.Ui.csproj", "{6F00629A-8B87-4264-8896-19983285E32F}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLEM.Ui", "MLEM.Ui\MLEM.Ui.csproj", "{6F00629A-8B87-4264-8896-19983285E32F}"
|
||||||
EndProject
|
EndProject
|
||||||
|
|
Loading…
Reference in a new issue