Java的JFrame与Frame问题,求解~ 100

有个问题,在用Java写坦克大战的时候遇到的,因为要用键盘控制坦克移动,我是直接在JFrame上面画的tank,开一个线程调用repaint方法,我每次移动一下tank,... 有个问题,在用Java写坦克大战的时候遇到的,因为要用键盘控制坦克移动,我是直接在JFrame上面画的tank,开一个线程调用repaint方法,我每次移动一下tank,就会重画一次tank的位置,但是只要我移动tank,屏幕就会闪烁,是爆闪!设置线程的睡眠时间效果也不明显,tank原地不动也是偶尔闪,只要移动就会爆闪,几乎看不见tank了,双缓冲也加上了,一点用的没有,求救!(顺便说下,直接在Frame上面画tank,运行就不闪,移动也不闪,在JFrame上面就不行!)加分!下面贴上线程和双缓冲的代码
private class TankMove implements Runnable{ //线程调用repaint
public void run() {
while(true){
repaint();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public void paint(Graphics g){
super.paint(g);
myTank.draw(g);
}

public void update(Graphics g) {
super.update(g);
if(offScreenImage == null){
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
gOffScreen.drawImage(offScreenImage, 0, 0, null);
}
展开
 我来答
btboy1978
2017-02-14 · TA获得超过2015个赞
知道大有可为答主
回答量:2950
采纳率:57%
帮助的人:983万
展开全部
public void paint(Graphics g) {     
        // 在重绘函数中实现双缓冲机制     
        offScreenImage = this.createImage(WIDTH, HEIGHT);     
        // 获得截取图片的画布     
        gImage = offScreenImage.getGraphics();     
        // 获取画布的底色并且使用这种颜色填充画布,如果没有填充效果的画,则会出现拖动的效果     
        gImage.setColor(gImage.getColor());     
        gImage.fillRect(0, 0, WIDTH, HEIGHT); // 有清楚上一步图像的功能,相当于gImage.clearRect(0, 0, WIDTH, HEIGHT)     
    
        // 调用父类的重绘方法,传入的是截取图片上的画布,防止再从最底层来重绘     
        super.paint(gImage);     
    
        // 当游戏没有结束的时候绘出对战双方     
        if (!getGameOver()) {     
            // 画出自己的坦克     
            paintMyTank(gImage);     
            // 画出自己坦克发射的子弹     
            paintMyBullet(gImage);     
            // 画出敌方坦克     
            paintEnemyTank(gImage);     
            // 画出敌方坦克发射的子弹     
            paintEnemyBullet(gImage);     
        }     
    
        // 画出草地     
        paintGrass(gImage);     
        // 画出小河     
        paintRiver(gImage);     
        // 画出石头     
        paintStone(gImage);     
        // 画出各种道具     
        paintTool(gImage);     
    
        // 将接下来的图片加载到窗体画布上去,才能考到每次画的效果     
        g.drawImage(offScreenImage, 0, 0, null);     
    }
追问

不行,按照你这么改也不行,一点用都没有,我的代码贴不上来,超出字数限制,直接给你上图吧

追答
把代码里的 g   改成  offScreenImage试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式