So basically for days, I have been trying to figure out key listener's in which I did to move my 'Superman' object with the arrow keys. This only works when I /* */ out my while loop of drawing the 'moving' road. Once it is uncommented and I run the program, the Superman does not move, and I assume that it is because the loop has priority over the image. I believe that I need help with threading the images priority. Help is much appreciated.
// The "CPT" class.
import java.applet.*;
import java.awt.*;
import java.awt.Image;
import java.awt.event.*;
import javax.swing.*;
import java.lang.Runnable;
import java.lang.Thread;
public class CPT extends Applet implements KeyListener
{
// Place instance variables here
Image myImage;
int x = 100, y = 200;
public void init ()
{
myImage = getImage (getCodeBase (), "SuperMan.png");
System.out.println (getCodeBase ());
addKeyListener (this);
// Place the body of the initialization method here
} // init method
public void paint (Graphics g)
{
//Drawing sky
g.setColor (new Color (150, 150, 254));
g.fillRect (0, 0, 1000, 500);
//Drawing floor
g.setColor (Color.black);
g.fillRect (0, 500, 1000, 150);
//Drawing road lines
//g.fillRect (
//Drawing Sun
g.setColor (Color.yellow);
g.fillOval (800, 50, 75, 75);
//Drawing Birds
g.setColor (Color.black);
g.drawArc (100, 75, 25, 25, 0, 180);
g.drawArc (125, 75, 25, 25, 0, 180);
g.drawArc (175, 85, 25, 25, 0, 180);
g.drawArc (200, 85, 25, 25, 0, 180);
g.drawArc (250, 65, 25, 25, 0, 180);
g.drawArc (275, 65, 25, 25, 0, 180);
//Drawing Smaller Birds
g.drawArc (125, 55, 15, 15, 0, 180);
g.drawArc (140, 55, 15, 15, 0, 180);
while (true)
{
g.setColor (Color.black);
g.fillRect (-30, 575, 80, 25);
g.fillRect (120, 575, 80, 25);
g.fillRect (270, 575, 80, 25);
g.fillRect (420, 575, 80, 25);
g.fillRect (570, 575, 80, 25);
g.fillRect (720, 575, 80, 25);
g.fillRect (870, 575, 80, 25);
//first blocks
g.setColor (Color.yellow);
g.fillRect (50, 575, 80, 25);
g.fillRect (200, 575, 80, 25);
g.fillRect (350, 575, 80, 25);
g.fillRect (500, 575, 80, 25);
g.fillRect (650, 575, 80, 25);
g.fillRect (800, 575, 80, 25);
g.fillRect (950, 575, 80, 25);
for (int k = 0 ; k < 100000000 ; k++)
;
//second blocks
g.setColor (Color.black);
g.fillRect (50, 575, 80, 25);
g.fillRect (200, 575, 80, 25);
g.fillRect (350, 575, 80, 25);
g.fillRect (500, 575, 80, 25);
g.fillRect (650, 575, 80, 25);
g.fillRect (800, 575, 80, 25);
g.fillRect (950, 575, 80, 25);
g.setColor (Color.orange);
g.fillRect (10, 575, 80, 25);
g.fillRect (160, 575, 80, 25);
g.fillRect (310, 575, 80, 25);
g.fillRect (460, 575, 80, 25);
g.fillRect (610, 575, 80, 25);
g.fillRect (760, 575, 80, 25);
g.fillRect (910, 575, 80, 25);
for (int z = 0 ; z < 100000000 ; z++)
;
//third blocks
g.setColor (Color.black);
g.fillRect (10, 575, 80, 25);
g.fillRect (160, 575, 80, 25);
g.fillRect (310, 575, 80, 25);
g.fillRect (460, 575, 80, 25);
g.fillRect (610, 575, 80, 25);
g.fillRect (760, 575, 80, 25);
g.fillRect (910, 575, 80, 25);
g.setColor (Color.yellow);
g.fillRect (-30, 575, 80, 25);
g.fillRect (120, 575, 80, 25);
g.fillRect (270, 575, 80, 25);
g.fillRect (420, 575, 80, 25);
g.fillRect (570, 575, 80, 25);
g.fillRect (720, 575, 80, 25);
g.fillRect (870, 575, 80, 25);
for (int t = 0 ; t < 100000000 ; t++)
;
g.drawImage (myImage, x, y, 100, 40, this);
}
} // paint method
public void keyReleased (KeyEvent e)
{
}
public void keyPressed (KeyEvent e)
{
if (e.getKeyCode () == KeyEvent.VK_RIGHT)
{
// System.out.println ("Right Key Pressed");
x += 10;
}
if (e.getKeyCode () == KeyEvent.VK_LEFT)
{
// System.out.println ("Left Key Pressed");
x -= 10;
}
if (e.getKeyCode () == KeyEvent.VK_UP)
{
y -= 10;
}
if (e.getKeyCode () == KeyEvent.VK_DOWN)
{
y+=10;
}
repaint ();
}
public void keyTyped (KeyEvent e)
{
}
} // CPT class
That while loop
freezes your whole application. It will keep on drawing stuff onto graphics but wont allow Swing event dispatch thread to be able to refresh the screen with your graphics.
Some suggestions:
1) Move the while loop outside of paint
method and into a separate thread. Better yet read up on how to do proper animation in Java Swing.
2) Read up on how to properly override Swing component paint
method.
3) Read up on what is Event Dispatch Thread and why you have to avoid blocking it.