2 qq 31674229 qq_31674229 于 2016.04.11 18:26 提问

用java写了一个键盘监听,实现一张图片的上下左右移动,为什么图片会出现一闪一闪的,大神求解

package Fly;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**

  • 1.设置游戏窗口
  • 2.
  • @author q * */ public class OperateFly extends JFrame{ protected static int WIDTH=1000; protected static int HEIGHT=600; private Timer timer; private static int intervel=10; private Flyings flys=new Flyings(); public static BufferedImage fly1; public static BufferedImage background; public static BufferedImage begin_one; public static BufferedImage gameover; public static BufferedImage begin_two; public static BufferedImage begin_three;

static{
try{
fly1=ImageIO.read(new File("images/fyls1.png"));
background=ImageIO.read(new File("images/background.png"));
begin_one=ImageIO.read(new File("images/firstbegin.png"));
begin_two=ImageIO.read(new File("images/SecondBegin.png"));
begin_three=ImageIO.read(new File("images/ThreeBegin.png"));
}catch(Exception e){
e.printStackTrace();
}
}

public OperateFly(){
//窗口
JPanel panel=new JPanel();
this.setSize(WIDTH, HEIGHT);
this.add(panel);//将面板添加到窗口中
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);

this.addKeyListener(new KeyAdapter(){
    @Override
    public void keyPressed (KeyEvent e) {
            switch(e.getKeyCode()){
            //上移
            case KeyEvent.VK_W:
            case KeyEvent.VK_UP:
                System.out.println(e.getKeyCode());
                flys.moveup();
                break;
            //下移
            case KeyEvent.VK_S:
            case KeyEvent.VK_DOWN:
                flys.movedown();
                break;
            //左移
            case KeyEvent.VK_A:
            case KeyEvent.VK_LEFT:
                flys.moveleft();
                break;
            case KeyEvent.VK_D:
            case KeyEvent.VK_RIGHT:
                flys.moveright();
                break;
            default:
                System.out.println(e.getKeyCode());
            }   
    }
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }
});

}
/*

  • 画图
    /
    public void paint(Graphics g){
    g.drawImage(background,0,0,WIDTH,HEIGHT,null);
    paintfly(g);
    }
    /
    画飞行器*/
    public void paintfly(Graphics g){
    g.drawImage(fly1,flys.getX(),flys.getY(),flys.getWidth(),flys.getHeight(),null);
    }
    public static void main(String[] args){

    JFrame frame=new JFrame("FLY");
    OperateFly operatefly=new OperateFly();
    operatefly.action();
    }
    public void action(){
    timer=new Timer();
    timer.schedule(new TimerTask(){

    @Override
    public void run() {
    
        repaint();       //重画
    
    }},intervel,intervel);
    

    }
    }

下面是Flyings类

package Fly;

import java.awt.image.BufferedImage;

import FlyingObject.FlyingsObject;

/*

  • 飞行工具类
    */
    public class Flyings extends FlyingsObject{
    private static final int Speedx=2;
    private static final int Speedy=2;
    private int life;
    public Flyings(){
    image=OperateFly.fly1;
    life=3;
    width=600;
    height=400;
    x=598;
    y=356;
    }
    @Override
    public void moveup() {
    this.x=x;
    this.y-=Speedy;
    if(OutofBoundsY()){
    this.y=getY();
    }

    }
    @Override
    public void movedown() {
    this.x=x;
    this.y+=Speedy;
    if(OutofBoundsY()){
    this.y=getY();
    }
    }
    @Override
    public void moveleft() {
    this.x-=Speedx;
    this.y=y;
    if(OutofBoundsY()){
    this.x=getX();
    }
    }
    @Override
    public void moveright() {
    this.x+=Speedx;
    this.y=y;
    if(OutofBoundsY()){
    this.x=getX();
    }
    }
    /*上下越界判断*/
    public boolean OutofBoundsY(){
    return this.y>OperateFly.HEIGHT-getHeight()||this.y }
    /*左右越界判断*/
    public boolean OutofBoundsX(){
    return this.x>OperateFly.WIDTH-getWidth()||this.x<0;
    }
    }

4个回答

Meditator_hkx
Meditator_hkx   Rxr 2016.04.11 21:54

