2015-04-30 24 views
0

我是新來的Java,現在我對Threads.But工作現在我有一個很大的問題: 當我運行下面的代碼,我除了兩個圖像移動在屏幕上,但其中一個現在移動,甚至另一個不顯示。我想知道這是什麼問題: 階級敵人:圖片與非主線程不動

import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Enemy extends JLabel implements Runnable{ 
    private BufferedImage i; 
    private int x,y; 
    Enemy() 
    { 
     x=y=0; 
     try{ 
      i=ImageIO.read(new File("m2.jpg")); 
     }catch (Exception e){} 
     this.setIcon(new ImageIcon(i)); 
     this.setLocation(x,y); 
     this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize())); 
    } 
    Enemy(int X,int Y) 
    { 
     x=X; 
     y=Y; 
     try{ 
      i=ImageIO.read(new File("m2.jpg")); 
     }catch (Exception e){} 
     this.setIcon(new ImageIcon(i)); 
     this.setLocation(x,y); 
     this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize())); 
    } 

    public void move() 
    { 
     while(true) 
     { 
      int p=(int)Math.random()*4+1; 
      switch (p) 
      { 
      case 1:x++;break; 
      case 2:y++;break; 
      case 3:x--;break; 
      case 4:y--;break; 
      } 
      this.setLocation(x,y); 
      this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize())); 
     } 
    } 

    public void run() 
    { 
     move(); 
    } 
} 

類球員:

import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 


public class Player extends JLabel implements Runnable{ 
    private BufferedImage i; 
    private int x,y; 
    Player() 
    { 
     x=y=0; 
     try{ 
      i=ImageIO.read(new File("m1.jpg")); 
     }catch (Exception e){} 
     this.setIcon(new ImageIcon(i)); 
     this.setLocation(x,y); 
     this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize())); 
    } 

    public void move() 
    { 
     int p=(int)Math.random()*4+1; 
     switch (p) 
     { 
     case 1:x++;break; 
     case 2:y++;break; 
     case 3:x--;break; 
     case 4:y--;break; 
     } 
     this.setLocation(x,y); 
     this.setBounds(new Rectangle(new Point(x,y),this.getPreferredSize())); 
    } 

    public void run() 
    { 
     move(); 
    } 
} 

主類:

import javax.swing.JFrame; 


public class Test { 
    public static void main(String[] args) { 
     Enemy e=new Enemy(150,150); 
     Player p=new Player(); 
     JFrame f=new JFrame("Test"); 
     f.setSize(300,300); 
     f.setLayout(null); 
     f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); 
     f.add(e); 
     f.add(p); 
     Thread pThread=new Thread(p); 
     Thread eThread=new Thread(e); 
     pThread.start(); 
     eThread.start(); 
     while(true) 
     { 
      f.setVisible(true); 
      try 
      { 
       Thread.sleep(50); 
      }catch (Exception q){} 
      f.remove(p); 
      f.remove(e); 
      f.add(p); 
      f.add(e); 
     } 


    } 

} 

回答

1

EnemyPlayerMath.random()電話是總是四捨五入爲零。你可能想:

int p = (int) (Math.random() * 4) + 1; 

這也是一個不錯的主意,以限制在move方法xy(與maxX的=幀的寬度可能值 - 敵人/播放器寬度;美星=幀高度 - 敵人/播放器高):

switch (p) { 
    case 1: 
     if (x < maxX) 
      x++; 
     break; 
    case 2: 
     if (y < maxY) 
      y++; 
     break; 
    case 3: 
     if (x > 0) 
      x--; 
     break; 
    case 4: 
     if (y > 0) 
      y--; 
     break; 
} 

最後,你可以通過爲EnemyPlayer類創建一個共同的類保存自己的一些工作。在這裏你可以放置所有的共享代碼,這些代碼現在可以是所有的代碼;這兩個對象可以是同一個類的實例:

GameObject e = new GameObject(150, 150, size - 150, size - 150, "m2.jpg"); 
GameObject p = new GameObject(100, 100, size - 100, size - 100, "m1.jpg"); 

GameObject類看起來是這樣的:

import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 

public class GameObject extends JLabel implements Runnable { 
    private BufferedImage i; 
    private int x, y; 
    private int maxX; 
    private int maxY; 

    public GameObject(int X, int Y, int maxX, int maxY, String imagePath) { 
     x = X; 
     y = Y; 
     this.maxX = maxX; 
     this.maxY = maxY; 
     try { 
      this.i = ImageIO.read(new File(imagePath)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     this.setIcon(new ImageIcon(this.i)); 
     this.setLocation(x, y); 
     this.setBounds(new Rectangle(new Point(x, y), this.getPreferredSize())); 
    } 

    public void move() { 
     while (i != null) { 
      int p = (int) (Math.random() * 4) + 1; 
      switch (p) { 
       case 1: 
        if (x < maxX) 
         x++; 
        break; 
       case 2: 
        if (y < maxY) 
         y++; 
        break; 
       case 3: 
        if (x > 0) 
         x--; 
        break; 
       case 4: 
        if (y > 0) 
         y--; 
        break; 
      } 
      this.setLocation(x, y); 
      this.setBounds(new Rectangle(new Point(x, y), this.getPreferredSize())); 
     } 
    } 

    public void run() { 
     move(); 
    } 
}