2015-02-07 3 views
0

저는 현재 대학을위한 모험 2D 게임 프로젝트를 만들고 있습니다. 나는 그림 배열 (벽, 바닥 등)을 그리고 움직일 수있는 영웅 그림을 그리고있다. 문제 : 배열이 없으면 그림은 잘 움직이지만 배열을 사용하면 움직임이 지연되기 시작합니다. 그것은 내 PC인가? 또는 너무 "무거운"내 드로잉 방법입니까?내 그림이 너무 느리게 움직입니다.

import java.awt.Graphics; 
import java.awt.Rectangle; 

public class World { 
public static int WorldW = 16 , WorldH = 16; 
public SpielElement[][] element = new SpielElement[WorldW][WorldH]; 
public int[][] level0 ={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0}, 
         {0,0,0,1,1,1,1,1,1,1,1,6,0,0,0,0}, 
         {0,0,0,1,1,1,5,1,1,1,1,1,0,0,0,0}, 
         {0,0,0,1,1,6,1,1,2,1,5,1,0,0,0,0}, 
         {0,0,0,1,1,1,1,5,1,1,1,1,0,0,0,0}, 
         {0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0}, 
         {0,0,0,0,0,1,1,3,1,1,0,0,0,0,0,0}, 
         {0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; 

public int[][] level1 ={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
         {0,0,0,1,0,0,0,0,1,1,1,1,2,0,1,0}, 
         {0,4,0,1,0,0,5,1,1,1,1,1,1,0,1,0}, 
         {0,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0}, 
         {0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0}, 
         {0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0}, 
         {0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,0}, 
         {0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0}, 
         {0,1,0,1,1,1,1,1,1,1,1,1,0,0,3,0}, 
         {0,1,0,1,0,0,0,0,0,1,0,1,0,0,1,0}, 
         {0,1,0,1,1,1,1,0,0,1,0,1,0,0,1,0}, 
         {0,1,0,1,0,0,1,0,0,1,0,1,1,1,1,0}, 
         {0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0}, 
         {0,1,1,1,1,6,1,1,0,1,0,0,1,0,0,0}, 
         {0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0}, 
         {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; 

public World(){ 
    create(); 
} 

public void create(){ 
    for(int x = 0; x<WorldW; x++){ 
     for(int y = 0; y<WorldH; y++){ 
      element[x][y] = new SpielElement(x,y,level0[y][x]); 
     } 
    } 
} 


public void generate(Graphics g){ 
    for(int x = 0; x<WorldW; x++){ 
     for(int y = 0; y<WorldH; y++){ 
      element[x][y].zeichne(g); 
     } 
    } 
} 

}

그럼 int 배열은 내가 먼저 그들에게 을 그릴 다음 (SpielElement를) 모든 패널을 만들고하려는 그릴 필요 그림의 종류를 정의하는 것입니다 : 봐 주시기 바랍니다

import java.awt.*; 
    import java.awt.image.BufferedImage; 
    import java.io.IOException; 

    import javax.imageio.ImageIO; 
    import javax.swing.*; 
    public class SpielElement extends JPanel{ 
    int posX,posY,type ; 
    BufferedImage wand, boden, tuer, schluessel; 



public SpielElement(int x, int y,int z){ 
    this.posX = x*40; 
    this.posY = y*40; 
    this.type = z; 

    try { 
     wand = ImageIO.read(SpielElement.class.getResource("/img/wand.png")); 
     boden = ImageIO.read(SpielElement.class.getResource("/img/boden.png")); 
     tuer = ImageIO.read(SpielElement.class.getResource("/img/tuer.png")); 
     schluessel = ImageIO.read(SpielElement.class.getResource("/img/schluessel.png")); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 



} 

public void zeichne(Graphics g){ 
    switch(type){ 
    case 0: g.drawImage(wand,posX,posY,boden.getWidth(),wand.getHeight(),null); 
     break; 
    case 1:g.drawImage(boden,posX,posY,boden.getWidth(),boden.getHeight(),null); 
     break; 
    case 2: g.drawImage(schluessel,posX,posY,schluessel.getWidth(),schluessel.getHeight(),null); 
     break; 
    case 3:  g.drawImage(tuer,posX,posY,tuer.getWidth(),tuer.getHeight(),null); 
     break; 
    case 4:  g.drawImage(boden,posX,posY,boden.getWidth(),boden.getHeight(),null); 
     break; 
    case 5:g.drawImage(boden,posX,posY,boden.getWidth(),boden.getHeight(),null); 
     break; 
    case 6:  g.drawImage(boden,posX,posY,boden.getWidth(),boden.getHeight(),null); 
     break; 

} 
} 

}

내가 u는 내가 생각하고 무엇을 얻을 희망 그 자체의 코드를 읽고 희망으로 : 여기를 그리기하는 방법입니다 뭐가 잘못 됐어. 구문 오류는 없지만 천천히 느려집니다. 결국 JFrame의

import java.awt.*; 

import javax.swing.*; 

import java.awt.event.*; 

public class Board extends JPanel implements KeyListener{ 
private final int BREITE = 700; 
private final int HOEHE = 700; 
Hunter Held ; 
World Welt; 



public Board(){ 
    super(); 
    Held = new Hunter(200,200); 
    Welt = new World(); 

    this.setBackground(Color.BLACK); 
} 

public void paint(Graphics g){ 
    super.paint(g); 
    Welt.generate(g); 
    Held.draw(g); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 
    if (e.getKeyCode() == KeyEvent.VK_LEFT) 
     Held.posX = Held.posX - 10; 

    if (e.getKeyCode() == KeyEvent.VK_RIGHT) 
     Held.posX = Held.posX + 10; 

    if (e.getKeyCode() == KeyEvent.VK_UP) 
     Held.posY = Held.posY - 10; 

    if (e.getKeyCode() == KeyEvent.VK_DOWN) 
     Held.posY = Held.posY + 10; 
     this.repaint(); 

} 

@Override 
public void keyReleased(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyTyped(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

}

영웅 (보류)의 좌표가 다른 이미지 같은 정확한 방법을 그려 변경에 beeing마다에 추가되는 JPanel의 보드에 이러한 모든 추가 I 키를 눌러 다시 그리기. 이 시점에서 코드 덤핑을 자제합니다. http://puush.me/account?pool=1468274

(아직 죄송 더 평판) Scrren의 그림은 KeyInput에 있지만, 시차로 이동 ... 를이 내 첫 번째 질문하고 내가 충분히 상세한 희망 : 이것은 결국처럼 보이는없는 방법이다. 내 문제가 바보 인 경우 2 주 전부터 일반적으로 프로그래밍을 시작하기 전에 미리 시도하십시오. 건설적인 비판이 권고됩니다. 덤프 코드 SRY ... 어쨌든

+1

당신의 링크는 로그인을 요구합니다 ... – hyde

+0

내 생각 엔 당신이 너무 자주 그리는 것입니다. 키 누름 이벤트의 키 위치 만 _only_ 업데이트하고 스윙 타이머를 사용하여 고정 된 재생 빈도로 디스플레이를 업데이트하려고합니다. – jtahlborn

+0

예를 들어 세상을 변경할 필요가 없을 때 많은 양의 작은 요소를 다시 채우지 마십시오. 그렇게 많이 변경되지는 않습니다. 대신 세계를 BuferredImage에 페인트하고 간단히 그 단계를 그립니다. 일반적으로 말해서 이미지가 단일 이미지보다 빠르며 작은 이미지 또는 그래픽 요소가 많이 있습니다. – MadProgrammer

답변

0

난 당신이 내가 그것을 안드로이드와 관련된 문제라고 생각 인 JPanel과 JFrame의 언급 볼 때까지 ...

어쩌면 당신은 보이지 않는 캔버스에 새로운 스레드를 그린다/image/cache, 뭐든간에 ... 앞으로 가져 와서 다른 프레임을 배경으로 그립니다.

죄송합니다. Swing을 사용하는 방법을 모르겠지만 모든 애니메이션 프레임 워크가 작동하는 방식이라고 생각합니다. 안드로이드 사람들은 배경 스레드에서 이러한 모든 더러운 작업을 수행합니다 ...

관련 문제