尹天遐 2016-04-11 10:26 采纳率: 0%
浏览 4227

用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条回答

  • bbwolfcool 2016-04-11 14:48
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)