2012-09-26 46 views
2

我写简单的太空侵略者,并与移动的船的问题。基本上我改变了船的位置,然后repaint()。如果变化很大,那就更像跳跃而不是移动。如果更改是小动画更平滑但变慢。有没有解决方法?平稳快速移动和重绘()

我正在使用JPanel并使用paintComponent()。我真的不明白我的电脑如何顺利地显示正常(新)游戏,并且简单的绘图图像具有较低的帧速率。这就是为什么我认为这是软件问题而不是硬件问题。所以也许我会做一些影响帧率的事情。

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


    } 

} 

}

+0

你被更新/帧速率的限制,如果你能增加你的帧速率的东西会看起来更平滑。 – Goz

+0

你的问题相当宽泛。例如回答“有解决方案吗?”可能是“使用更快的电脑”,但我确信这不是你实际寻找的答案。试着改善你的问题,说明解决你所看到的问题的方法,你尝试过或未尝试过哪一种方法,以及出于何种原因等等。如果任何读者能够以您想要的方式理解问题,请在提问时始终记住。 – hakre

+0

您可以尝试使用其中一个动画库,如[TimingFramework](http://java.net/projects/timingframework/pages/Home)或[Trident](http://kenai.com/projects/trident/pages/首页) – MadProgrammer

回答

3

Space Invaders - 2D Rendering in Java教程可以像使用一个明确的BufferStrategy的例子有帮助的。

+0

感谢您的链接,只是出于好奇才读它:-) – moeTi

+0

@moeTi:在审查时,我注意到我将'Canvas'改为'JPanel',并使用泛型'java.util .'在'游戏',但代码是有启发性的。 – trashgod