I need to make the mouse movement in my game have a natural feel to it like any other FPS. Also, how could I loop the mouse around in the screen so the mouse doesn’t go off the screen when I move it? I’ll only post the classes which I think will have to do with this problem.
package me.kenneth.game;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import me.kenneth.graphics.Screen;
import me.kenneth.input.Controller;
import me.kenneth.input.InputHandler;
import java.awt.image.BufferStrategy;
import java.awt.image.DataBufferInt;
import java.awt.image.MemoryImageSource;
public class Window extends Canvas implements Runnable {
public static final long serialVersionUID = 1L;
public static final int WIDTH = 800;
public static final int HEIGHT = 600;
public static final String TITLE = "MineGame Pre-Alpha 0.2";
private Thread thread;
private boolean running = false;
private BufferedImage img;
private Screen render;
private int pixels[];
private Game game;
private InputHandler input;
private int newX = 0;
private int oldX = 0;
private int fps = 0;
public Window() {
Dimension dim = new Dimension(WIDTH, HEIGHT);
setPreferredSize(dim);
setMinimumSize(dim);
setMaximumSize(dim);
render = new Screen(WIDTH, HEIGHT);
img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
game = new Game();
input = new InputHandler();
addKeyListener(input);
addFocusListener(input);
addMouseListener(input);
addMouseMotionListener(input);
}
public void start() {
if (running) return;
running = true;
thread = new Thread(this);
thread.start();
}
public synchronized void stop() {
if (!running) return;
running = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(0);
}
}
public void run() {
int frames = 0;
double unprocessedSeconds = 0;
long previousTime = System.nanoTime();
double secondsPerTick = 1 / 60.0;
int tickCount = 0;
while (running) {
this.requestFocus();
long currentTime = System.nanoTime();
long passedTime = currentTime - previousTime;
previousTime = currentTime;
unprocessedSeconds += passedTime / 1000000000.0;
boolean ticked = false;
while (unprocessedSeconds > secondsPerTick) {
ticked = true;
tick();
unprocessedSeconds -= secondsPerTick;
tickCount++;
if (tickCount % 60 == 0) {
System.out.println(frames + "fps");
fps = frames;
previousTime += 1000;
frames = 0;
}
}
if (ticked) {
}
render();
frames++;
newX = InputHandler.mouseX;
if (newX > oldX) {
Controller.turnRight = true;
}
if (newX < oldX) {
Controller.turnLeft = true;
}
if (newX == oldX) {
Controller.turnLeft = false;
Controller.turnRight = false;
}
oldX = newX;
}
}
private void tick() {
game.tick(input.key);
}
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
render.render(game);
for (int i = 0; i < WIDTH * HEIGHT; i++) {
pixels[i] = render.pixels[i];
}
Graphics g = bs.getDrawGraphics();
g.drawImage(img, 0, 0, WIDTH, HEIGHT, null);
g.setFont(new Font("Verdana", 0, 20));
g.setColor(Color.WHITE);
g.drawString(String.valueOf(fps), 20, 20);
g.dispose();
bs.show();
}
public static void main(String[] args) {
Image cursor = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(16, 16, new int[16 * 16], 0, 16));
Cursor blank = Toolkit.getDefaultToolkit().createCustomCursor(cursor, new Point(0, 0), "blank");
Window game = new Window();
JFrame frame = new JFrame(TITLE);
frame.add(game);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.pack();
frame.getContentPane().setCursor(blank);
game.start();
}
}
package me.kenneth.game;
import java.awt.event.KeyEvent;
import me.kenneth.input.Controller;
public class Game {
private int time;
public Controller controls;
public Game() {
time = 0;
controls = new Controller();
}
public void tick(boolean[] args) {
time++;
boolean forward = args[KeyEvent.VK_W];
boolean back = args[KeyEvent.VK_S];
boolean right = args[KeyEvent.VK_D];
boolean left = args[KeyEvent.VK_A];
boolean jump = args[KeyEvent.VK_SPACE];
boolean crouch = args[KeyEvent.VK_CONTROL];
boolean run = args[KeyEvent.VK_SHIFT];
controls.tick(forward, back, left, right, jump, crouch, run);
}
public int getTime() {
return time;
}
}
package me.kenneth.input;
public class Controller {
public double x, z, y, rotation, xa, za, rotationa;
public static boolean turnLeft = false, turnRight = false;
public static boolean walk = false, crouchWalk = false, runWalk = false;
public void tick(boolean forward, boolean back, boolean left, boolean right, boolean jump, boolean crouch, boolean run) {
double rotationSpeed = 0.025;
double walkSpeed = 0.5;
double jumpHeight = 2;
double crouchHeight = 1.3;
double xMove = 0;
double zMove = 0;
if (forward) {
zMove++;
walk = true;
}
if (back) {
zMove--;
walk = true;
}
if (right) {
xMove++;
walk = true;
}
if (left) {
xMove--;
walk = true;
}
if (turnLeft) {
rotationa -= rotationSpeed;
}
if (turnRight) {
rotationa += rotationSpeed;
}
if (jump) {
y += jumpHeight;
run = false;
}
if (crouch) {
y -= crouchHeight;
run = false;
crouchWalk = true;
walkSpeed = 0.2;
}
if (run) {
walkSpeed = 1;
runWalk = true;
}
if (!forward && !back && !right && !left && !run) {
walk = false;
}
if (!crouch) {
crouchWalk = false;
}
if (!run) {
runWalk = false;
}
xa += (xMove * Math.cos(rotation) + zMove * Math.sin(rotation)) * walkSpeed;
za += (zMove * Math.cos(rotation) - xMove * Math.sin(rotation)) * walkSpeed;
x += xa;
y *= 0.5;
z += za;
xa *= 0.1;
za *= 0.1;
rotation += rotationa;
rotationa *= 0.1;
}
}
package me.kenneth.input;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class InputHandler implements KeyListener, FocusListener, MouseListener, MouseMotionListener {
public boolean[] key = new boolean[68836];
public static int mouseX;
public static int mouseY;
@Override
public void mouseDragged(MouseEvent event) {
}
@Override
public void mouseMoved(MouseEvent event) {
mouseX = event.getX();
mouseY = event.getY();
}
@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent event) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent event) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent event) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent event) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent event) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent event) {
for (int i = 0; i < key.length; i++) {
key[i] = false;
}
}
@Override
public void keyPressed(KeyEvent event) {
int keyCode = event.getKeyCode();
if (keyCode > 0 && keyCode < key.length) {
key[keyCode] = true;
}
}
@Override
public void keyReleased(KeyEvent event) {
int keyCode = event.getKeyCode();
if (keyCode > 0 && keyCode < key.length) {
key[keyCode] = false;
}
}
@Override
public void keyTyped(KeyEvent event) {
// TODO Auto-generated method stub
}
}