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 }