2016-04-27 3 views
0

これはゲームを作るための私のコードです。現時点では、ゲームの機能について心配していません。私は、UPボタンを押すたびにパネルが消え、LEFTボタンも押したという事実をもっと心配しています。誰にもこのことが起こる理由を理解するのを助けることができるのですか?私はそれが私のifステートメントとは関係があると感じていますが、本当にわかりません。また、私は本当に助けてくれてありがとうございます。UPを押すとパネルが消えるのはなぜですか?

import javax.swing.*; 
    import java.applet.*; 
    import java.awt.event.*; 
    import java.awt.*; 


    public class Game extends Applet implements ActionListener,KeyListener { 
    Image image; 
    MediaTracker tr; 
    JLabel label,computerLabel; 
    JPanel panel,computerPanel; 
    Button start,up,down; 
    Label result; 
    Dimension SIZE = new Dimension(50,50); 

    int x = 0; 
    int y = 0; 
    int w = 100; 
    int q = 100; 
    int WIDTH = 50; 
    int HEIGHT = 50; 
    //Player Integers 
    int zeroPosX,zeroPosY,xLeft,xUp; 
    //Computer integers 
    int compZeroPosX,compZeroPosY,compXLeft,compXUp; 

    //-------------------------------------- 
    public void init() { 
     setLayout(new FlowLayout()); 

     start = new Button("Start"); 
     up = new Button("UP"); 
     down = new Button("LEFT"); 
    //PlayerPiece stuff  
     ImageIcon icon = new ImageIcon("playerpiece.png");  
     label = new JLabel(icon); 
     panel = new JPanel(); 

     label.setVisible(true); 
     panel.add(label); 
     panel.setPreferredSize(SIZE); 
    //ComputerPiece Stuff 
     ImageIcon computerIcon = new ImageIcon("computerPiece.png"); 
     computerPanel = new JPanel(); 
     computerLabel = new JLabel(computerIcon); 

     computerLabel.setVisible(true); 
     computerPanel.add(computerLabel); 
     computerPanel.setPreferredSize(SIZE); 

    //===============================================  

     result = new Label("========="); 
     addKeyListener(this); 

     setSize(650,650); 

     up.addActionListener(this); 
     down.addActionListener(this); 
     start.addActionListener(this); 

     label.setSize(WIDTH,HEIGHT); 
     label.setLocation(0,0); 

     add(computerPanel); 
     add(panel); 
     add(start); 
     add(up); 
     add(down); 
     add(result); 


     } 

    //-------------------------------------- 
     public void paint(Graphics g) { 


      Graphics2D firstLayer = (Graphics2D)g; 
      Graphics2D secondLayer = (Graphics2D)g; 
      Graphics2D thirdLayer = (Graphics2D)g; 


     secondLayer.setColor(Color.BLACK); 


      for(x=100; x<=500; x+=100) 
       for(y=100; y <=500; y+=100) 
       { 

       firstLayer.fillRect(x,y,WIDTH,HEIGHT); 


       } 
      for(w=150; w<=500; w+=100) 
       for(q=150; q <=500; q+=100) 
        { 

       secondLayer.fillRect(w,q,WIDTH,HEIGHT); 


       } 





      } 
     //-------------------------------------- 
      public void actionPerformed(ActionEvent ae) { 

      int [] range = {50,0,0,0,0}; 
      int selection = (int)Math.random()*5 ; 


     //~~~~~~~~~~~~~~~~~~~~~~~~~ 

     //PlayerPositioning 
      zeroPosX = panel.getX(); 
      zeroPosY = panel.getY(); 
      xLeft = zeroPosX - 50; 
      xUp = zeroPosY - 50; 
     //ComputerPositioning 
      compZeroPosX = computerPanel.getX(); 
      compZeroPosY = computerPanel.getY(); 
      compXLeft = compZeroPosX - range[selection]; 
      compXUp = compZeroPosY - range[selection]; 
     //~~~~~~~~~~~~~~~~~~~~~~~~~~  


      Button user = (Button)ae.getSource(); 




     //Starting the game 
     if(user.getLabel() == "Start") { 
      result.setText("========="); 
     //playersetup 
      label.setLocation(0,0); 
      panel.setLocation(300,500); 
     //============================ 
     //npc setup 
      computerLabel.setLocation(0,0); 
      computerPanel.setLocation(500,300); 


     } 



      if(compZeroPosX >= 150) { 
       if(compZeroPosY >= 150) { 
       if(zeroPosX >= 150)  { 
        if(zeroPosY >=150)   { 


         if(user.getLabel() == "UP") { 
         panel.setLocation(zeroPosX,xUp); 

         } 
         else  
          computerPanel.setLocation(compZeroPosX,compXUp); 




         if(user.getLabel() == "LEFT") { 
         panel.setLocation(xLeft,zeroPosY); 

         } 

         else  
         computerPanel.setLocation(compXLeft,compZeroPosY); 

         if(panel.getX() < 150) 
          result.setText("GAME-OVER"); 


         if(panel.getY() < 150) 
          result.setText("GAME-OVER"); 

         } 
       }  
       } 
       } 
      } 
     @Override 
     public void keyPressed(KeyEvent kp) { 
      int keycode = kp.getKeyCode(); 

       switch (keycode) { 
       case KeyEvent.VK_W: 
       panel.setLocation(xLeft,zeroPosY); 
       break; 
       } 





     } 
     @Override 
     public void keyReleased(KeyEvent kr) { 

     } 
     @Override 
     public void keyTyped(KeyEvent kt) { 

     } 

     } 

