import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
/**
*
* @author Zeveso
*/
public class gameStart extends JFrame {
//set Global variables
final int WIDTH = 400, HEIGHT = 400;
//Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
double cOspeed = .5; //car 1 speed
double cTspeed = .5; //car 2 speed
Boolean winnerChosen = false;
Boolean canLap = false;
Boolean canLapT = false;
int cOlaps = 0;
int cTlaps = 0;
final int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3;
//direction of carOne
int cODirection = UP;
int cTDirection = UP;
//setup for double buffer
BufferedImage bufImg;
//set Global Track
//set outside
Rectangle left = new Rectangle(0, 0, WIDTH/10, HEIGHT);
Rectangle right = new Rectangle((WIDTH/10) * 9, 0, WIDTH/5, HEIGHT);
Rectangle top = new Rectangle(0, 0, WIDTH, HEIGHT/8);
Rectangle bottom = new Rectangle(0, (HEIGHT/15) * 14, WIDTH, HEIGHT/9);
//set inside
Rectangle topInr = new Rectangle((WIDTH/11) * 2, (HEIGHT/16) * 3, (WIDTH/14) * 9, HEIGHT/10);
Rectangle bottomInr = new Rectangle((WIDTH/11) * 2, (HEIGHT/16) * 12, (WIDTH/14) * 9, HEIGHT/10);
Rectangle leftInr = new Rectangle((WIDTH/11) * 2, HEIGHT/5, WIDTH/5, (HEIGHT/10) * 6);
Rectangle rightInr = new Rectangle((WIDTH/12) * 6, (HEIGHT/20) * 7, WIDTH/2, (HEIGHT/10) * 3);
//create finishLine
Rectangle finishLine = new Rectangle(WIDTH/10, (HEIGHT/10) * 8, WIDTH/10, HEIGHT/70);
//create checkpoint
Rectangle checkPoint = new Rectangle((WIDTH/25) * 9, (HEIGHT/10) * 5, WIDTH/7, HEIGHT/70);
//set Global Cars
Rectangle carOne = new Rectangle(WIDTH/8, HEIGHT/2, WIDTH/30, WIDTH/30);
Rectangle carTwo = new Rectangle(WIDTH/9, HEIGHT/2, WIDTH/30, WIDTH/30);
public gameStart() {
super("Racing Game"); //set title
setSize(400, 400); //set the size
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //make sure it closes when you click the exit button
setVisible(true); //make sure its visible
setResizable(false);
setLocationRelativeTo(null); //set location of JFrame to middle
/*
* Set the location
* First get the size of screen from Global variables
* Then use .setLocation(); with those variables
*/
//start double buffer
bufImg = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(WIDTH, HEIGHT);
//start cars up
moveMyCar moveCar = new moveMyCar();
moveMyCar2 moveCar2 = new moveMyCar2();
moveCar.start();
moveCar2.start();
}
@Override
public void paint(Graphics g) {
Graphics2D gd = bufImg.createGraphics();
try {
//setup double buffer in paint
gd.clearRect(0, 0, WIDTH, HEIGHT);
//draw finishline
gd.setColor(Color.RED); //set color
gd.fillRect(finishLine.x, finishLine.y, finishLine.width, finishLine.height);
//draw checkpoint
//gd.setColor(Color.CYAN); //set color
//gd.fillRect(checkPoint.x, checkPoint.y, checkPoint.width, checkPoint.height);
//draw track
//draw outside
gd.setColor(Color.LIGHT_GRAY); //set color
gd.fillRect(left.x, left.y, left.width, left.height);
gd.fillRect(right.x, right.y, right.width, right.height);
gd.fillRect(top.x, top.y, top.width, top.height);
gd.fillRect(bottom.x, bottom.y, bottom.width, bottom.height);
//draw inside
gd.fillRect(topInr.x, topInr.y, topInr.width, topInr.height);
gd.fillRect(bottomInr.x, bottomInr.y, bottomInr.width, bottomInr.height);
gd.fillRect(leftInr.x, leftInr.y, leftInr.width, leftInr.height);
gd.fillRect(rightInr.x, rightInr.y, rightInr.width, rightInr.height);
//draw car1
gd.setColor(Color.GREEN); // set color
//gd.fillRect(carOne.x, carOne.y, carOne.width, carOne.height);
gd.draw(carOne);
//draw car2
gd.setColor(Color.PINK);
//gd.fillRect(carTwo.x, carTwo.y, carTwo.width, carTwo.height);
gd.draw(carTwo);
} finally {
gd.dispose();
}
g.drawImage(bufImg, 0, 0, this);
}
@Override
public void update(Graphics g) {
paint(g);
}
private class moveMyCar extends Thread implements KeyListener {
@Override
public void run() {
addKeyListener(this);
while (true) {
try {
repaint();
//check for collisions
if (carOne.intersects(left) || carOne.intersects(right) || carOne.intersects(top) || carOne.intersects(bottom) || carOne.intersects(topInr) || carOne.intersects(bottomInr) || carOne.intersects(leftInr) || carOne.intersects(rightInr)) {
if (cOspeed > 3.5) {
cOspeed = -5;
}
if (0 < cOspeed && cOspeed < 3.5) {
cOspeed = 1;
}
}
// check for laps
if (carOne.intersects(finishLine) && cODirection == UP && canLap == true) {
cOlaps++;
canLap = false;
}
if (carOne.intersects(checkPoint) && cODirection == DOWN) {
canLap = true;
}
// see if player won
if (cOlaps >= 3) {
winnerChosen = true;
JOptionPane.showMessageDialog(null, "Player 1 won the game!");
break;
}
if (winnerChosen) {
break;
}
//increase speed
if (cOspeed <= 5) {
cOspeed += .2;
}
//change direction
if (cODirection == UP) {
carOne.y -= cOspeed;
}
if (cODirection == DOWN) {
carOne.y += cOspeed;
}
if (cODirection == LEFT) {
carOne.x -= cOspeed;
}
if (cODirection == RIGHT) {
carOne.x += cOspeed;
}
Thread.sleep(100);
} catch (Exception e) {
System.out.println("Error: " + e);
break;
}
}
}
public void keyPressed(KeyEvent event) {
if (event.getKeyChar() == ' ') {
if (cOspeed > -3) {
cOspeed -= 1;
}
}
System.out.println(event);
}
public void keyReleased(KeyEvent event) {
}
public void keyTyped(KeyEvent event) {
if (event.getKeyChar() == 'a') {
cODirection = LEFT;
}
if (event.getKeyChar() == 's') {
cODirection = DOWN;
}
if (event.getKeyChar() == 'd') {
cODirection = RIGHT;
}
if (event.getKeyChar() == 'w') {
cODirection = UP;
}
}
}
private class moveMyCar2 extends Thread implements KeyListener {
@Override
public void run() {
addKeyListener(this);
while (true) {
try {
repaint();
//check for collisions
if (carTwo.intersects(left) || carTwo.intersects(right) || carTwo.intersects(top) || carTwo.intersects(bottom) || carTwo.intersects(topInr) || carTwo.intersects(bottomInr) || carTwo.intersects(leftInr) || carTwo.intersects(rightInr)) {
if (cTspeed > 3.5) {
cTspeed = -5;
}
if (0 < cTspeed && cTspeed < 3.5) {
cTspeed = 1;
}
}
// check for laps
if (carTwo.intersects(finishLine) && cTDirection == UP && canLapT == true) {
cTlaps++;
canLapT = false;
}
if (carTwo.intersects(checkPoint) && cTDirection == DOWN) {
canLapT = true;
}
// see if player won
if (cTlaps >= 3) {
winnerChosen = true;
JOptionPane.showMessageDialog(null, "Player 2 won the game!");
break;
}
if (winnerChosen) {
break;
}
//increase speed
if (cTspeed <= 5) {
cTspeed += .2;
}
//change direction
if (cTDirection == UP) {
carTwo.y -= cTspeed;
}
if (cTDirection == DOWN) {
carTwo.y += cTspeed;
}
if (cTDirection == LEFT) {
carTwo.x -= cTspeed;
}
if (cTDirection == RIGHT) {
carTwo.x += cTspeed;
}
Thread.sleep(100);
} catch (Exception e) {
System.out.println("Error: " + e);
break;
}
}
}
public void keyPressed(KeyEvent event) {
if (event.getKeyChar() == 'm') {
if (cTspeed > -3) {
cTspeed -= 1;
}
}
}
public void keyReleased(KeyEvent event) {
System.out.println(event.getKeyCode());
}
public void keyTyped(KeyEvent event) {
if (event.getKeyCode() == event.VK_LEFT) {
cTDirection = LEFT;
}
if (event.getKeyCode() == event.VK_DOWN) {
cTDirection = DOWN;
}
if (event.getKeyCode() == event.VK_RIGHT) {
cTDirection = RIGHT;
}
if (event.getKeyCode() == event.VK_UP) {
cTDirection = UP;
}
}
}
}
Voici mon code. Je me demandais deux choses. Tout d'abord, je reçois une erreur sur la ligne 80. Ligne 80 :Comment résoudre les problèmes VK_ et NullPointerException?
Graphics2D gd = bufImg.createGraphics();
Quoi qu'il en soit, il est une exception dans le thread « AWT-EventQueue-0 » java.lang.NullPointerException et je me demandais si je suppose que pour obtenir cette. Cela n'arrive pas à chaque fois, mais parfois. Si non, alors comment pourrais-je y remédier?
J'ai également utilisé les touches event.VK_ pour les touches fléchées Haut, Bas, Gauche et Droite et cela ne fonctionne pas. Il dit "accéder au champ statique". Que devrais-je faire à ce sujet?
Merci!
Pouvez-vous poster la trace complète de la pile? – Jeremy
Etes-vous sûr de recevoir un NPE dans cette ligne? Si c'est le cas, bufImg est nul, ce qui ne peut se produire que si vous ne pouvez pas créer de contexte graphique dans le ctor. –
@Jeremy Heiler Je l'ai mis là-dedans, le reste est inutile. Tout ce que vous devez savoir c'est "NPE" Je pense que c'est juste parce que c'est nul au début, mais ensuite il y a des choses ajoutées. Le jeu fonctionne bien, sauf l'événement. VK_ chose ... – Zeveso