2012-09-26 3 views
2

나는 쉬운 우주 침략자를 쓰고 있고, 이동하는 배에 문제가있다. 기본적으로 나는 배의 위치를 ​​바꾼 다음 repaint(). 변화가 크다면 점프하는 것보다 움직이는 것보다 낫습니다. 변화가 작 으면 애니메이션이 부드럽지만 느려집니다. 어떤 해결책이 있습니까?매끄러운 빠른 이동 및 다시 칠하기()

저는 JPanel에 그림을 그리고 paintComponent()을 사용하고 있습니다.

@ 편집 : 내 PC가 정상적인 (새로운) 게임을 원활하게 표시하고 간단한 그림 이미지로 낮은 프레임 속도를 표시하는 방법을 이해하지 못합니다. 그것은 내가 하드웨어보다는 소프트웨어 문제라고 생각한 이유입니다. 그래서 어쩌면 프레임 속도에 영향을 미치는 작업을 수행합니다.

@ 편집 : 일부 코드는 붙여 넣기 만해도 이해할 수 있습니다. 약 2 주 전에 자바로 프로그래밍을 시작했습니다.

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 ''게임'에'.List'라고 써 넣었지만 코드는 유익하다. – trashgod

관련 문제