我没写过图片类的监听,不过原理应该都是一样的。我想问下,全部源代码都是你自己写的吗?还是借鉴了别的什么?

bbwolfcool
bbwolfcool   2016.04.11 22:48

图片的移动就会窗体重绘,怎么可能不闪,如果要不闪,要么用direct draw 2D,要么用矢量模型,比如flash,要么微软的slivelight

qinjisheng_11
qinjisheng_11   2016.04.11 23:30

在repaint和paint之间的update中写入双缓冲,先在一个图片画完所有所有该画的,然后再把图片上所有内容copy到界面上,消除闪烁现象。可以参考我的坦克大战内容,里面也有消除闪烁现象坦克大战

u013189927
u013189927   2016.04.13 22:12

用双缓冲技术可以解决闪烁问题,具体请看博文:http://blog.csdn.net/u013189927/article/details/51007304

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
解决java中GUI的闪烁问题
今天在做坦克大战这个小游戏的时候发现额这个问题,我想添加一张背景图片到java窗口中去,然后用线程器懂paint方法的时候发现屏幕一直在频闪,如图所示 查阅资料, 得出问题原因: 刷新的频率太快,paint方法还没有完成,下一个方法又来了... 解决方法: 首先我们要了解paint()是由update()调用出来的,而update()是由repaint()调用出来的 在awt中
移动端屏幕点击出现闪烁的阴影解决方法
html,body{-webkit-text-size-adjust: 100%;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}  
实现网页图片不断闪烁
-
Android实现眼睛一闪一闪的效果,使用layerdrawable,类似GIF图片效果
Android中要实现猫咪眼睛一眨一眨的效果,可能首先会想到使用GIF图片,不考虑内存消耗的话你可以选择这个。 今天,跟大家介绍另一种图片加载,方便实用:layerdrawable。 它怎么使用? 在你的drawable文件夹下创建名为layer_cat.xml android:id="@+id/one" android:drawable="@drawable/icon_ch
如何解决绘图过程中的闪烁
在VC中进行绘图过程处理时,如果图形刷新很快, 经常出现图形闪烁的现象。利用先在内存绘制,然后 拷贝到屏幕的办法可以消除屏幕闪烁,具体的方法是先在内存 中创建一个与设备兼容的内存设备上下文,也就是开辟一快内 存区来作为显示区域,然后在这个内存区进行绘制图形。在绘制完成后利用 BitBlt函数把内存的图形直接拷贝到屏幕上即可。 具体的代码实现为: (1)创建内存区域 CDC* p
Java双缓冲机制--如何消除坦克大战中景物的闪烁和白条
<br />   个人经验,写下来会加深自己的记忆,同时看看自己的日志还可以复习一下,也和大家一起分享!<br /> <br />             大家都知道,Java SE不比Java ME.ME中已经内置使用了双缓冲的机制(部分老式手机不支持),而Java SE中的双缓冲机制则要自己来实现。做过Java桌面游戏的人可能会发现,如果不用双缓冲,在很多时候会出现白色画面一闪而过,这就是因为图像正在绘制而没绘制完,却提前显示在窗口内造成的。解决这种情况就需要使用双缓冲机制。<br /> <br
java用键盘的方向键控制一个图形块推着另一个图形块移动
 /* 一个图形推着另一个图形移动 */  import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  public class Ex3_2extends JFrame   {    public Ex3_2()     {  super("推着另一图形移动
使用Canvas画一闪一闪的星星吧~
初学Canvas写了一个在一片区域内随机产生星星并且不断闪动的效果。具体实现如下所示。 首先创建一个canvas让其适配屏幕的大小。 h = screen.height - 200; w = screen.width - 10; can1 = document.getElementById("canvas1"); can1.setAttribute('widt
Java霓虹灯字,就是字体一闪一闪的样子
用Java实现霓虹灯字符 字体一闪一闪的样子 applet
java事件机制之通过上下左右键来控制小球为位置的移动演示
/** * 功能是加深对事件处理机制的理解 * 1:通过上下左右键来控制小球为位置的移动 */package com.test4;import java.awt.*;import javax.swing.*;import java.awt.event.*;public class Demo9_4 extends JFrame { MyPanel mp=null; public static voi