答えて

3

課題と提案:

  1. あなたが危険と必要としないスイング(例えば、JPanelの、JLabelの)で(例えば、アプレット、ボタン、ラベル)AWTを混合しています。スイングに固執し、AWTのすべての痕跡を取り除く。
  2. あなたはトップレベルのウィンドウに直接ペイントしています。ここでは、アプレットは危険なことです。しないでください。 Swingグラフィックチュートリアルに従って、JPanelのpaintComponentメソッドで図面を作成します。
  3. 重要な関連チュートリアルを読んでいなくても、これを行うようにしようとしているという別の兆候と、あなたのペインティングメソッドのオーバーライド内でsuperメソッドを呼び出すことはありません。
  4. ==または!=を使用して文字列を比較しないでください。代わりにequals(...)またはequalsIgnoreCase(...)メソッドを使用してください。あなたが興味を持っていない2つのオブジェクト参照が同じであるかどうかを確認することを理解する== 2つの文字列が同じ順序で同じ文字を持っているかどうかをチェックする方法は、ここで重要です。
  5. JPanelなどのコンポーネントの場所をレイアウトマネージャーに関係なく直接設定しようとしています。これをしないでください。代わりに、論理(非コンポーネント)エンティティを移動し、グラフィックス内の動きを表示します。

あなたはSwingのチュートリアルに、ここで他のSwingのリソースへのリンクを見つけることができます。Swing Info

後で、すべての味のアプレットを避ける必要がありますなぜ我々は話をすることができます...

を自身が、私は思いますImageIconをJLabelのグリッドの周りに移動し、ペイントメソッドをまったく使用しないでください。例えば、

Example program animation

