2017-05-10 6 views
-1

をインスタンス化するとき、私はトップダウンシューティングゲームをプログラミングしています、と私は、ゲームの各レベルの間に、新しいウィンドウを開くようにしたい終了します。特定の基準が満たされている場合、各レベルの後に、次のクラスが実装されている:主な方法は、私は新しいスレッド

import java.util.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.Image.*; 
import java.awt.image.BufferedImage.*; 
import java.text.*; 
import java.awt.event.*; 
import javax.swing.event.*; 
import javax.swing.border.*; 
import javax.swing.text.*; 
import javax.imageio.ImageIO; 
import java.io.InputStream.*; 
import java.io.*; 

public class Shop extends JFrame implements Runnable 
{ 
    private static java.awt.image.BufferedImage shotgun, zombie, armor, aRifle; 
    static ArrayList<Image> stock = new ArrayList<Image>(); 
    private ColorPanel contentPane3; 
    private JPanel container = new JPanel(); 
    private JPanel contentPane4; 
    private int item=0; 
    private boolean broke = false; 
    private boolean newb = true; 
    private boolean reg = false; 
    private boolean stay = true; 

    public static void main(String [] args) 
    { 
     System.out.println("started"); 
     Thread s = new Thread(new Shop()); 
     System.out.println("running"); 
     s.start(); 
     System.out.println("ended"); 
    } 

    public Shop() 
    {   
     super("Monster Escape v4"); 

     try 
     { 
      shotgun = ImageIO.read(getResource("shotgun.png"));   
      zombie = ImageIO.read(getResource("zombie.png"));   
      armor = ImageIO.read(getResource("armor.png")); 
      aRifle = ImageIO.read(getResource("assaultRifle.png")); 
     }catch (IOException e){System.exit(0);} 

     stock.clear(); 
     stock.add(armor); 
     if(!(Client.inventory.contains("shotgun"))) 
      stock.add(shotgun);    
     if(!(Client.inventory.contains("assaultRifle"))) 
      stock.add(aRifle); 

     container.removeAll(); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     contentPane4 = new JPanel(); 
     contentPane4.setPreferredSize(new Dimension(700,100)); 
     contentPane3 = new ColorPanel(Color.WHITE); 
     contentPane3.setPreferredSize(new Dimension(700,700)); 
     setBounds(100,100,606,719); 
     setResizable(false); 

     GridLayout g1 = new GridLayout(1, 3); 
     contentPane4.setLayout(g1); 
     container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS)); 

     JButton sleft = new JButton("←"); 
     JButton sright = new JButton("→"); 
     JButton buy = new JButton("buy"); 
     JButton leave = new JButton("leave"); 

     contentPane4.add(sleft); 
     contentPane4.add(buy); 
     contentPane4.add(sright); 
     contentPane4.add(leave); 

     sleft.addActionListener((e) -> { 
      broke = false; 
      newb = false; 
      if(item==0) 
       item = stock.size()-1; 
      else 
       item--; 
     }); 

     sright.addActionListener((e) -> { 
      broke = false; 
      newb = false; 
      if(item==stock.size()-1) 
       item=0; 
      else 
       item++; 
     }); 

     buy.addActionListener((e) -> { 
      broke = false; 
      newb = false; 
      if(stock.get(item) == armor) 
      { 
       if(Client.cash >= 100) 
       { 
        Client.maxHealth += 4; 
        Client.cash -= 100; 
        reg = true; 
       } 
       else 
        broke = true; 
      } 
      else 
      { 
       if(Client.cash >= 250) 
       { 
        Client.inventory.add(getName(item)); 
        stock.remove(item); 
        Client.cash -= 250; 
        item--; 
        reg = true; 
       } 
       else 
        broke = true; 
      } 

     }); 

     leave.addActionListener((e) -> { 
      stay = false; 
     }); 

     container.add(contentPane3, BorderLayout.EAST); 
     container.add(contentPane4, BorderLayout.WEST); 
     setContentPane(container); 



     setVisible(true); 
    } 

    public static String getName(int i) 
    { 
     String temp = null; 
     if(stock.get(i) == armor) 
      temp = "armor"; 
     else if(stock.get(i) == shotgun) 
      temp = "shotgun"; 
     else if(stock.get(i) == aRifle) 
      temp = "assaultRifle"; 
     return temp; 
    } 

    private InputStream getResource(String ref) throws IOException 
    { 
     InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(ref); 
     if(in != null) 
      return in; 
     return new FileInputStream(ref); 

    } 

    public void run() 
    { 


     while(stay) 
     { 
      repaint(); 

      try 
      { 
       Thread.sleep(10); 
      }catch(InterruptedException e) { } 

     } 
     dispose(); 
    } 


} 

これは図示されていないColorPanelサブクラスを含みます。以前のバージョンのゲームでは、これはうまくいきました。しかし、私は最近、クライアントにKeyListenerサブクラスを追加しましたが、今スレッドをインスタンス化しようとすると何も起こりません。問題がどこにあるかを調べるために、Shopクラス自体のメインメソッドを作成しました。コードが に到達したときに表示されます。スレッドs = new Thread(new Shop()); システムを完全に終了します。なぜなら私がmainを実行すると、「開始済み」しか印刷されないからです。これを引き起こしているのは何ですか?

+0

プログラムは実際に終了しますか? –

+0

メソッド呼び出しを確認し、「VM terminated」と表示されます。しかし、私のコードを詳しく見てみると、イメージをインスタンス化しようとするとIOExceptionが発生し、IOExceptionが発生した場合にプログラムを終了するように指示していたことがわかりました。メソッドは正常に実行されています。 –

+2

はい、この行は役に立ちません。 'catch(IOException e){System.exit(0);}'。 –

答えて

0

追加 s.join()。

開始後。この場合、メインスレッドはsスレッドが終了するまで待機します。

関連する問題