问题描述
- 关于JAVA绘图双缓冲技术
-
package two;import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;import javax.swing.JFrame;
public class G1P2 extends JFrame{
final int WIDTH = 900,HEIGHT = 650;double p1Speed = 0.5,p2Speed=0.5; 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/9)*10,HEIGHT/9); Rectangle center = new Rectangle((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); Rectangle obstacle4 = new Rectangle(WIDTH/3,(int)(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)((HEIGHT/9)*1.5),HEIGHT/70); Rectangle p1 = new Rectangle(WIDTH/9,HEIGHT/2,WIDTH/30,WIDTH/30); Rectangle p2 = new Rectangle(((WIDTH/9)+(int)((WIDTH/9)*1.5)/2),(HEIGHT/2)+(HEIGHT/10),WIDTH/30,WIDTH/30); 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); public G1P2() { super("Radical Racing"); setSize(WIDTH/9*10,HEIGHT/9*10); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); Move1 m1 = new Move1(); Move2 m2 = new Move2(); m1.start(); m2.start(); } Image offScreenImage = null; 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, obstacle4.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); g.setColor(Color.BLUE); g.fill3DRect(p1.x, p1.y, p1.width,p1.height,true); g.setColor(Color.RED); g.fill3DRect(p2.x, p2.y, p2.width, p2.height, true); } public void update(Graphics g) { if(offScreenImage == null){ offScreenImage = this.createImage(WIDTH, HEIGHT); } Graphics gOff = offScreenImage.getGraphics(); paint(gOff); g.drawImage(offScreenImage, 0,0,null); } private class Move1 extends Thread { public void run() { while(true) { try { repaint(); if(p1Speed<=5) { p1Speed +=0.2; } p1.y-=p1Speed; Thread.sleep(75); } catch (Exception e) { // TODO Auto-generated catch block break; } } } } private class Move2 extends Thread { public void run() { while(true) { try { repaint(); if(p2Speed<=5) { p2Speed +=0.2; } p2.y-=p2Speed; Thread.sleep(75); } catch (Exception e) { // TODO Auto-generated catch block break; } } } } public static void main(String[] args) { new G1P2(); }
}
应该如何修改代码才能不闪烁!求指导。。。。
时间: 2024-10-29 06:06:02