java-关于JAVA绘图双缓冲技术

问题描述

关于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-08-02 17:27:43

java-关于JAVA绘图双缓冲技术的相关文章

C#绘图双缓冲技术总结

GDI+的双缓冲问题终于搞定了, 真是松了一口气!一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的..net 1.1 中,使用:this.SetStyle(ControlStyles.DoubleBuffer, true); .net 2.0中,使用:this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);怪不说老是提示参数无效,一直也不知道是这个问题,呵呵 要知道,图元无闪烁的实现和图元的绘制方法没有多

java的双缓冲技术

Java的强大特性让其在游戏编程和多媒体动画处理方面也毫不逊色.在Java游戏编程和动画编程中最常见的就是对于屏幕闪烁的处理.本文从J2SE的一个再现了屏幕闪烁的Java Appilication简单动画实例展开,对屏幕闪烁的原因进行了分析,找出了闪烁成因的关键:update(Graphics g)函数对于前端屏幕的清屏.由此引出消除闪烁的方法--双缓冲.双缓冲是计算机动画处理中的传统技术,在用其他语言编程时也可以实现.本文从实例出发,着重介绍了用双缓冲消除闪烁的原理以及双缓冲在Java中的两种

java中的双缓冲技术

毕业设计有个远程协助功能,得到对方的屏幕后,老是会闪,很是不爽,今天用java的双缓冲技术解决了.代码如下,本类重写了Swing中的JLabel,当Label重绘时,会默认的调用它的update方法,主要用于清除界面,然后update方法会调用paint方法,再把界面画上去,所以我现在update方法中创建了一个Image和Graphics对象Image off_screen_buf和off_screen_gc同时设置其大小和MyLabel对象的大小一样,用于把要画的东东先绘制到后台内存中,然后

【求助】关于Java中的双缓冲技术

问题描述 我尝试写一个人物行走的动画.我使用了双缓冲技术,但是屏幕仍然会闪烁,希望大家能够帮我找到其中的错误.代码如下:(1)精灵类packagesprite;importjava.awt.*;importjava.awt.image.*;importjavax.swing.*;publicclassSprite{publicintm_posX=0,m_posY=0;privateImagepic[]=null;privateintmPlayID=0;booleanmFacus=true;pub

双缓冲技术实现Android 画板应用_Android

什么是双缓冲技术?双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果. 为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容. 如何实现双缓冲?使用一个Bitmap对象保留之前的画布即可. package com.example.phonegaptest; import android.content.Context; import android.graphics.Bitmap; i

Android采用双缓冲技术实现画板_Android

本文实例为大家分享了Android实现画板的具体代码,采用的技术是双缓冲技术,供大家参考,具体内容如下 1.双缓冲技术的概念 所谓的双缓冲技术其实很简单,当程序需要在指定的View上进行绘制时,程序并不需要直接绘制到该View组件,而是先绘制到一个内存中的Bitmap图片上(就是缓冲),等内存中的Bitmap绘制好之后,再一次性将Bitmap绘制到View组件上. 2.Android采用双缓冲实现画板  实现的思路: 1).定义一个内存中图片,将他作为缓冲区Bitmap cacheBitmap

使用双缓冲技术绘制曲线图

当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘制曲线图. 双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度.双缓冲实现过程如下: 1.在内存中创建与画布一致的缓冲区 BufferBmp=new Graphics::TBitmap(); BufferBmp->Canvas->Handle=CreateCompatibleDC(Ca

使用双缓冲技术实现Android画板应用

双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果. 为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容. 如何实现双缓冲?使用一个Bitmap对象保留之前的画布即可. package com.example.phonegaptest; import android.content.Context; import android.graphics.Bitmap; import and

GDI绘图 双缓冲贴图 电脑死机

问题描述 GDI绘图 双缓冲贴图 电脑死机 绘图的时候使用了双缓冲贴图 然后自己定义了一个透明贴图的函数DrawTransBitmap,贴图成功了,但是程序一运行内存就飞速增长.不关的话马上就死机了,小白一枚 求各位大神帮忙 万分感激 解决方案 case WM_PAINT: hdc = GetDC(hwnd); mdc = CreateCompatibleDC(hdc); bufdc = CreateCompatibleDC(hdc); bufdc2 = CreateCompatibleDC(h