0

I am learning Java language and trying to make a simple maze game. I am able to draw a ball and the objects on the screen but I can't move the ball using arrow keys. Here is my code:

 import java.applet.*;
 import java.awt.*;
 import java.awt.event.KeyEvent;
 import javax.swing.*;
 import java.awt.event.*;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;


public class game extends Applet implements ActionListener, KeyListener {
/**
 * 
 */
private static final long serialVersionUID = 1L;

double x = 0, y = 0;

static int MoveX = 210; 
static int MoveY = 800; 

 public void up(){
        MoveY = -2;
        MoveX = 0;
    }

    public void down(){
        MoveY = 2;
        MoveX = 0;
    }

    public void left(){
       MoveX = -2;
        MoveY = 0;
    }

    public void right(){
        MoveX = 2;
        MoveY = 0;
    }



public void paint(Graphics g){
    //g.drawLine(200+10,150-10, 200+190, 150-10);
    //g.drawLine(200+30,200-30, 200+190, 200-30);
    g.setColor(Color.BLUE);


    g.fillRect(200+10, 150-10, 200+40, 150-10);
    g.fillRect(300+40, 150-10, 300+70, 150-10);


    g.fillRect(200+10, 200-10, 200+10, 200-10);
    g.fillRect(200+10, 230-10, 200+10, 230-10);
    g.fillRect(200+10, 260-10, 200+10, 260-10);
    g.fillRect(200+10, 290-10, 200+10, 290-10);
    g.fillRect(200+10, 320-10, 200+10, 320-10);
    g.fillRect(200+10, 350-10, 200+10, 350-10);
    g.fillRect(200+10, 380-10, 200+10, 380-10);




    g.fillRect(600+300, 90-10, 100+100, 150-10);
    g.fillRect(600+300, 150-10, 100+100, 210-10);
    g.fillRect(600+300, 210-10, 100+100, 270-10);
    g.fillRect(600+300, 270-10, 100+100, 330-10);


    g.fillRect(600+100,400, 200, 180);
    g.fillRect(600+30,400, 200, 180);


    g.fillRect(1000+300, 90-10, 100+100, 150-10);
    g.fillRect(1000+300, 150-10, 100+100, 210-10);
    g.fillRect(1000+300, 210-10, 100+100, 270-10);
    g.fillRect(1000+300, 270-10, 100+100, 330-10);
    g.fillRect(1000+300, 330-10, 100+100, 390-10);
    g.fillRect(1000+300, 390-10, 100+100, 350-10);

    g.setColor(Color.RED); 
    int size =90;
    g.fillOval(MoveX, MoveY, size, size); 






}
public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
     int code = e.getKeyCode();

        if (code == KeyEvent.VK_UP){
            up();
        }

        if (code == KeyEvent.VK_DOWN){
            down();
        }

        if (code == KeyEvent.VK_LEFT){
            left();
        }

        if (code == KeyEvent.VK_RIGHT){
            right();
        }

}
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

    int code = e.getKeyCode();

    if (code == KeyEvent.VK_UP){
        MoveY = 0;
    }
    if (code == KeyEvent.VK_DOWN){
        MoveY = 0;
    }
    if (code == KeyEvent.VK_LEFT){
        MoveX = 0;
    }
    if (code == KeyEvent.VK_RIGHT){
        MoveX = 0;
    }

}
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
     repaint();
        x += MoveX;
        y += MoveY;

        if(x<0){
            MoveX = 0;
            x = 0;
        }

        if(x>750){
            MoveX = 0;
            x = 750;
        }

        if(y<0);{
            MoveY = 0;
            y = 0;
        }

        if(y>550){
            MoveY = 0;
            y = 550;
        }
   }


  }

Applet started successfully and the objects drawn. I pressed arrow keys but the ball did not move. How can I trigger the KeyListener methods?

Thank you so much!

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
teraRockstar
  • 55
  • 10
  • 1) Why code an applet? If it is due to the teacher specifying it, please refer them to [Why CS teachers should **stop** teaching Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/). 2) See [Java Plugin support deprecated](http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) and [Moving to a Plugin-Free Web](https://blogs.oracle.com/java-platform-group/moving-to-a-plugin-free-web). 3) Why use AWT? .. – Andrew Thompson May 02 '18 at 13:10
  • .. See [this answer](http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978) for many good reasons to abandon AWT components in favor of Swing. – Andrew Thompson May 02 '18 at 13:10
  • 1
    @AndrewThompson This is my homework. I am a Computer Engineering Student. Btw, I will send the link of the article to my Professor :) – teraRockstar May 02 '18 at 18:31

2 Answers2

1

You need to set the key listener on your Applet instance:

public void init() {
    addKeyListener(this);
}

Nothing will happen though, because you are not repainting your Applet. After the user presses a key you will need to repaint:

repaint();

The logic for your up(), down(), etc. functions are also incorrect. When you call the up() function the ball's position will be set to 0,-2, when you call the down() function the ball's position will be set to 0,2. You should be adjusting the existing ball position, not setting it to fixed coordinates.

explv
  • 2,709
  • 10
  • 17
  • Note that an `Applet` is (by default) not focusable. It won't necessarily have the input focus even if it is **made** focusable. Both are necessary for an applet to receive key events. So this answer, **by itself,** will **not** fix the reported problem. – Andrew Thompson May 02 '18 at 13:08
0

I've solved the problem. Here is the link of code:

Mini maze game

teraRockstar
  • 55
  • 10