package de.tutorials;
import static java.awt.event.KeyEvent.VK_DOWN;
import static java.awt.event.KeyEvent.VK_LEFT;
import static java.awt.event.KeyEvent.VK_P;
import static java.awt.event.KeyEvent.VK_Q;
import static java.awt.event.KeyEvent.VK_R;
import static java.awt.event.KeyEvent.VK_RIGHT;
import static java.awt.event.KeyEvent.VK_UP;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
public class WaterMarkExample extends JFrame {
BufferStrategy bufferStrategy;
volatile int waterMark;
volatile boolean pause;
volatile boolean quit;
volatile boolean restart;
volatile boolean upPressed;
volatile boolean downPressed;
volatile boolean leftPressed;
volatile boolean rightPressed;
volatile Point playerXY = new Point(0, 0);
Runnable gameLoop = new Runnable() {
public void run() {
while (!quit) {
if (!pause) {
processInput();
updateGameState();
}
updateGraphics();
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Bye bye");
setVisible(false);
System.exit(0);
}
};
private void processInput() {
int dx = 0;
int dy = 0;
int stepSize = 5;
if (upPressed) {
dy -= stepSize;
}
if (downPressed) {
dy += stepSize;
}
if (leftPressed) {
dx -= stepSize;
}
if (rightPressed) {
dx += stepSize;
}
playerXY.translate(dx, dy);
}
protected void updateGraphics() {
Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics();
g.clearRect(0, 0, 400, 300);
drawWater(g);
drawPlayer(g);
g.dispose();
bufferStrategy.show();
}
private void drawPlayer(Graphics2D g) {
g.setColor(Color.RED);
g.fillRect(playerXY.x, playerXY.y, 40, 40);
}
private void drawWater(Graphics2D g) {
g.setColor(Color.BLUE);
g.fillRect(0, 300 - waterMark, 400, waterMark);
}
protected void updateGameState() {
waterMark++;
if (restart) {
waterMark = 0;
restart = false;
}
}
public WaterMarkExample() {
super("WaterMarkExample");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 300);
setVisible(true);
createBufferStrategy(2);
addKeyListener(createKeyListener());
this.bufferStrategy = getBufferStrategy();
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(gameLoop);
}
private KeyListener createKeyListener() {
return new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
processKeys(e, true);
}
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case VK_P:
if (pause) {
pause = false;
} else {
pause = true;
}
break;
case VK_Q:
quit = true;
break;
case VK_R:
restart = true;
break;
}
processKeys(e, false);
}
private void processKeys(KeyEvent e, boolean pressed) {
switch (e.getKeyCode()) {
case VK_UP:
upPressed = pressed;
break;
case VK_DOWN:
downPressed = pressed;
break;
case VK_LEFT:
leftPressed = pressed;
break;
case VK_RIGHT:
rightPressed = pressed;
break;
}
}
};
}
public static void main(String[] args) {
new WaterMarkExample();
}
}