2016-04-27 21 views
0

Dies ist mein Code für ein Spiel, das ich mache. Im Moment mache ich mir keine Gedanken darüber, wie das Spiel funktioniert. Ich war immer mehr besorgt darüber, dass jedes Mal, wenn ich den UP-Knopf drücke, die Panels verschwinden und manchmal, wenn ich auch den LEFT-Knopf drücke. Gibt es eine Erklärung dafür, kann mir jemand helfen zu verstehen, warum das passiert? Ich habe das Gefühl, dass es etwas mit meinen if-Aussagen zu tun hat, aber ich bin mir nicht wirklich sicher. Auch wenn ich mich mit dem Key Listener herumärbe und wenn Sie mir einen Ratschlag geben könnten wie einige Dos und Donts, schätze ich die Hilfe !!Warum verschwinden die Panels, wenn ich UP drücke?

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) { 

     } 

     } 

Antwort

3

Fragen und Anregungen:

  1. Sie Misch AWT (zum Beispiel Applet, Button, Label) mit Swing (z.B. JPanel, JLabel) gefährlich und ohne Notwendigkeit. Bleib bei Swing und beseitige alle Spuren von AWT.
  2. Sie malt direkt in einem Top-Level-Fenster, hier das Applet, eine gefährliche Sache zu tun. Nicht. Befolgen Sie die Swing-Graphik-Tutorials und zeichnen Sie die paintComponent-Methode eines JPanels.
  3. Sie rufen nicht die Super-Methode innerhalb Ihrer Malmethode überschreiben, eine andere gefährliche Sache zu tun, und ein weiteres Anzeichen dafür, dass Sie dies versuchen, ohne die wichtigen relevanten Tutorials zu lesen.
  4. Vergleichen Sie keine Strings mit == oder !=. Verwenden Sie stattdessen die Methode equals(...) oder equalsIgnoreCase(...). Verstehen Sie, dass == überprüft, ob die beiden Objektreferenzen die gleichen sind, an denen Sie nicht interessiert sind. Die Methoden auf der anderen Seite überprüfen, ob die beiden Strings die gleichen Zeichen in der gleichen Reihenfolge haben, und darauf kommt es an.
  5. Sie versuchen, den Speicherort einer Komponente wie JPanel ohne Berücksichtigung der Layout-Manager direkt festzulegen. Tu das nicht. Bewegen Sie stattdessen logische (Nicht-Komponenten-) Objekte und zeigen Sie die Bewegung in Ihren Grafiken an.

Sie können Links zu den Swing-Tutorials und andere Swing-Ressourcen hier: Swing Info

Später können wir reden, warum Sie Applets aller Aromen vermeiden sollten ...

Ich selbst würde Verschieben Sie ImageIcons um ein Raster von JLabels und verwenden Sie nicht direkt eine Malmethode. Zum Beispiel

Example program animation

Um zu sehen, führen Sie den folgenden Code ein:

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 so ein Applet ist problematisch an und für sich, ich glaube, ich sollte in der Lage, den Code zu übertragen und machen Es funktioniert mit Swing-Komponenten, aber vorerst krank, um daran zu arbeiten und hoffe, es funktioniert am Ende. –

+0

@AlexCapistran: siehe Beispielcode zum Beispiel. –

+0

Ich würde gerne tun, was Sie gerade getan haben, aber ich lerne immer noch und es gibt eine Menge in diesem Code, den ich noch zu lernen habe, also bitte verstehen, dass ich dies basierend darauf, wie viel ich weiß und basierend auf was ich tun kann , aber ich schätze den Rat und die Hilfe sehr, danke! –

Verwandte Themen