参照するには、次のコードを実行します。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.Map; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Game2 extends JPanel { 
    private static final String CPU_PATH = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/" 
      + "Gorilla-thinclient.svg/50px-Gorilla-thinclient.svg.png"; 
    private static final String PERSON_PATH = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/" 
      + "Emblem-person-blue.svg/50px-Emblem-person-blue.svg.png"; 
    private static final int SQR_WIDTH = 50; 
    private static final int SIDES = 10; 
    private static final Dimension SQR_SIZE = new Dimension(SQR_WIDTH, SQR_WIDTH); 
    private static final Color DARK = new Color(149, 69, 53); 
    private static final Color LIGHT = new Color(240, 220, 130); 
    private JLabel[][] labelGrid = new JLabel[SIDES][SIDES]; 
    private Icon playerIcon; 
    private Icon computerIcon; 

    public Game2() throws IOException { 
     // would use images instead 
     playerIcon = createIcon(PERSON_PATH); 
     computerIcon = createIcon(CPU_PATH); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(new JButton(new StartAction("Start", KeyEvent.VK_S))); 
     buttonPanel.add(new JButton(new UpAction("Up", KeyEvent.VK_U))); 
     buttonPanel.add(new JButton(new LeftAction("Left", KeyEvent.VK_L))); 

     JPanel gameBrd = new JPanel(new GridLayout(SIDES, SIDES)); 
     gameBrd.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
     for (int i = 0; i < labelGrid.length; i++) { 
      for (int j = 0; j < labelGrid[i].length; j++) { 
       JLabel label = new JLabel(); 
       label.setPreferredSize(SQR_SIZE); 
       label.setOpaque(true); 
       Color c = i % 2 == j % 2 ? DARK : LIGHT; 
       label.setBackground(c); 
       gameBrd.add(label); 
       labelGrid[i][j] = label; 
      } 
     } 

     setLayout(new BorderLayout()); 
     add(buttonPanel, BorderLayout.PAGE_START); 
     add(gameBrd); 

     // random placement, just for example 
     labelGrid[4][4].setIcon(computerIcon); 
     labelGrid[5][5].setIcon(playerIcon); 
    } 

    private Icon createIcon(String path) throws IOException { 
     URL url = new URL(path); 
     BufferedImage img = ImageIO.read(url); 
     return new ImageIcon(img);   
    } 

    private abstract class MyAction extends AbstractAction { 
     public MyAction(String name, int mnemonic) { 
      super(name); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 
    } 

    private class StartAction extends MyAction { 
     public StartAction(String name, int mnemonic) { 
      super(name, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO start game code 

     } 
    } 

    // move all icons up 
    private class UpAction extends MyAction { 
     public UpAction(String name, int mnemonic) { 
      super(name, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // collection to hold label that needs to be moved 
      Map<JLabel, Icon> labelMap = new HashMap<>(); 
      for (int i = 0; i < labelGrid.length; i++) { 
       for (int j = 0; j < labelGrid[i].length; j++) { 
        Icon icon = labelGrid[i][j].getIcon(); 
        if (icon != null) { 
         int newI = i == 0 ? labelGrid.length - 1 : i - 1; 
         labelGrid[i][j].setIcon(null); 
         labelMap.put(labelGrid[newI][j], icon); 
        } 
       } 
      } 

      // move the icon after the iteration complete so as not to move it twice 
      for (JLabel label : labelMap.keySet()) { 
       label.setIcon(labelMap.get(label)); 
      } 
     } 
    } 

    // move all icons left 
    private class LeftAction extends MyAction { 
     public LeftAction(String name, int mnemonic) { 
      super(name, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      Map<JLabel, Icon> labelMap = new HashMap<>(); 
      for (int i = 0; i < labelGrid.length; i++) { 
       for (int j = 0; j < labelGrid[i].length; j++) { 
        Icon icon = labelGrid[i][j].getIcon(); 
        if (icon != null) { 
         int newJ = j == 0 ? labelGrid[i].length - 1 : j - 1; 
         labelGrid[i][j].setIcon(null); 
         labelMap.put(labelGrid[i][newJ], icon); 
        } 
       } 
      } 
      for (JLabel label : labelMap.keySet()) { 
       label.setIcon(labelMap.get(label)); 
      } 
     } 

    } 

    private static void createAndShowGui() { 
     Game2 mainPanel = null; 
     try { 
      mainPanel = new Game2(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 

     JFrame frame = new JFrame("Game2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 
+0

OKので、アプレットを使用して、それ自体の問題がある、私は、コードを転送して作ることができるはずだと思いますそれはSwingコンポーネントを使用して動作しますが、時間がかかりすぎると作業が終わり、最終的にはうまくいくことが期待されます。 –

+0

@AlexCapistran:例のコードを参照してください。 –

+0

私はあなたがやったことをやりたいと思っていますがまだ学習していますが、私はまだ学んでいないそのコードにはたくさんのことがありますので、私がどれだけ知っているのか、しかし、私は本当にアドバイスと助けに感謝、ありがとう! –

関連する問題