黑马程序员技术交流社区

标题: 请问repaint();刷新频率太低,怎么能提高频率让屏幕不再闪烁? [打印本页]

作者: dongyangzhang    时间: 2013-4-15 17:28
标题: 请问repaint();刷新频率太低,怎么能提高频率让屏幕不再闪烁?
本帖最后由 dongyangzhang 于 2013-4-15 18:05 编辑
  1. 自己参考书上仿照着写的双人赛车游戏,刷新频率实在是太低了,屏幕闪烁的晃眼,求助怎么解决重绘游戏屏幕是闪烁的问题?
  2. package S1P9;
  3. //导入所需要的软件包
  4. import javax.swing.*;
  5. import javax.swing.event.*;
  6. import java.awt.*;
  7. import java.awt.event.*;
  8. //创建的类S1P9继承于JFrame
  9. public class S1P9 extends JFrame {
  10. /**
  11.   * @param args
  12.   */
  13. //通过调用构造方法运行该程序
  14. public static void main(String[] args) {
  15.   // TODO Auto-generated method stub
  16.   new S1P9();
  17. }
  18. //设置游戏屏幕大小
  19. final int WIDTH = 900, HEIGHT = 650;



  20. double p1Speed=.5,p2Speed=.5;
  21. Rectangle p1=new Rectangle(WIDTH/9,HEIGHT/2,WIDTH/30,WIDTH/30);
  22. //下面的矩形代表第二辆赛车
  23. Rectangle p2=new Rectangle(((WIDTH/9)+(int)(((WIDTH/9)*1.5)/2)),(HEIGHT/2)+(HEIGHT/10),WIDTH/30,WIDTH/30);


  24. /*下面是待绘制的矩形*/
  25. /*
  26.   *创建矩形的代码起初看起来有点复杂,但是各个矩形的创建大同小异,它们的大小都是取决于WIDTH和HEIGHT的属性值
  27.   */
  28. //下面的矩形分别表示赛场的左右上下部分,以及赛场中央区域
  29. Rectangle left=new Rectangle(0,0,WIDTH/9,HEIGHT);
  30. Rectangle right=new Rectangle((WIDTH/9)*9,0,WIDTH/9,HEIGHT);
  31. Rectangle top=new Rectangle(0,0,WIDTH,HEIGHT/9);
  32. Rectangle bottom=new Rectangle(0,HEIGHT/9*9,(WIDTH/9)*10,HEIGHT/9);
  33. Rectangle center = new Rectangle((int)((WIDTH/9)*2.5),(int)((HEIGHT/9)*2.5),(int)((WIDTH/9)*5),(int)((HEIGHT/9)*4));
  34. //下面的矩形用于绘制跑道上的障碍物,以增加赛车的难度
  35. Rectangle obstacle=new Rectangle(WIDTH/2,(int)((HEIGHT/9)*7),WIDTH/10,HEIGHT/9);
  36. Rectangle obstacle2=new Rectangle(WIDTH/3,(int)((HEIGHT/9)*5),WIDTH/10,HEIGHT/4);
  37. Rectangle obstacle3=new Rectangle(2*(WIDTH/3),(int)((HEIGHT/9)*5),WIDTH/10,HEIGHT/4);
  38. Rectangle obstacle4=new Rectangle(WIDTH/3,HEIGHT/9,WIDTH/30,HEIGHT/9);
  39. Rectangle obstacle5=new Rectangle(WIDTH/2,(int)((HEIGHT/9*1.5)),WIDTH/30,HEIGHT/4);
  40. //下面的矩形用于绘制内外跑道的终点线
  41. Rectangle finish=new Rectangle(WIDTH/9,(HEIGHT/2)-(HEIGHT/9),(int)((WIDTH/9)*1.5),(HEIGHT/70));
  42. //下面的矩形用于绘制外跑道的起跑线
  43. Rectangle line0=new Rectangle(WIDTH/9,HEIGHT/2,(int)((WIDTH/9)*1.5)/2,HEIGHT/140);
  44. //下面的矩形用于绘制内跑道的起跑线
  45. Rectangle line1=new Rectangle(((WIDTH/9)+((int)((WIDTH/9)*1.5)/2)),(HEIGHT/2)+(HEIGHT/10),(int)((WIDTH/9)*1.5)/2,HEIGHT/140);
  46. //构造方法
  47. public S1P9(){
  48.   //使用下列代码设置JFrame
  49.   super("Radical Racing");
  50.   setSize(WIDTH/9*10,HEIGHT/9*10);
  51.   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  52.   setVisible(true);
  53.   Move1 m1=new Move1();
  54.   Move2 m2=new Move2();
  55.   m1.start();
  56.   m2.start();
  57. }
  58. private class Move1 extends Thread{
  59.   public void run(){
  60.    //通过永久循环语句让赛车1不断向前行驶
  61.    while(true){
  62.     //用try...catch语句捕捉异常,如果运行出错,退出循环
  63.     try{
  64.      //刷新游戏屏幕
  65.      repaint(0);
  66.      //赛车行驶中加速
  67.      if(p1Speed<=5){
  68.       p1Speed+=.2;
  69.      }
  70.      p1.y-=p1Speed;
  71.      //设置每次加速的间隔时间
  72.      Thread.sleep(75);
  73.     }catch(Exception e){
  74.      //如果程序运行出错,那么退出循环
  75.      break;
  76.     }
  77.    }
  78.   }
  79. }
  80. private class Move2 extends Thread{
  81.   public void run(){
  82.    //通过永久循环语句让赛车2不断向前行驶
  83.    while(true){
  84.     //用try...catch语句捕捉异常,如果运行出错,退出循环
  85.     try{
  86.      //刷新游戏屏幕
  87.      repaint(0);
  88.      //赛车行驶中加速
  89.      if(p2Speed<=5){
  90.       p2Speed+=.2;
  91.      }
  92.      p2.y-=p2Speed;
  93.      //设置每次加速的间隔时间
  94.      Thread.sleep(75);
  95.     }catch(Exception e){
  96.      //如果程序运行出错,那么退出循环
  97.      break;
  98.     }
  99.    }
  100.   }
  101. }
  102. //该方法用于绘制赛车和赛场
  103. public void paint(Graphics g){
  104.   super.paint(g);
  105.   //绘制赛场背景
  106.   g.setColor(Color.DARK_GRAY);
  107.   g.fillRect(0, 0, WIDTH, HEIGHT);
  108.   //绘制时,先将场地设置为绿色
  109.   g.setColor(Color.GREEN);
  110.   //现在绘制各个矩形
  111.   g.fillRect(left.x, left.y, left.width, left.height);
  112.   g.fillRect(right.x, right.y, right.width, right.height);
  113.   g.fillRect(top.x, top.y, top.width, top.height);
  114.   g.fillRect(bottom.x, bottom.y, bottom.width, bottom.height);
  115.   g.fillRect(center.x, center.y, center.width, center.height);
  116.   g.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
  117.   g.fillRect(obstacle2.x, obstacle2.y, obstacle2.width, obstacle2.height);
  118.   g.fillRect(obstacle3.x, obstacle3.y, obstacle3.width, obstacle3.height);
  119.   g.fillRect(obstacle4.x, obstacle4.y, obstacle4.width, obstacle4.height);
  120.   g.fillRect(obstacle5.x, obstacle5.y, obstacle5.width, obstacle5.height);
  121.   //设置起跑线为白色
  122.   g.setColor(Color.WHITE);
  123.   //绘制起跑线
  124.   g.fillRect(line0.x, line0.y, line0.width, line0.height);
  125.   g.fillRect(line1.x, line1.y, line1.width, line1.height);
  126.   //设置终点线为黄色
  127.   g.setColor(Color.YELLOW);
  128.   //绘制终点线
  129.   g.fillRect(finish.x, finish.y, finish.width, finish.height);
  130.   
  131.   
  132.   g.setColor(Color.RED);
  133.   //绘制赛车1
  134.   g.fill3DRect(p1.x, p1.y, p1.width, p1.height,true);
  135.   //设置赛车2为黑色
  136.   g.setColor(Color.BLACK);
  137.   //绘制赛车2
  138.   g.fill3DRect(p2.x, p2.y, p2.width, p2.height, true);
  139. }
  140. }



  141. <p> </p>
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2