java - 平滑快速移动和重绘()

标签 java swing graphics

我正在编写简单的太空入侵者,但在移动飞船时遇到了问题。基本上我改变了船的位置,然后重新绘制()。如果变化很大,则更像是跳跃而不是移动。如果变化很小,动画会更流畅,但速度会变慢。有什么解决办法吗?

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

@edit:我真的不明白我的电脑如何流畅地显示正常(新)游戏,并且简单的绘图图像帧速率较低。这就是为什么我认为这是软件问题而不是硬件问题。所以也许我做了一些影响帧速率的事情。

@edit:好的,粘贴一些代码,但要理解 - 我大约两周前开始使用 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) {


    }

}

}

最佳答案

Space Invaders - 2D Rendering in Java作为使用显式 BufferStrategy 的示例,教程可能会有所帮助。

关于java - 平滑快速移动和重绘(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12597063/

相关文章:

java - 在 grpc 拦截器中使用 ThreadLocal 的正确方法是什么?

Java - 从剪贴板检索 XML (Excel) 电子表格

java - 颜色引用不好?

java - 在 Java 3D 中从 Point3f 数组绘制洛伦兹吸引子

opengl - 什么是openGL中的顺时针方向

c++ - 在 Qt 中绘制绘图的最佳方法是什么?

java - 将共享项目添加到库时,使用 netbeans 6.8 的 java 应用程序中出现符号错误

java - 动态 <ui :include> doesn't work

java - 有没有办法将多个变量声明转换为每行一个?

java - 如何在JFrame上放置多张图片?