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 }