如何使图像优先于 while 循环绘图背景
How to give an image a priority over a while loop drawing background
所以基本上几天来,我一直在尝试找出我用箭头键移动 'Superman' 对象的关键侦听器。这仅在我 /* */ 退出绘制 'moving' 道路的 while 循环时有效。一旦取消注释并且我 运行 程序,超人就不会移动,我认为这是因为循环优先于图像。我相信我需要帮助处理图像优先级。非常感谢您的帮助。
// 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
while loop
会冻结您的整个应用程序。它将继续在图形上绘制内容,但不允许 Swing 事件调度线程使用您的图形刷新屏幕。
一些建议:
1) 将 while 循环移出 paint
方法并移至单独的线程中。最好阅读一下如何在 Java Swing 中制作适当的动画。
2) 阅读如何正确覆盖 Swing 组件 paint
方法。
3) 阅读什么是事件调度线程以及为什么必须避免阻塞它。
所以基本上几天来,我一直在尝试找出我用箭头键移动 'Superman' 对象的关键侦听器。这仅在我 /* */ 退出绘制 'moving' 道路的 while 循环时有效。一旦取消注释并且我 运行 程序,超人就不会移动,我认为这是因为循环优先于图像。我相信我需要帮助处理图像优先级。非常感谢您的帮助。
// 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
while loop
会冻结您的整个应用程序。它将继续在图形上绘制内容,但不允许 Swing 事件调度线程使用您的图形刷新屏幕。
一些建议:
1) 将 while 循环移出 paint
方法并移至单独的线程中。最好阅读一下如何在 Java Swing 中制作适当的动画。
2) 阅读如何正确覆盖 Swing 组件 paint
方法。
3) 阅读什么是事件调度线程以及为什么必须避免阻塞它。