Java 平滑快速移动和重新绘制()

Java 平滑快速移动和重新绘制(),java,swing,graphics,Java,Swing,Graphics,我正在写《简易太空入侵者》,在移动飞船方面遇到了问题。基本上我改变了船的位置,然后重新油漆。如果变化很大,那更像是跳跃而不是移动。如果更改很小,则动画会更平滑,但速度会变慢。有什么解决办法吗 我在JPanel上绘图,并使用paintComponent() @编辑:我真的不明白我的电脑如何能够流畅地显示普通(新)游戏,以及如何以简单的图形显示低帧率的图像。这就是为什么我认为这是软件问题而不是硬件问题。也许我会做一些影响帧速率的事情 @编辑:好的,粘贴一些代码,但要理解-我大约在两周前开始使用jav

我正在写《简易太空入侵者》,在移动飞船方面遇到了问题。基本上我改变了船的位置,然后重新油漆。如果变化很大,那更像是跳跃而不是移动。如果更改很小,则动画会更平滑,但速度会变慢。有什么解决办法吗

我在JPanel上绘图,并使用
paintComponent()

@编辑:我真的不明白我的电脑如何能够流畅地显示普通(新)游戏,以及如何以简单的图形显示低帧率的图像。这就是为什么我认为这是软件问题而不是硬件问题。也许我会做一些影响帧速率的事情

@编辑:好的,粘贴一些代码,但要理解-我大约在两周前开始使用java,通常编程图形

    package pl.spaceInvaders;
    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

class GamePanel extends JPanel{
SpaceInvadersMain sim;
private Image dbImage; 
private Graphics dbg; 
int moveDistHor=0;
int moveDistVer=0;
int shipMove=0;
int dir=1;

GamePanel(SpaceInvadersMain sim){
    this.sim=sim;
    setFocusable(true);
    moveMonsters();
    MyKeyListener mkl = new MyKeyListener();
    addKeyListener(mkl);
    Timer t = new Timer(500, new ActionListener() {
          public void actionPerformed(ActionEvent e) {
              if(moveDistHor<304){moveDistHor+=16*dir;}
              if(moveDistHor==304 || moveDistHor==0){dir*=-1;moveDistHor+=16*dir;moveDistVer+=16;}
              moveMonsters();
              moveProjectiles();
              detectColissions();
              repaint();
          }
       });
    t.start();
}
@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(Color.white);
    Graphics2D g2 = (Graphics2D)g;
    Insets insets = getInsets();
    g2.translate(insets.left, insets.top);
    // drawing monsters
    for(int i=0;i<SpaceInvadersMain.M_WIDTH;i++){
        for(int j=0;j<SpaceInvadersMain.M_HIGHT;j++){
            if(sim.monsters[i][j].ifExists()){
            if((moveDistHor+moveDistVer)%32==0) 
                g2.drawImage(sim.monsters[i][j].img, sim.monsters[i][j].posX, sim.monsters[i][j].posY, 32, 32, null);
            else 
                g2.drawImage(sim.monsters[i][j].img2, sim.monsters[i][j].posX, sim.monsters[i][j].posY, 32, 32, null);
            }}
    }
    //drawing ship
    if(sim.ship.exists()) g2.drawImage(sim.ship.img, sim.ship.getPosX(), sim.ship.getPosY(),32,32,null);
}
protected void detectColissions() {
    // TODO Auto-generated method stub

}
protected void moveProjectiles() {
    // TODO Auto-generated method stub

}
protected void moveShip() {
    if(sim.ship.posX+shipMove>0 && sim.ship.posX+shipMove<750) {
        sim.ship.posX+=shipMove;
        shipMove=0;
    }

}
protected void moveMonsters(){
    for(int i=0;i<SpaceInvadersMain.M_WIDTH;i++){
        for(int j=0;j<SpaceInvadersMain.M_HIGHT;j++){
            if(sim.monsters[i][j].ifExists()){
                 sim.monsters[i][j].posX=10+i*48+moveDistHor;
                 sim.monsters[i][j].posY=10+j*48+moveDistVer;

            }}
    }
}
private class MyKeyListener implements KeyListener{

    @Override
    public void keyPressed(KeyEvent e) {
        switch(e.getKeyCode()){
        case KeyEvent.VK_LEFT:
            //System.out.println("Arrow left caught");
            shipMove=-10;
            break;
        case KeyEvent.VK_RIGHT:
            //System.out.println("Arrow right caught");
            shipMove=10;
            break;
        }
        moveShip();
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyTyped(KeyEvent e) {


    }

}
package pl.spaceinvestors;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.Insets;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.JPanel;
导入javax.swing.Timer;
类GamePanel扩展了JPanel{
太空人;
私有镜像dbImage;
专用图形数据库;
int moveDistHor=0;
int moveDistVer=0;
int shipMove=0;
int dir=1;
游戏面板(主sim卡){
this.sim=sim;
设置聚焦(真);
移动怪物();
MyKeyListener mkl=新的MyKeyListener();
addKeyListener(mkl);
计时器t=新计时器(500,新ActionListener(){
已执行的公共无效操作(操作事件e){

如果(moveDistHor请发布一些代码?整个游戏是在画布中运行还是每艘船都是JComponent?对于游戏,我会使用JavaFX或类似的游戏引擎。 要在Swing中创建平滑动画,可以使用动画框架:


作为一个使用显式
缓冲策略的示例,本教程可能会有所帮助

您受到更新/帧速率的限制,如果您可以提高帧速率,事情看起来会更顺利。您的问题相当广泛。例如,“有什么解决方案吗?”的答案可能是“使用更快的计算机”但我有点确定这并不是你真正想要的答案。试着改进你的问题,展示你看到的解决问题的方法,你尝试过或没有尝试过其中的哪一种,出于什么原因等等。如果有人阅读你的问题,在写问题时一定要记住nt。你可以尝试使用其中一个动画库,不管是否看到一些代码,这很难说。可能你一直在重新绘制所有帧,这可能非常耗时且效率低下。可能你在某个地方留下了一些未优化的代码,而这些代码在绘制操作期间不断被调用。低帧速率可能会导致错误由于使用了
SwingWorker
(请参阅)感谢您的链接,出于好奇阅读它:-)@moeTi:在回顾时,我注意到我将
Canvas
更改为
JPanel
,并在
游戏
中使用了generic
java.util.List
,但代码很有启发性。