mirror of
				https://github.com/MaddyThorson/StrawberryBF.git
				synced 2025-11-04 01:41:33 +08:00 
			
		
		
		
	Restructuring - added modules
This commit is contained in:
		@ -10,7 +10,7 @@ namespace Strawberry
 | 
			
		||||
		static public Dictionary<String, Sprite> Sprites { get; private set; }
 | 
			
		||||
 | 
			
		||||
		#if DEBUG
 | 
			
		||||
		static public readonly String Root = "../../../src/assets/";
 | 
			
		||||
		static public readonly String Root = "src/assets/";
 | 
			
		||||
		#else
 | 
			
		||||
		static public readonly String Root = "assets/";
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
@ -5,17 +5,18 @@ namespace Strawberry
 | 
			
		||||
{
 | 
			
		||||
	static public class Input
 | 
			
		||||
	{
 | 
			
		||||
		
 | 
			
		||||
		public const int GamepadLimit = 4;
 | 
			
		||||
 | 
			
		||||
		static private bool[] previousKeyboard;
 | 
			
		||||
		static private float[] lastKeypressTimes;
 | 
			
		||||
		
 | 
			
		||||
		static private void Init()
 | 
			
		||||
		static private void Startup()
 | 
			
		||||
		{
 | 
			
		||||
			previousKeyboard = new bool[Keys.Count];
 | 
			
		||||
			lastKeypressTimes = new float[Keys.Count];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		static private void Dispose()
 | 
			
		||||
		static private void Shutdown()
 | 
			
		||||
		{
 | 
			
		||||
			delete previousKeyboard;
 | 
			
		||||
			delete lastKeypressTimes;
 | 
			
		||||
 | 
			
		||||
@ -396,7 +396,15 @@ namespace Strawberry
 | 
			
		||||
		static public JSON FromFile(String filePath)
 | 
			
		||||
		{
 | 
			
		||||
			FileStream stream = scope FileStream();
 | 
			
		||||
			stream.Open(filePath, .Read);
 | 
			
		||||
 | 
			
		||||
			let str = scope String();
 | 
			
		||||
			Directory.GetCurrentDirectory(str);
 | 
			
		||||
			Calc.Log(str);
 | 
			
		||||
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
			if (stream.Open(filePath, .Read) case .Err)
 | 
			
		||||
				Runtime.FatalError("Unable to open FileStream");
 | 
			
		||||
			let json = FromStream(stream);
 | 
			
		||||
			stream.Close();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								src/Modules/Editor.bf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/Modules/Editor.bf
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
namespace Strawberry
 | 
			
		||||
{
 | 
			
		||||
	public abstract class Editor : Module
 | 
			
		||||
	{
 | 
			
		||||
		public this(PlatformLayer platformLayer)
 | 
			
		||||
			: base(platformLayer)
 | 
			
		||||
		{
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected override void Update()
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected override void Render()
 | 
			
		||||
		{
 | 
			
		||||
			PlatformLayer.EditorRenderBegin();
 | 
			
		||||
			UI();
 | 
			
		||||
			PlatformLayer.EditorRenderEnd();
 | 
			
		||||
			PlatformLayer.RenderEnd();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected abstract void UI();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -14,53 +14,29 @@ namespace Strawberry
 | 
			
		||||
		static public Game Game;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public abstract class Game
 | 
			
		||||
	public abstract class Game : Module
 | 
			
		||||
	{
 | 
			
		||||
		public readonly List<VirtualInput> VirtualInputs;
 | 
			
		||||
		public readonly String Title;
 | 
			
		||||
		public readonly int Width;
 | 
			
		||||
		public readonly int Height;
 | 
			
		||||
		public readonly int WindowScale;
 | 
			
		||||
		public readonly int GamepadLimit;
 | 
			
		||||
		
 | 
			
		||||
		private Scene scene;
 | 
			
		||||
		private Scene switchToScene;
 | 
			
		||||
		private bool updating;
 | 
			
		||||
 | 
			
		||||
		public PlatformLayer PlatformLayer { get; private set; }
 | 
			
		||||
		public Batcher Batcher { get; private set; }
 | 
			
		||||
		public Color ClearColor = .Black;
 | 
			
		||||
		public bool DebugOverlay = false;
 | 
			
		||||
 | 
			
		||||
		private bool* keyboardState;
 | 
			
		||||
		private int32 updateCounter;
 | 
			
		||||
		private float msCounter;
 | 
			
		||||
 | 
			
		||||
		public this(PlatformLayer platformLayer, String windowTitle, int32 width, int32 height, int32 windowScale, int gamepadLimit)
 | 
			
		||||
			: base()
 | 
			
		||||
		public this(PlatformLayer platformLayer)
 | 
			
		||||
			: base(platformLayer)
 | 
			
		||||
		{
 | 
			
		||||
			Game = this;
 | 
			
		||||
			PlatformLayer = platformLayer;
 | 
			
		||||
 | 
			
		||||
			Title = windowTitle;
 | 
			
		||||
			Width = width;
 | 
			
		||||
			Height = height;
 | 
			
		||||
			WindowScale = windowScale;
 | 
			
		||||
			GamepadLimit = gamepadLimit;
 | 
			
		||||
 | 
			
		||||
			String exePath = scope .();
 | 
			
		||||
			Environment.GetExecutableFilePath(exePath);
 | 
			
		||||
			String exeDir = scope .();
 | 
			
		||||
			Path.GetDirectoryPath(exePath, exeDir);
 | 
			
		||||
			Directory.SetCurrentDirectory(exeDir);
 | 
			
		||||
 | 
			
		||||
			platformLayer.UpdateScreenMatrix();
 | 
			
		||||
			platformLayer.Init();
 | 
			
		||||
			Batcher = platformLayer.CreateBatcher();
 | 
			
		||||
 | 
			
		||||
			VirtualInputs = new List<VirtualInput>();
 | 
			
		||||
			Input.[Friend]Init();
 | 
			
		||||
 | 
			
		||||
			Tracker.[Friend]BuildAssignmentLists();
 | 
			
		||||
			Assets.LoadAll();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -82,50 +58,12 @@ namespace Strawberry
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Assets.DisposeAll();
 | 
			
		||||
			Input.[Friend]Dispose();
 | 
			
		||||
 | 
			
		||||
			delete Batcher;
 | 
			
		||||
 | 
			
		||||
			Game = null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void Run()
 | 
			
		||||
		{
 | 
			
		||||
			float msCounter = 0;
 | 
			
		||||
			uint32 prevTick = 0;
 | 
			
		||||
			while (true)
 | 
			
		||||
			{
 | 
			
		||||
				if (PlatformLayer.Closed())
 | 
			
		||||
					return;
 | 
			
		||||
 | 
			
		||||
				uint32 tick = PlatformLayer.Ticks;
 | 
			
		||||
				msCounter += (tick - prevTick);
 | 
			
		||||
 | 
			
		||||
				if (Time.FixedTimestep)
 | 
			
		||||
				{
 | 
			
		||||
					Time.RawDelta = Time.TargetDeltaTime;
 | 
			
		||||
					while (msCounter >= Time.TargetMilliseconds)
 | 
			
		||||
					{
 | 
			
		||||
						msCounter -= Time.TargetMilliseconds;
 | 
			
		||||
						PlatformLayer.UpdateInput();
 | 
			
		||||
						Update();
 | 
			
		||||
						Input.AfterUpdate();
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					Time.RawDelta = (tick - prevTick) / 1000f;
 | 
			
		||||
					PlatformLayer.UpdateInput();
 | 
			
		||||
					Update();
 | 
			
		||||
					Input.AfterUpdate();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				Render();
 | 
			
		||||
				prevTick = tick;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public virtual void Update()
 | 
			
		||||
		protected override void Update()
 | 
			
		||||
		{
 | 
			
		||||
			//Input
 | 
			
		||||
			for (var i in VirtualInputs)
 | 
			
		||||
@ -159,7 +97,7 @@ namespace Strawberry
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private void Render()
 | 
			
		||||
		protected override void Render()
 | 
			
		||||
		{
 | 
			
		||||
			PlatformLayer.GameRenderBegin();
 | 
			
		||||
			Draw();
 | 
			
		||||
@ -200,5 +138,10 @@ namespace Strawberry
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public virtual Editor CreateEditor()
 | 
			
		||||
		{
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										69
									
								
								src/Modules/Module.bf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/Modules/Module.bf
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
			
		||||
namespace Strawberry
 | 
			
		||||
{
 | 
			
		||||
	public abstract class Module
 | 
			
		||||
	{
 | 
			
		||||
		public enum RunResults { Quit, Swap }
 | 
			
		||||
 | 
			
		||||
		public PlatformLayer PlatformLayer { get; private set; }
 | 
			
		||||
 | 
			
		||||
		private float msCounter;
 | 
			
		||||
		private uint32 prevTicks;
 | 
			
		||||
 | 
			
		||||
		public this(PlatformLayer platformLayer)
 | 
			
		||||
		{
 | 
			
		||||
			PlatformLayer = platformLayer;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public Module Run()
 | 
			
		||||
		{
 | 
			
		||||
			while (true)
 | 
			
		||||
			{
 | 
			
		||||
				let tick = PlatformLayer.Ticks;
 | 
			
		||||
				msCounter += tick - prevTicks;
 | 
			
		||||
 | 
			
		||||
				// update
 | 
			
		||||
				if (Time.FixedTimestep)
 | 
			
		||||
				{
 | 
			
		||||
					Time.RawDelta = Time.TargetDeltaTime;
 | 
			
		||||
					while (msCounter >= Time.TargetMilliseconds)
 | 
			
		||||
					{
 | 
			
		||||
						msCounter -= Time.TargetMilliseconds;
 | 
			
		||||
						PlatformLayer.UpdateInput();
 | 
			
		||||
						Update();
 | 
			
		||||
						Input.AfterUpdate();
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					Time.RawDelta = (tick - prevTicks) / 1000f;
 | 
			
		||||
					PlatformLayer.UpdateInput();
 | 
			
		||||
					Update();
 | 
			
		||||
					Input.AfterUpdate();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// render
 | 
			
		||||
				Render();
 | 
			
		||||
 | 
			
		||||
				// exit or swap to another module
 | 
			
		||||
				if (PlatformLayer.Closed())
 | 
			
		||||
					return null;
 | 
			
		||||
				else if (Input.KeyPressed(.F1))
 | 
			
		||||
				{
 | 
			
		||||
					let swapTo = CreateSwapModule();
 | 
			
		||||
					if (swapTo != null)
 | 
			
		||||
						return swapTo;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				prevTicks = tick;
 | 
			
		||||
			}	
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected abstract void Update();
 | 
			
		||||
		protected abstract void Render();
 | 
			
		||||
 | 
			
		||||
		public virtual Module CreateSwapModule()
 | 
			
		||||
		{
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -3,16 +3,28 @@ namespace Strawberry
 | 
			
		||||
{
 | 
			
		||||
	public abstract class PlatformLayer
 | 
			
		||||
	{
 | 
			
		||||
		public readonly String Title;
 | 
			
		||||
		public readonly int ScreenWidth;
 | 
			
		||||
		public readonly int ScreenHeight;
 | 
			
		||||
		public readonly int WindowScale;
 | 
			
		||||
 | 
			
		||||
		public Mat4x4 ScreenMatrix { get; private set; }
 | 
			
		||||
 | 
			
		||||
		public this(String title, int screenWidth, int screenHeight, int windowScale)
 | 
			
		||||
		{
 | 
			
		||||
			Title = title;
 | 
			
		||||
			ScreenWidth = screenWidth;
 | 
			
		||||
			ScreenHeight = screenHeight;
 | 
			
		||||
			WindowScale = windowScale;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public void UpdateScreenMatrix()
 | 
			
		||||
		{
 | 
			
		||||
			ScreenMatrix = Mat4x4.CreateOrthographic(Game.Width, Game.Height * 0.5f, 0, 1)
 | 
			
		||||
			ScreenMatrix = Mat4x4.CreateOrthographic(ScreenWidth, ScreenHeight * 0.5f, 0, 1)
 | 
			
		||||
				* Mat4x4.CreateScale(.(1, -1, 1))
 | 
			
		||||
				* Mat4x4.CreateTranslation(.(-1, 1, 0));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public abstract void Init();
 | 
			
		||||
		public abstract bool Closed();			// Returns whether the game window has been closed
 | 
			
		||||
 | 
			
		||||
		//Rendering
 | 
			
		||||
 | 
			
		||||
@ -23,15 +23,16 @@ namespace Strawberry.SDL2
 | 
			
		||||
		private SDL.SDL_GLContext glContext;
 | 
			
		||||
		private uint glProgram;
 | 
			
		||||
 | 
			
		||||
		public override void Init()
 | 
			
		||||
		public this(String title, int screenWidth, int screenHeight, int windowScale)
 | 
			
		||||
			: base(title, screenWidth, screenHeight, windowScale)
 | 
			
		||||
		{
 | 
			
		||||
			SDL.Version version;
 | 
			
		||||
			SDL.GetVersion(out version);
 | 
			
		||||
			Calc.Log("Init SDL Version {0}.{1}.{2}", version.major, version.minor, version.patch);
 | 
			
		||||
			Calc.Log("SDL Version {0}.{1}.{2}", version.major, version.minor, version.patch);
 | 
			
		||||
 | 
			
		||||
			{
 | 
			
		||||
				SDL.InitFlag init = .Video | .Events | .Audio | .Timer;
 | 
			
		||||
				if (Game.GamepadLimit > 0)
 | 
			
		||||
				if (Input.GamepadLimit > 0)
 | 
			
		||||
					init |= .GameController;
 | 
			
		||||
	
 | 
			
		||||
				if (SDL.Init(init) != 0)
 | 
			
		||||
@ -48,8 +49,8 @@ namespace Strawberry.SDL2
 | 
			
		||||
 | 
			
		||||
			//Graphics
 | 
			
		||||
			{
 | 
			
		||||
				screenRect = SDL.Rect(0, 0, (int32)(Game.Width * Game.WindowScale), (int32)(Game.Height * Game.WindowScale));
 | 
			
		||||
				window = SDL.CreateWindow(Game.Title, .Centered, .Centered, screenRect.w, screenRect.h, .Shown | .OpenGL);
 | 
			
		||||
				screenRect = SDL.Rect(0, 0, (int32)(ScreenWidth * WindowScale), (int32)(ScreenHeight * WindowScale));
 | 
			
		||||
				window = SDL.CreateWindow(Title, .Centered, .Centered, screenRect.w, screenRect.h, .Shown | .OpenGL);
 | 
			
		||||
				renderer = SDL.CreateRenderer(window, -1, .Accelerated);
 | 
			
		||||
				screen = SDL.GetWindowSurface(window);
 | 
			
		||||
				SDLImage.Init(.PNG | .JPG);
 | 
			
		||||
@ -125,7 +126,7 @@ namespace Strawberry.SDL2
 | 
			
		||||
			//Input
 | 
			
		||||
			{
 | 
			
		||||
				keyboard = SDL.GetKeyboardState(null);
 | 
			
		||||
				gamepads = new SDL.SDL_GameController*[Game.GamepadLimit];
 | 
			
		||||
				gamepads = new SDL.SDL_GameController*[Input.GamepadLimit];
 | 
			
		||||
				for (let i < gamepads.Count)
 | 
			
		||||
					gamepads[i] = SDL.GameControllerOpen((int32)i);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										41
									
								
								src/Static/Engine.bf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/Static/Engine.bf
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,41 @@
 | 
			
		||||
using System;
 | 
			
		||||
namespace Strawberry
 | 
			
		||||
{
 | 
			
		||||
	static public class Engine
 | 
			
		||||
	{
 | 
			
		||||
		static public void Run(Module module)
 | 
			
		||||
		{
 | 
			
		||||
			Startup();
 | 
			
		||||
 | 
			
		||||
			Module current = module;
 | 
			
		||||
			while (true)
 | 
			
		||||
			{
 | 
			
		||||
				let newModule = current.Run();
 | 
			
		||||
 | 
			
		||||
				if (newModule != null)
 | 
			
		||||
				{
 | 
			
		||||
					delete current;
 | 
			
		||||
					current = newModule;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					delete current;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Shutdown();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		static private void Startup()
 | 
			
		||||
		{
 | 
			
		||||
			Input.[Friend]Startup();
 | 
			
		||||
			Tracker.[Friend]BuildAssignmentLists();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		static private void Shutdown()
 | 
			
		||||
		{
 | 
			
		||||
			Input.[Friend]Shutdown();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user