-
Notifications
You must be signed in to change notification settings - Fork 0
/
SnakeGame.java
146 lines (118 loc) · 3.07 KB
/
SnakeGame.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import java.util.ArrayList;
import java.util.List;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
public class SnakeGame extends Canvas implements Runnable {
/**
* Run, Tick, Render, Entities and Drawables
*/
private boolean isRunning = true;
private Thread thread;
private static final long NANOS_IN_SECOND = 1000000000L;
private static final double OPTIMAL_TICKS = 50.0;
private static final double OPTIMAL_TIME = NANOS_IN_SECOND / OPTIMAL_TICKS;
private long lastLoopTime = System.nanoTime();
private long currentTime;
private double deltaTime;
private long secondTimer = System.currentTimeMillis();
private final List<Entity> entities = new ArrayList<>();
private final List<Drawable> drawables = new ArrayList<>();
/**
* Window Constants
*/
private static final int WIDTH = 500;
private static final int HEIGHT = 500;
private static final String TITLE = "Snake Game";
/**
* Entities
*/
private final FPSViewer fpsViewer = new FPSViewer();
private final Grid grid = new Grid();
private static final Snake snake = new Snake();
// there are more here, stripped for this review
/**
* Data Contaienrs
*/
// there are more here, stripped for this review
/**
* Main Function, instantiating SnakeGame
*/
public static void main(String[] args) {
new SnakeGame();
}
/**
* SnakeGame constructor, initailized by main ()
*/
public SnakeGame() {
// fps tracking
entities.add(fpsViewer);
drawables.add(fpsViewer);
// grid
entities.add(grid);
drawables.add(grid);
// snake
entities.add(snake);
drawables.add(snake);
Window window = new Window(WIDTH, HEIGHT, TITLE, this);
this.addKeyListener(snake);
thread = new Thread(this);
thread.start();
this.setFocusable(true);
this.requestFocus();
}
/**
* SnakeGame Loop
*/
public void run() {
while (isRunning) {
// get delta time
currentTime = System.nanoTime();
deltaTime += (currentTime - lastLoopTime) / OPTIMAL_TIME;
lastLoopTime = currentTime;
while (deltaTime >= 1) {
update();
deltaTime--;
}
// update the game
render();
// reset if a second has passed
if (System.currentTimeMillis() - secondTimer > 260) {
updatePerSecond();
secondTimer += 260;
}
}
}
/**
* SnakeGame Updates for all entities
*/
private void update() {
for (Entity e : entities) {
e.tick();
}
}
private void updatePerSecond() {
for (Entity e : entities) {
e.second();
}
}
/**
* Renders all graphics for all drawables
*/
private void render() {
BufferStrategy bufferstrategy = getBufferStrategy();
if (bufferstrategy == null) {
createBufferStrategy(3);
return;
}
Graphics g = bufferstrategy.getDrawGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
for (Drawable d : drawables) {
d.draw(g);
}
g.dispose();
bufferstrategy.show();
}
}