2017-12-09 12 views
0

私はJava swing/awtを使って簡単なゲームを作ろうとしています。 画面上に画像を印刷したり動かしたりする際に問題があります。ここでJava awt/swingイメージ印刷の遅延をどのように解決しますか?

は、以下の私のコードです:あなたは、コードをコンパイルすると

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.File; 
import java.util.ArrayList; 
import javax.imageio.ImageIO; 
import javax.swing.*; 




public class StarDef extends JFrame implements Runnable, KeyListener{ 
    private BufferedImage back; 
    private boolean start = false, end = false; 
    public int w = 1500, h = 800, commandx = 200, commandy = 100, ground = 500, mineral = 100; 
    private int mineralx = 0, mineraly = commandy + 104; 
    private int dronecnt = 0; 
    private ArrayList<Drone> DrList = null; 
    private ArrayList<Enemy> EnList = null; 
    private ArrayList<Building> BuildList = null; 
    private ArrayList<Allies> AlyList= null; 
    public Image imagearr[] = new Image[10]; 
    private boolean makedrone = false, NeedMinerals = false; 
    public int picnum = 1; 
    private int OrderBuild = 0; 

    public static void main(String[] args){ 
     Thread t = new Thread(new StarDef()); 
     t.start(); 
    } 

    public StarDef(){ 
     back = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
     DrList = new ArrayList<>(); 
     BuildList = new ArrayList<>(); 
     EnList = new ArrayList<>(); 
     AlyList = new ArrayList<>(); 
     this.addKeyListener(this); 
     this.setSize(w,h); 
     this.setTitle("Starcraft"); 
     this.setResizable(false); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
     try { 
      imagearr[0] = ImageIO.read(new File("Char/Command.png")); 
      imagearr[1] = ImageIO.read(new File("Char/droneleft.png")); 
      imagearr[2] = ImageIO.read(new File("Char/droneright.png")); 
      imagearr[3] = ImageIO.read(new File("Char/Mineral.png")); 
      imagearr[4] = ImageIO.read(new File("Char/barracks.png")); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public void initGame(){ 
     DrList.clear(); 
     mineral = 100; 

    } 
    public void draw(){ 
     Graphics gs = back.getGraphics(); 
     gs.setColor(Color.white); 
     gs.fillRect(0,0,w,h); 
     gs.setColor(Color.DARK_GRAY); 
     gs.fillRect(0,ground,w,200); 

     if (!end) { 
      gs.drawImage(imagearr[0], commandx, commandy, null); // First Image-Command Center 
      gs.drawImage(imagearr[3], mineralx,mineraly,null); // Second Image-Mineral 

      for (int i = 0; i < DrList.size(); i++) { //Printing Drones 
       Drone m = DrList.get(i); 
       gs.drawImage(imagearr[m.state], m.x, m.y, null); //Drawing Drones 
       m.moveDr(); // Moving the Drone 
      } 

      for (int i = 0; i < BuildList.size(); i++){ //Printing Building 
       Building bd = BuildList.get(i); 
       if(bd.buildingtype == 'R'){ 
        gs.drawImage(imagearr[4], bd.x, bd.y, null); // Drawing Building-Problem starts..? 
       } 
      } 
      gs.drawImage(imagearr[0], commandx, commandy, null); 
     } 

     gs.setColor(Color.black); 
     gs.drawString("mineral : " + mineral, 10,50); 
     gs.drawString("Drones : " + DrList.size(), 10, 70); 

     Graphics ge = this.getGraphics(); 
     ge.drawImage(back, 0,0,w,h,this); 
    } 

    public void run(){ 

     try{ 
      int timer = 10; 

      while (true){ 
       Thread.sleep(timer); 
       if(start){ 
        if (makedrone) { 
         makedrone(); 
        } 
        if (OrderBuild>0){ 
         makeBuilding(OrderBuild); 
        } 
       } 
       draw(); 
      } 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public void makeBuilding(int buildingnumber){ 
     int bdx, bdy; 
     char BuildingType; 
     if(buildingnumber == 1){ 
      bdx = 500; 
      bdy = 100; 
      BuildingType = 'R'; 
      Building barracks = new Building(this, bdx, bdy, BuildingType); 
      BuildList.add(barracks); 
     } 
    } 
    public void makedrone() { 

     if (mineral >= 50) { 
      int dronex = commandx; 
      int droney = commandy+129; 
      Drone dr = new Drone(this ,dronex, droney); 
      DrList.add(dr); 
      dronecnt++; 
      mineral -= 50; 
      makedrone = false; 

     } else if (mineral < 50) { 
      NeedMinerals = true; 
      makedrone = false; 
     } 

    } 

    public void keyPressed(KeyEvent ke){ 
     switch (ke.getKeyCode()){ 
      case KeyEvent.VK_ENTER: 
       start = true; 
       end = false; 
       break; 
      case KeyEvent.VK_D: 
       makedrone = true; 
       break; 
      case KeyEvent.VK_R: 
       OrderBuild = 1; 
       break; 
     } 
    } 

    public void keyReleased(KeyEvent ke){ 
     switch ((ke.getKeyCode())){ 

     } 
    } 
    public void keyTyped(KeyEvent ke) { 
    } 

}

、最初のいくつかの静止画像が表示されます罰金。

動画(Drones)がうまく表示された後で、次の静止画像(建物)を呼び出すと、重いラグが表示され、移動するドローンの速度が目立つように低下​​します。

建物は約300×150ピクセルで、ドローンは40×30ピクセルです。

この問題の原因は何ですか。これは、コード(画像を呼び出す方法)、または画像のサイズ、またはコンピュータ(ノートブック(LG Gram 14in)を使用しています)のためですか?

+0

1を使用して探ることになるでしょう)一つの方法は、ホットリンクにあります[このQ&A](http://stackoverflow.com/q/19209650/418556)に表示される画像。2)「コードブロックの括弧の検出/修正」(http://meta.stackexchange.com/q/251795/155831)を参照して、修正できなくなった問題を解決してください。 –

答えて

1

最初に使用しないでくださいGraphics ge = this.getGraphics();

あなたも独自のThreadを使用しているため、スレッドの競合状態が発生し、読み込み/ペイントが不正になる可能性があります。

まず、Swingペイントが実際にどのように機能し、API機能内で動作するかを理解します。 Performing Custom PaintingPainting in AWT and SwingConcurrency in Swing

KeyListener見を有することにより

スタートも、モニタ、キー入力のためのお粗末な選択であり、あなたはキーバインディングAPIを使用する必要があります - 詳細はHow to use key bindingsを参照してください。

ArrayListに内容を追加すると、ArrayListが成長サイクルを経る可能性があり、時間を消費し、より長いGCサイクルを強制する可能性があります。 ArrayListに初期容量を播種することを検討すると、増殖サイクルの間隔を短縮するのに役立ちます。 「ペイント」の論理から「アップデート」のロジックを分離する上

フォーカス、それはあなたがまた

Swingでのレンダリングのパフォーマンスを向上させる技術の真価を実証しています。自己完結型例えば画像(複数可)を取得する

これらはまだあなたが望むレベルにあなたを取得are't場合、あなたはBufferStrategy

関連する問題