1 module D2DGame.Toolkit.Game;
2 
3 import D2D;
4 
5 import std.datetime;
6 
7 abstract class Game
8 {
9 private:
10 	int		  _width  = 800, _height = 480;
11 	Bitmap	  _icon	  = null;
12 	Window	  _window = null;
13 	string	  _title  = "Game";
14 	int		  _fps	  = 60;
15 	StopWatch _stopwatch;
16 
17 protected:
18 	@property ref int windowWidth()
19 	{
20 		return _width;
21 	}
22 
23 	@property ref int windowHeight()
24 	{
25 		return _height;
26 	}
27 
28 	@property ref Bitmap windowIcon()
29 	{
30 		return _icon;
31 	}
32 
33 	@property ref string windowTitle()
34 	{
35 		return _title;
36 	}
37 
38 	@property ref int maxFPS()
39 	{
40 		return _fps;
41 	}
42 
43 	@property Window window()
44 	{
45 		return _window;
46 	}
47 
48 	abstract void init()
49 	{
50 	}
51 
52 	abstract void load()
53 	{
54 	}
55 
56 	abstract void update(float delta)
57 	{
58 	}
59 
60 	abstract void draw()
61 	{
62 	}
63 
64 	void onEvent(Event event)
65 	{
66 	}
67 
68 public:
69 	void run()
70 	{
71 		init();
72 
73 		_window = new Window(_width, _height, _title);
74 
75 		if (_icon is null)
76 		{
77 			_icon = new Bitmap(
78 				[
79 					0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff,
80 					0x00ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00ffffff,
81 					0xffffffff, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff9c9c9c, 0xff000000, 0xff000000, 0xff000000, 0xff383838, 0xffcccccc, 0xffffffff,
82 					0xffffffff, 0xff000000, 0xff303030, 0xff303030, 0xff303030, 0xff1c1c1c, 0xff000000, 0xff9c9c9c, 0xffcccccc, 0xff000000, 0xff292929, 0xff303030, 0xff292929, 0xff000000, 0xff6d6d6d, 0xffffffff,
83 					0xffffffff, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff707070, 0xff131313, 0xff000000, 0xffcccccc, 0xff303030, 0xffb7b7b7, 0xffcccccc, 0xffb7b7b7, 0xff131313, 0xff000000, 0xffffffff,
84 					0xffffffff, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff555555, 0xff000000, 0xff9c9c9c, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff1e1e1e, 0xff000000, 0xffffffff,
85 					0xffffffff, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffa7a7a7, 0xff000000, 0xff6d6d6d, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffb0b0b0, 0xff000000, 0xff555555, 0xffffffff,
86 					0xffffffff, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffb0b0b0, 0xff000000, 0xff727272, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff333333, 0xff0d0d0d, 0xffa7a7a7, 0xffffffff,
87 					0xffffffff, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff8b8b8b, 0xff000000, 0xff909090, 0xffcccccc, 0xffcccccc, 0xff545454, 0xff000000, 0xff5b5b5b, 0xffcccccc, 0xffffffff,
88 					0xffffffff, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff444444, 0xff060606, 0xffb7b7b7, 0xffcccccc, 0xff545454, 0xff000000, 0xff454545, 0xffcccccc, 0xffcccccc, 0xffffffff,
89 					0xffffffff, 0xff000000, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xff545454, 0xff000000, 0xff343434, 0xffcccccc, 0xff545454, 0xff000000, 0xff303030, 0xffcccccc, 0xffcccccc, 0xffcccccc, 0xffffffff,
90 					0xffffffff, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff303030, 0xffa7a7a7, 0xffb0b0b0, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xffffffff,
91 					0xffffffff, 0xff303030, 0xff303030, 0xff303030, 0xff303030, 0xff454545, 0xffcccccc, 0xffcccccc, 0xffb7b7b7, 0xff303030, 0xff303030, 0xff303030, 0xff303030, 0xff303030, 0xff303030, 0xffffffff,
92 					0x00ffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00ffffff,
93 					0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff,
94 					0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff,
95 				], 16, 16, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
96 		}
97 
98 		_window.setIcon(_icon);
99 
100 		FPSLimiter limiter;
101 		if (_fps > 0)
102 			limiter = new FPSLimiter(_fps);
103 
104 		load();
105 
106 		Event		 event;
107 		TickDuration delta;
108 		while (_window.open)
109 		{
110 			_stopwatch.start();
111 			while (_window.pollEvent(event))
112 			{
113 				if (event.type == Event.Type.Quit)
114 					_window.close();
115 				else
116 					onEvent(event);
117 			}
118 
119 			update(delta.to!("seconds", float));
120 
121 			draw();
122 
123 			_window.display();
124 
125 			if (limiter !is null)
126 				limiter.wait();
127 
128 			_stopwatch.stop();
129 			delta = _stopwatch.peek();
130 			_stopwatch.reset();
131 		}
132 	}
133 }