重漆留下痕迹 [英] Repaint leaves trail
问题描述
我知道这不是第一次提出这个问题,但答复对我没有太大的帮助,所以我正在帮助我终于得到我的答案
我制作了这个小型游戏,我在车道周围驾驶汽车(使用矩形是强制性的)。当我使用 repaint()
metod表示新位置的汽车重新绘制的矩形,但后面留下了一条痕迹。
我有这样的代码:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings(serial)
public class MAP extends JFrame
{
//常量用于屏幕大小并用于绘制terrain
final int WIDTH = 900,HEIGHT = 650;
//为图片设计的URL和Img
URL cLeft,cRight,cUp;
Image img1,img2,img3;
//这些会记录每位玩家的速度:
double p1Speed = .5;
//这些是表示方向的整数:
final int UP = 0,RIGHT = 1,DOWN = 2,LEFT = 3;
//这些会跟踪玩家的方向(默认值=上)
int p1Direction = 0;
JPanel面板;
//绘制地形
Rectangle left = new Rectangle(0,0,WIDTH / 9,HEIGHT);
Rectangle right = new Rectangle((WIDTH / 9)* 9,0,WIDTH / 9,HEIGHT);
Rectangle top = new Rectangle(0,0,WIDTH,HEIGHT / 9);
Rectangle bottom = new Rectangle(0,(HEIGHT / 9)* 9,WIDTH,HEIGHT / 9); (int)((WIDTH / 9)* 2.5),(int)((HEIGHT / 9)* 2.5),(int)((WIDTH / 9)* 5),( HEIGHT / 9)* 4);
//这些障碍会阻碍路径并使导航变得更加困难
Rectangle obstacle = new
Rectangle(WIDTH / 2,(int)((HEIGHT / 9)* 7) ,WIDTH / 10,HEIGHT / 9);
Rectangle obstacle2 = new
Rectangle(WIDTH / 3,(int)((HEIGHT / 9)* 5),WIDTH / 10,HEIGHT / 4);
Rectangle obstacle3 = new
Rectangle(2 *(WIDTH / 3),(int)((HEIGHT / 9)* 5),WIDTH / 10,HEIGHT / 4);
矩形障碍物4 =新的矩形(WIDTH / 3,HEIGHT / 9,WIDTH / 30,HEIGHT / 9);
Rectangle obstacle5 = new Rectangle(WIDTH / 2,(int)((HEIGHT / 9)* 1.5),WIDTH / 30,HEIGHT / 4);
Rectangle finish = new Rectangle(WIDTH / 9,(HEIGHT / 2) - HEIGHT / 9,(int)((WIDTH / 9)* 1.5),HEIGHT / 70);
Rectangle lineO = new Rectangle(WIDTH / 9,HEIGHT / 2,(int)((WIDTH / 9)* 1.5)/ 2,HEIGHT / 140);
Rectangle lineI = new Rectangle(((WIDTH / 9)+((int)((WIDTH / 9)* 1.5)/ 2)),(HEIGHT / 2)+(HEIGHT / 10) ((WIDTH / 9)* 1.5)/ 2,HEIGHT / 140);
//这是玩家1(外部)车的矩形:
矩形p1 =新矩形(WIDTH / 9,HEIGHT / 2,WIDTH / 30,WIDTH / 30);
public MAP(){
super(Radical Racing);
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setResizable(false);
setVisible(true);
setLocationRelativeTo(null);
//下面的代码创建了JFrame
try
{
cUp = this.getClass()。getResource(carUp .JPG);
cLeft = this.getClass()。getResource(carLeft.jpg);
cRight = this.getClass()。getResource(carRight.jpg);
} catch(Exception e)
{}
//将URL附加到图像
img1 = Toolkit.getDefaultToolkit()。getImage(cUp);
img2 = Toolkit.getDefaultToolkit()。getImage(cLeft);
img3 = Toolkit.getDefaultToolkit()。getImage(cRight);
panel = new JPanel(){
public void paint(Graphics g)
{
//super.paint(g);
//绘制跑道的背景
g.setColor(Color.DARK_GRAY);
g.fillRect(0,0,WIDTH,HEIGHT);
//绘制时,边框为绿色
g.setColor(Color.GREEN);
//填充矩形
g.fillRect(left.x,left.y,left.width,left.height);
g.fillRect(right.x,right.y,right.width,right.height);
g.fillRect(top.x,top.y,top.width,top.height);
g.fillRect(bottom.x,bottom.y,bottom.width,bottom.height);
g.fillRect(center.x,center.y,center.width,center.height);
g.fillRect(obstacle.x,obstacle.y,obstacle.width,obstacle.height);
g.fillRect(obstacle2.x,obstacle2.y,obstacle2.width,obstacle2.height);
g.fillRect(obstacle3.x,obstacle3.y,obstacle3.width,obstacle3.height);
g.fillRect(obstacle4.x,obstacle4.y,obstacle3.width,obstacle4.height);
g.fillRect(obstacle5.x,obstacle5.y,obstacle5.width,obstacle5.height);
//设置起始线的颜色为白色
g.setColor(Color.WHITE);
//现在绘制出发线
g.fillRect(lineO.x,lineO.y,lineO.width,lineO.height);
g.fillRect(lineI.x,lineI.y,lineI.width,lineI.height);
//设置终点线的颜色为黄色
g.setColor(Color.YELLOW);
//现在绘制终点线
g.fillRect(finish.x,finish.y,finish.width,finish.height);
//为p1设置颜色为蓝色
g.setColor(Color.WHITE);
//现在绘制实际玩家
g.fill3DRect(p1.x,p1.y,p1.width,p1.height,true);
//为玩家绘制图片
if(p1Direction == UP)
g.drawImage(img1,p1.x,p1.y,this);
if(p1Direction == LEFT)
g.drawImage(img2,p1.x,p1.y,this);
if(p1Direction == RIGHT)
g.drawImage(img3,p1.x,p1.y,this);
}
};
panel.setPreferredSize(新维(950,600));
this.add(panel);
pack();
Move1 move = new Move1();
move.start();
$ b private class Move1 extends Thread implements KeyListener
{
public void run()
{
// now ,这应该都是无限循环,所以过程
//重复
addKeyListener(this);
while(true)
{
//现在,将代码放在try块中。如果出现错误,这将让
//程序退出
//。
try
{
//增加速度
// if(p1Speed< = 5)
// p1Speed + =。2;
//p1.y-=(int)p1Speed;
if(p1.intersects(left)|| p1.intersects(right)|| p1.intersects(top)||
p1.intersects(bottom)|| p1.intersects(obstacle)|| p1.intersects(obstacle2)||
p1.intersects(obstacle3)|| p1.intersects(obstacle4)|| p1.intersects(obstacle5))
{
p1Speed = -5;
}
//如果汽车碰到中心,按照
//的方法做同样的事情,但是速度为-2.5。
if(p1.intersects(center))
{
p1Speed = -2.5;
}
//增加速度
if(p1Speed <= 5)
p1Speed + =。2;
//这些会根据方向
移动播放器if(p1Direction == UP)
{
p1.y - =(int)p1Speed;
if(p1Direction == DOWN)
{
p1.y + =(int)p1Speed;
if(p1Direction == LEFT)
{
p1.x - =(int)p1Speed;
if(p1Direction == RIGHT)
{
p1.x + =(int)p1Speed;
}
panel.repaint();
//延迟刷新率:
Thread.sleep(200);
}
catch(Exception e)
{
//如果有异常(错误),退出循环。
休息;
$ b @Override
public void keyPressed(KeyEvent arg0){
// TODO自动生成方法存根
}
@Override
public void keyReleased(KeyEvent arg0){
// TODO自动生成的方法存根
}
$ b $ @Override
public void keyTyped(KeyEvent event){
if(event.getKeyChar()=='a')
{
p1Direction =左;
$ b if(event.getKeyChar()=='s')
{
p1Direction = DOWN;
if(event.getKeyChar()=='d')
{
p1Direction = RIGHT;
if(event.getKeyChar()=='w')
{
p1Direction = UP;
}
}
}
//这通过调用构造函数启动程序:
public static void main(String [] args)
{
新MAP();
$ / code $ / pre
解决方案 Uncomment在绘画方法中使用super.paint(g)[line 87]。
它负责清除所有陈旧对象的画布。
I know that this isn't the first time that this question has been asked, but the responses haven't helped me much, so I am helping I am finally going to get my answer
I have made this little game where I have made a car drive around a track (using rectangles was mandatory). When I use the repaint()
metod the rectangle representing the car repaints in the new location, but leaves a trail behind.
I have this code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MAP extends JFrame
{
//constant for the screen size and used for the drawing the terrain
final int WIDTH = 900, HEIGHT = 650;
//the URL and Img designed for the images
URL cLeft,cRight,cUp;
Image img1,img2,img3;
//these will keep track of each player’s speed:
double p1Speed =.5;
//these are ints that represent directions:
final int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3;
//these will keep track of the player’s directions (default = up)
int p1Direction = 0;
JPanel panel;
//draw the terrain
Rectangle left = new Rectangle(0,0,WIDTH/9,HEIGHT);
Rectangle right = new Rectangle((WIDTH/9)*9,0,WIDTH/9,HEIGHT);
Rectangle top = new Rectangle(0,0,WIDTH, HEIGHT/9);
Rectangle bottom = new Rectangle(0,(HEIGHT/9)*9,WIDTH,HEIGHT/9);
Rectangle center = new Rectangle((int)((WIDTH/9)*2.5),(int)((HEIGHT/9)*2.5),(int)((WIDTH/9)*5),(HEIGHT/9)*4);
//these obstacles will obstruct the path and make navigating harder
Rectangle obstacle = new
Rectangle(WIDTH/2,(int)((HEIGHT/9)*7),WIDTH/10,HEIGHT/9);
Rectangle obstacle2 = new
Rectangle(WIDTH/3,(int)((HEIGHT/9)*5),WIDTH/10,HEIGHT/4);
Rectangle obstacle3 = new
Rectangle(2*(WIDTH/3),(int)((HEIGHT/9)*5),WIDTH/10,HEIGHT/4);
Rectangle obstacle4 = new Rectangle(WIDTH/3,HEIGHT/9,WIDTH/30,HEIGHT/9);
Rectangle obstacle5 = new Rectangle(WIDTH/2,(int)((HEIGHT/9)*1.5),WIDTH/30,HEIGHT/4);
Rectangle finish = new Rectangle(WIDTH/9,(HEIGHT/2)-HEIGHT/9,(int)((WIDTH/9)*1.5),HEIGHT/70);
Rectangle lineO=new Rectangle(WIDTH/9,HEIGHT/2,(int)((WIDTH/9)*1.5)/2,HEIGHT/140);
Rectangle lineI = new Rectangle(((WIDTH/9)+((int)((WIDTH/9)*1.5)/2)),(HEIGHT/2)+(HEIGHT/10),(int)((WIDTH/9)*1.5)/2, HEIGHT/140);
//this is the rectangle for player 1’s (outer) car:
Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2, WIDTH/30,WIDTH/30);
public MAP(){
super("Radical Racing");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setResizable(false);
setVisible(true);
setLocationRelativeTo(null);
//the following code creates the JFrame
try
{
cUp = this.getClass().getResource("carUp.jpg");
cLeft = this.getClass().getResource("carLeft.jpg");
cRight = this.getClass().getResource("carRight.jpg");
}catch(Exception e)
{}
//attach the URLs to the images
img1 = Toolkit.getDefaultToolkit().getImage(cUp);
img2 = Toolkit.getDefaultToolkit().getImage(cLeft);
img3 = Toolkit.getDefaultToolkit().getImage(cRight);
panel=new JPanel(){
public void paint(Graphics g)
{
//super.paint(g);
//draw the background for the racetrack
g.setColor(Color.DARK_GRAY);
g.fillRect(0,0,WIDTH,HEIGHT);
//when we draw, the border will be green
g.setColor(Color.GREEN);
//fill rectangle
g.fillRect(left.x,left.y,left.width,left.height);
g.fillRect(right.x,right.y,right.width,right.height);
g.fillRect(top.x,top.y,top.width,top.height);
g.fillRect(bottom.x,bottom.y,bottom.width,bottom.height);
g.fillRect(center.x,center.y,center.width,center.height);
g.fillRect(obstacle.x,obstacle.y,obstacle.width,obstacle.height);
g.fillRect(obstacle2.x,obstacle2.y,obstacle2.width,obstacle2.height);
g.fillRect(obstacle3.x,obstacle3.y,obstacle3.width,obstacle3.height);
g.fillRect(obstacle4.x,obstacle4.y,obstacle3.width,obstacle4.height);
g.fillRect(obstacle5.x,obstacle5.y,obstacle5.width,obstacle5.height);
//set the starting line color to white
g.setColor(Color.WHITE);
//now draw the starting line
g.fillRect(lineO.x,lineO.y,lineO.width,lineO.height);
g.fillRect(lineI.x,lineI.y,lineI.width,lineI.height);
//set the color of the finish line to yellow
g.setColor(Color.YELLOW);
//now draw the finish line
g.fillRect(finish.x,finish.y,finish.width,finish.height);
//set the color to blue for p1
g.setColor(Color.WHITE);
//now draw the actual player
g.fill3DRect(p1.x,p1.y,p1.width,p1.height,true);
//draw the images for the player
if(p1Direction==UP)
g.drawImage(img1,p1.x,p1.y,this);
if(p1Direction==LEFT)
g.drawImage(img2,p1.x,p1.y,this);
if(p1Direction==RIGHT)
g.drawImage(img3,p1.x,p1.y,this);
}
};
panel.setPreferredSize(new Dimension(950,600));
this.add(panel);
pack();
Move1 move=new Move1();
move.start();
}
private class Move1 extends Thread implements KeyListener
{
public void run()
{
//now, this should all be in an infinite loop, so the process
//repeats
addKeyListener(this);
while(true)
{
//now, put the code in a try block. This will let the
//program exit
//if there is an error.
try
{
//increase speed a bit
// if(p1Speed<=5)
// p1Speed+=.2;
//p1.y-=(int) p1Speed;
if(p1.intersects(left) || p1.intersects(right) || p1.intersects(top) ||
p1.intersects(bottom) || p1.intersects(obstacle) || p1.intersects(obstacle2)||
p1.intersects(obstacle3) || p1.intersects(obstacle4) || p1.intersects(obstacle5))
{
p1Speed = -5;
}
//if the car hits the center, do the same as above
//but make the speed -2.5.
if(p1.intersects(center))
{
p1Speed = -2.5;
}
//increase speed a bit
if(p1Speed<=5)
p1Speed+=.2;
//these will move the player based on direction
if(p1Direction==UP)
{
p1.y-=(int)p1Speed;
}
if(p1Direction==DOWN)
{
p1.y+=(int)p1Speed;
}
if(p1Direction==LEFT)
{
p1.x-=(int)p1Speed;
}
if(p1Direction==RIGHT)
{
p1.x+=(int)p1Speed;
}
panel.repaint();
//this delays the refresh rate:
Thread.sleep(200);
}
catch(Exception e)
{
//if there is an exception (an error), exit the loop.
break;
}
}
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent event) {
if(event.getKeyChar()=='a')
{
p1Direction = LEFT;
}
if(event.getKeyChar()=='s')
{
p1Direction = DOWN;
}
if(event.getKeyChar()=='d')
{
p1Direction = RIGHT;
}
if(event.getKeyChar()=='w')
{
p1Direction = UP;
}
}
}
//this starts the program by calling the constructor:
public static void main (String[ ] args)
{
new MAP();
}
}
解决方案 Uncomment super.paint(g) [line 87] in your paint method.
It is responsible for clearing the canvas of any stale objects.
这篇关于重漆留下痕迹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!