Java 在我移动某物之前不画画

Java 在我移动某物之前不画画,java,swing,paint,Java,Swing,Paint,在我尝试制作的游戏中,在我移动角色之前,图像不会被绘制 这是我的密码: import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.K

在我尝试制作的游戏中,在我移动角色之前,图像不会被绘制

这是我的密码:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ForgottenMain extends JPanel implements KeyListener,MouseListener{
    /**
     * 
     */
    private static final int TIMER_DELAY = 35;
    private static final long serialVersionUID = -4926251405849574401L;
    public static BufferedImage attic,flashlight,player,killer;
    public static boolean up,down,left,right,inAttic;
    public static int px,py,kx,ky;
    public static int spawnLocation;
    public static JFrame frame = new JFrame("Forgotten");
    public static void main(String[] args){
        inAttic = true;
        px = 600;
        py = 400;
        frame.setSize(1200,800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.add(new ForgottenMain());
    }
    public ForgottenMain(){
        init();
    }
    public void init(){
        setSize(1200,800);
        setVisible(true);
        frame.addKeyListener(this);
        frame.addMouseListener(this);
        try{    
            player = ImageIO.read(new File("char.png"));
            flashlight = ImageIO.read(new File("flashlightimage.png"));
            attic = ImageIO.read(new File("attic.png"));
            killer = ImageIO.read(new File("killer.png"));
        } catch (Exception e){
            e.printStackTrace();
        }


        // Gameloop
          new javax.swing.Timer(TIMER_DELAY, new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                    gameLoop();
                 }
              }).start();   
    }
    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        int fx = px - 1033;
        int fy = py - 635;
        kx = 500;
        ky = 500;
        // Removes the flickering of the images
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        // Resets the screen to make sure that it only shows the character once
        g2.clearRect(0, 0, 1200, 800);
        // Draws the background attic
        g2.drawImage(attic,0,0,this);
        // Draws the player
        g2.drawImage(player, px, py, this);
        // Draws the Serial Killer
        g2.drawImage(killer, kx, ky, this);
        // Draws the flashlight
        g2.drawImage(flashlight, fx, fy, this);
        System.out.println(px + " " + py);
    }
    public void gameLoop(){
        if(up == true && py > 88){
            py-=4;
            repaint();
        }
        if(down == true && py < 604){
            py+=4;
            repaint();
        }
        if(left == true && px > 80){
            px-=4;
            repaint();
        }
        if(right == true && px < 1028){
            px+=4;
            repaint();
        }
    }
    @Override
    public void mouseClicked(MouseEvent arg0) {
        System.out.println("MouseLocation: " + arg0.getX() + ", " + arg0.getY());
    }
    @Override
    public void mouseEntered(MouseEvent arg0) {

    }
    @Override
    public void mouseExited(MouseEvent arg0) {

    }
    @Override
    public void mousePressed(MouseEvent arg0) {

    }
    @Override
    public void mouseReleased(MouseEvent arg0) {

    }
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == 87){
            up = true;
        }
        if(e.getKeyCode() == 83){
            down = true;
        }
        if(e.getKeyCode() == 65){
            left = true;
        }
        if(e.getKeyCode() == 68){
            right = true;
        }

    }
    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == 87){
            up = false;
        }
        if(e.getKeyCode() == 83){
            down = false;
        }
        if(e.getKeyCode() == 65){
            left = false;
        }
        if(e.getKeyCode() == 68){
            right = false;
        }

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }
}
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.RenderingHints;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类ForgottenMain扩展了JPanel实现了KeyListener、MouseListener{
/**
* 
*/
专用静态最终int定时器_延迟=35;
私有静态最终长serialVersionUID=-4926251405849574401L;
公共静态缓冲图片阁楼,手电筒,播放器,杀手;
公共静态布尔值向上、向下、左、右、异步;
公共静态int-px,py,kx,ky;
公共静态位置;
公共静态JFrame=新JFrame(“遗忘”);
公共静态void main(字符串[]args){
inAttic=true;
px=600;
py=400;
框架设置尺寸(1200800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
frame.setresizeable(false);
frame.add(新的ForgottenMain());
}
public forgottontmain(){
init();
}
公共void init(){
设置大小(1200800);
setVisible(真);
frame.addKeyListener(这个);
frame.addMouseListener(本);
试试{
player=ImageIO.read(新文件(“char.png”);
flashlight=ImageIO.read(新文件(“flashlightimage.png”);
attic=ImageIO.read(新文件(“attic.png”);
killer=ImageIO.read(新文件(“killer.png”);
}捕获(例外e){
e、 printStackTrace();
}
//游戏圈
新的javax.swing.Timer(Timer\u DELAY,newActionListener(){
已执行的公共无效操作(操作事件e){
gameLoop();
}
}).start();
}
公共空间涂料(图g){
图形2d g2=(图形2d)g;
int fx=px-1033;
int fy=py-635;
kx=500;
ky=500;
//消除图像的闪烁
g2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
//重置屏幕以确保仅显示一次字符
g2.clearRect(0,0,1200,800);
//绘制背景阁楼
g2.绘图图像(阁楼,0,0,本);
//吸引玩家
g2.drawImage(播放器、px、py、this);
//画连环杀手
g2.drawImage(killer、kx、ky、this);
//拉手电筒
g2.绘图图像(手电筒、fx、fy、本);
System.out.println(px+“”+py);
}
public void gameLoop(){
如果(up==true&&py>88){
py-=4;
重新油漆();
}
如果(向下==true&&py<604){
py+=4;
重新油漆();
}
如果(左==true&&px>80){
px-=4;
重新油漆();
}
if(right==true&&px<1028){
px+=4;
重新油漆();
}
}
@凌驾
公共无效鼠标单击(鼠标事件arg0){
println(“鼠标位置:“+arg0.getX()+”,“+arg0.getY());
}
@凌驾
公共无效鼠标事件(鼠标事件arg0){
}
@凌驾
public void mouseexitted(MouseEvent arg0){
}
@凌驾
public void mousePressed(MouseEvent arg0){
}
@凌驾
公共无效MouseEvent arg0{
}
@凌驾
按下公共无效键(按键事件e){
如果(如getKeyCode()==87){
向上=真;
}
如果(如getKeyCode()==83){
向下=真;
}
如果(例如getKeyCode()==65){
左=真;
}
如果(例如getKeyCode()==68){
右=真;
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
如果(如getKeyCode()==87){
向上=错误;
}
如果(如getKeyCode()==83){
向下=假;
}
如果(例如getKeyCode()==65){
左=假;
}
如果(例如getKeyCode()==68){
右=假;
}
}
@凌驾
public void keyTyped(KeyEvent e){
}
}
例如,在我的游戏中,你用W、A、S和D键移动角色。当程序运行时,它会显示一个空白屏幕,并且不会显示应该绘制的所有内容,直到我按W、A、S或D键


如果我遗漏了什么,请告诉我。我想它可能是在初始化图像之前尝试绘制,所以我在初始化图像之后重新绘制了它们,但没有任何帮助。

问题是,由于
布尔值
向上
向下
都是
真的
,因此
游戏循环()
不会调用
重新绘制()
!这可以通过从
main(String[])
方法显式调用
repaint()
来解决

public static void main(String[] args) {
    inAttic = true;
    px = 600;
    py = 400;
    //frame.setSize(1200, 800);
    ForgottenMain fm = new ForgottenMain();
    frame.add(fm);
    frame.pack();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);

    frame.setVisible(true);
    fm.repaint();
}

其他提示:
  • 错误的方法:
    public void paint(Graphics g){..
    应该是
    public void paintComponent(Graphics g){super.paintComponent(g);..
    (调用super方法也很重要)
  • frame.setSize(1200800);…setSize(1200800);
    这是错误的,由于框架装饰,面板将小于1200 x 800,布局管理器通常会忽略首选尺寸上的尺寸。要解决此问题,请执行以下操作:
  • @Override public Dimension getPreferredSize(){return new Dimension(1200800);}
    在绘制图面中(the
    JPanel
  • 将面板添加到框架中
  • 调用