1 module game; 2 3 import nudsfml.graphics; 4 import nudsfml.system; 5 import nudsfml.audio; 6 import nudsfml.network; 7 8 import std.stdio; 9 import std.format; 10 11 import gamemap; 12 import gameentity; 13 import snake; 14 15 class Game { 16 string dataDir; 17 bool running = true; 18 19 RenderWindow win; 20 21 GameMap map; 22 AppleEntity [] apples; 23 //SceneManager 24 //scriptingEngine 25 // 26 27 Snake snake; 28 bool doMove = true; 29 30 Font systemFont; 31 Text debugText; 32 33 bool doDrawDebug = false; 34 35 Clock gameTick; 36 37 Clock elementTimer; 38 39 this(string dataDir_ = "data/"){ 40 dataDir = dataDir_; 41 42 win = new RenderWindow(VideoMode(1024, 768), "NudSFML"); 43 //win.setVerticalSyncEnabled(true); // higher accuracy but more cpu time 44 //win.setFramerateLimit(60); // 60 fps max // TODO: make this configurable 45 46 systemFont = new Font(); 47 systemFont.loadFromFile(dataDir ~ "CamingoCode-Regular.ttf"); 48 49 debugText = new Text("Test", systemFont, 16); 50 doDrawDebug = true; 51 //create initial resources 52 53 map = new GameMap(); 54 apples ~= map.addApple(5,4); 55 56 snake = new Snake(this); 57 snake.headPosition = Vector2i(map.width / 2, map.height / 2); 58 snake.direction = Direction.Up; 59 snake.generate(3); 60 61 gameTick = new Clock(); 62 elementTimer = new Clock(); 63 } 64 65 66 void startup() { 67 win.setTitle("素晴らしい !"d); 68 69 } 70 71 float dt, drawtime, eventTimer, updateTimer; 72 73 void run(){ 74 while(running){ 75 dt = gameTick.restart().asSeconds(); 76 drawtime = elementTimer.restart().asSeconds(); 77 handleEvents(); 78 eventTimer= elementTimer.getElapsedTime.asSeconds(); 79 update(dt); 80 updateTimer = elementTimer.getElapsedTime.asSeconds(); 81 draw(); 82 } 83 } 84 85 void update(float dt){ 86 if(Keyboard.isKeyPressed(Keyboard.Key.Up)){ 87 if(snake.canDirection(Direction.Up)){ 88 snake.direction = Direction.Up; 89 } 90 } else if(Keyboard.isKeyPressed(Keyboard.Key.Right)){ 91 if(snake.canDirection(Direction.Right)){ 92 snake.direction = Direction.Right; 93 } 94 } else if(Keyboard.isKeyPressed(Keyboard.Key.Down)){ 95 if(snake.canDirection(Direction.Down)){ 96 snake.direction = Direction.Down; 97 } 98 } else if(Keyboard.isKeyPressed(Keyboard.Key.Left)){ 99 if(snake.canDirection(Direction.Left)){ 100 snake.direction = Direction.Left; 101 } 102 } 103 map.update(dt); 104 snake.update(dt); 105 } 106 107 void draw(){ 108 win.clear(); 109 110 //draw stuff here 111 map.draw(Vector2f(0,16), win); 112 113 drawDebug(); 114 win.display(); 115 } 116 117 void drawDebug(){ 118 if(doDrawDebug){ 119 debugText.position = Vector2f(32,32); 120 string text = format("FPS: %0.f , drawTime: %f , eventTime: %f , updateTime: %f", 1/dt, drawtime, eventTimer, updateTimer); 121 debugText.setString = text; 122 win.draw(debugText); 123 } 124 } 125 126 void handleEvents(){ 127 Event e; 128 while(win.pollEvent(e)){ 129 switch(e.type){ 130 case Event.Type.Closed: 131 running = false; 132 break; 133 case Event.Type.KeyPressed: 134 switch(e.key.code) { 135 case Keyboard.Key.Escape: 136 running = false; 137 break; 138 case Keyboard.Key.F9: 139 snake.addPart(); 140 break; 141 case Keyboard.Key.F10: 142 snake.move(); 143 break; 144 case Keyboard.Key.F12: 145 doDrawDebug = !doDrawDebug; 146 break; 147 case Keyboard.Key.P: 148 auto screenShot = win.capture(); 149 writeln("Saved screenshot to screenShot.png"); 150 screenShot.saveToFile("screenshot.png"); 151 break; 152 case Keyboard.Key.Space: 153 doMove = !doMove; 154 break; 155 default: break; 156 } 157 break; 158 default: break; 159 } 160 } 161 } 162 163 void shutdown(){ 164 //clean up resources 165 166 } 167 }