Přidány základy uživatelského rozhraní a testovací textury. Aktualizovaná Monogame library pro podporu myši
This commit is contained in:
parent
4561e254d4
commit
b968b12090
9 changed files with 184 additions and 11 deletions
|
|
@ -14,7 +14,7 @@ public class CommandManager {
|
|||
private static InputListenerHook toggleCamHook = new(true);
|
||||
|
||||
public static void InitInputListeners() {
|
||||
Array.ForEach(keybinds, tuple => InputManager.AddListener(tuple.label, tuple.key, _ => tuple.action(), InputTiming.PRESS, toggleCamHook));
|
||||
Array.ForEach(keybinds, tuple => InputManager.AddListener(tuple.label, tuple.key, () => tuple.action(), InputTiming.PRESS, toggleCamHook));
|
||||
}
|
||||
|
||||
private static void ToggleCamera() {
|
||||
|
|
|
|||
|
|
@ -13,3 +13,18 @@
|
|||
|
||||
#---------------------------------- Content ---------------------------------#
|
||||
|
||||
#begin images/SpriteSheet_testBlocks.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:images/SpriteSheet_testBlocks.png
|
||||
|
||||
#begin images/testBlocks-definition.xml
|
||||
/copy:images/testBlocks-definition.xml
|
||||
|
||||
|
|
|
|||
BIN
FNAF_Clone/Content/images/SpriteSheet_testBlocks.png
Normal file
BIN
FNAF_Clone/Content/images/SpriteSheet_testBlocks.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
10
FNAF_Clone/Content/images/testBlocks-definition.xml
Executable file
10
FNAF_Clone/Content/images/testBlocks-definition.xml
Executable file
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextureAtlas count="4">
|
||||
<Texture>images/SpriteSheet_testBlocks</Texture>
|
||||
<Regions>
|
||||
<Region id = "0" name="R128" x="0" y="0" width="128" height="128"/>
|
||||
<Region id = "1" name="B128" x="128" y="0" width="128" height="128"/>
|
||||
<Region id = "2" name="R64" x="0" y="128" width="64" height="64"/>
|
||||
<Region id = "3" name="B64" x="64" y="128" width="64" height="64"/>
|
||||
</Regions>
|
||||
</TextureAtlas>
|
||||
91
FNAF_Clone/GUI/Screen.cs
Normal file
91
FNAF_Clone/GUI/Screen.cs
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
using System.Collections.Generic;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using MonoGameLibrary.Input;
|
||||
|
||||
namespace FNAF_Clone.GUI;
|
||||
|
||||
|
||||
public class Screen {
|
||||
|
||||
public static Dictionary<string, Screen> Screens = new();
|
||||
public static Screen CurrentScreen{ get; private set; }
|
||||
|
||||
public static void AddScreens((string id, Screen screen)[] screens) {
|
||||
foreach (var tuple in screens){
|
||||
Screens.Add(tuple.id, tuple.screen);
|
||||
}
|
||||
}
|
||||
public static void AddScreen(string id, Screen screen, bool activate = false) {
|
||||
Screens.Add(id, screen);
|
||||
if (activate) SetScreen(id);
|
||||
}
|
||||
|
||||
public static void SetScreen(string id) {
|
||||
CurrentScreen = Screens[id];
|
||||
CurrentScreen.Active = true;
|
||||
}
|
||||
|
||||
public static void RemoveScreen(string id) {
|
||||
Screens.Remove(id);
|
||||
}
|
||||
|
||||
public enum ScreenType {
|
||||
MAIN_MENU,
|
||||
OFFICE,
|
||||
CAMERAS
|
||||
}
|
||||
|
||||
|
||||
public ScreenType Type{ get; private set; }
|
||||
private Dictionary<string, UIElement> elements = new();
|
||||
public bool Active { get; private set; } = false;
|
||||
private InputListenerHook mouseInputHook = new(true);
|
||||
|
||||
public Screen(ScreenType type) {
|
||||
Type = type;
|
||||
InputManager.AddListener(InputManager.MouseButton.LEFT, () => ProcessMouseInput(InputManager.MouseState), InputTiming.PRESS, mouseInputHook);
|
||||
}
|
||||
|
||||
public Screen(ScreenType type, Dictionary<string, UIElement> elements) {
|
||||
this.elements = elements;
|
||||
Type = type;
|
||||
}
|
||||
|
||||
public void AddElement(string id, UIElement element) {
|
||||
elements.Add(id, element);
|
||||
}
|
||||
|
||||
public void SetActive(bool active) {
|
||||
Active = active;
|
||||
if (Active == active) return;
|
||||
foreach (var keyValuePair in elements){
|
||||
keyValuePair.Value.Active = Active;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void ProcessMouseInput(MouseState mouseState) {
|
||||
foreach (var element in elements.Values){
|
||||
if (!element.Pressable) continue;
|
||||
|
||||
if (element.IsWithinBounds(mouseState.Position)){
|
||||
element.OnMousePress(); // TODO: differentiate between press, hold and release events
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Update() {
|
||||
|
||||
|
||||
foreach (var keyValuePair in elements){
|
||||
keyValuePair.Value.Update();
|
||||
}
|
||||
}
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch) {
|
||||
foreach (var val in elements.Values){
|
||||
val.Draw(spriteBatch);
|
||||
}
|
||||
}
|
||||
}
|
||||
40
FNAF_Clone/GUI/UIElement.cs
Normal file
40
FNAF_Clone/GUI/UIElement.cs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
using System;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using MonoGameLibrary.Graphics;
|
||||
using MonoGameLibrary.Input;
|
||||
|
||||
namespace FNAF_Clone.GUI;
|
||||
|
||||
public class UIElement {
|
||||
public bool Active { get; set; } = false;
|
||||
public bool Pressable { get; set; } = false;
|
||||
|
||||
private (Point, Point) bounds; // TODO: Change this to support non-rectangular hitboxes
|
||||
private TextureRegion texture;
|
||||
|
||||
public UIElement(TextureRegion texture, Point position) {
|
||||
this.texture = texture;
|
||||
bounds = (position, position + new Point(texture.Width, texture.Height));
|
||||
}
|
||||
public void Update() {
|
||||
|
||||
}
|
||||
|
||||
public bool IsWithinBounds(Point pos) {
|
||||
return pos.X >= Math.Min(bounds.Item1.X, bounds.Item2.X) && pos.X <= Math.Max(bounds.Item1.X, bounds.Item2.X) &&
|
||||
pos.Y >= Math.Min(bounds.Item1.Y, bounds.Item2.Y) && pos.Y <= Math.Max(bounds.Item1.Y, bounds.Item2.Y);
|
||||
}
|
||||
|
||||
public Action OnMousePress{ get; set; }
|
||||
|
||||
// public virtual void OnMousePress() { }
|
||||
|
||||
public virtual void OnMouseRelease() { }
|
||||
|
||||
public virtual void OnMouseHold() { }
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch) {
|
||||
texture.Draw(spriteBatch, bounds.Item1.ToVector2(), Color.White);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,27 +1,41 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using System;
|
||||
using FNAF_Clone.GUI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using MonoGameLibrary;
|
||||
using MonoGameLibrary.Graphics;
|
||||
using MonoGameLibrary.Input;
|
||||
|
||||
namespace FNAF_Clone;
|
||||
|
||||
public class GameMain() : Core("fnafkooo", 1920, 1080, false) {
|
||||
private GraphicsDeviceManager _graphics;
|
||||
private SpriteBatch _spriteBatch;
|
||||
public class GameMain() : Core("fnafkooo", 640, 360, false) {
|
||||
// private GraphicsDeviceManager _graphics;
|
||||
// private SpriteBatch _spriteBatch;
|
||||
|
||||
private Screen officeScreen = new(Screen.ScreenType.OFFICE);
|
||||
|
||||
private TextureAtlas testAtlas;
|
||||
|
||||
protected override void Initialize() {
|
||||
Client.Connect("127.0.0.1", 9012);
|
||||
CommandManager.InitInputListeners();
|
||||
|
||||
InputManager.AddListener(InputManager.MouseButton.LEFT, (() => Console.WriteLine("LMB pressed at: " + InputManager.MouseState.Position)), InputTiming.PRESS, new InputListenerHook(true));
|
||||
|
||||
|
||||
base.Initialize();
|
||||
}
|
||||
|
||||
protected override void LoadContent() {
|
||||
_spriteBatch = new SpriteBatch(GraphicsDevice);
|
||||
|
||||
// spriteBatch = new SpriteBatch(GraphicsDevice);
|
||||
testAtlas = TextureAtlas.FromFile(content, "images/testBlocks-definition.xml");
|
||||
|
||||
// TODO: use this.Content to load your game content here
|
||||
Screen.AddScreen("office", officeScreen, true);
|
||||
officeScreen.AddElement("test",
|
||||
new UIElement(testAtlas[0], Point.Zero)
|
||||
{Pressable = true, OnMousePress = () => Console.WriteLine("Pressed!")}
|
||||
);
|
||||
}
|
||||
|
||||
protected override void Update(GameTime gameTime) {
|
||||
|
|
@ -39,9 +53,11 @@ public class GameMain() : Core("fnafkooo", 1920, 1080, false) {
|
|||
|
||||
protected override void Draw(GameTime gameTime) {
|
||||
GraphicsDevice.Clear(Color.CornflowerBlue);
|
||||
spriteBatch.Begin();
|
||||
|
||||
Screen.CurrentScreen.Draw(spriteBatch);
|
||||
|
||||
// TODO: Add your drawing code here
|
||||
|
||||
spriteBatch.End();
|
||||
base.Draw(gameTime);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue