2014-02-07 6 views
1

У меня есть вопросы о том, как использовать ArrayList. Я новичок в java, поэтому я хотел бы узнать о его практическом использовании и правильном использовании. Мне сказали, что я могу использовать список массивов для отображения моих объектов, но я не могу понять, как добавить это в мой текущий проект.Как я могу использовать ArrayList для отображения движущихся объектов?

Я работаю над отображением 3-х труб одновременно, контролируя скорость и частоту обновления с помощью таймеров. Думаю, я наконец понял основы JFrame и JPanel, но я недавно познакомился с мистикой , поэтому любые примеры по этому вопросу также будут полезны.

До сих пор я мог добавить начальное меню, состоящее из кнопки воспроизведения. После того, как пользователь нажимает «Играть!», Меню следует заменить игровой панелью и установить playerIsReady на true, начиная таймеры, которые должны добавить на экран три экземпляра pipe.java, каждый из которых перемещается влево на timer «скорость». Все трубки начинаются справа от экрана.

Я хотел бы лучше понять, как добавить расстояние между объектами pipe. Меня также интересует, как я мог загружать и печатать локальные изображения на экране.

Если вы попытаетесь ответить на любой из этих вопросов, пожалуйста, подробно объясните каждый шаг, поскольку я новичок на Java. Спасибо, что нашли время, чтобы помочь. Если вы здесь не для ответа на вопрос, я надеюсь, что вы сможете узнать что-то из любого кода/ответа здесь.

игры

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.border.EmptyBorder; 
import javax.swing.SwingUtilities; 

public class Game { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() {    
       // the GUI as seen by the user (without frame) 
       final CardLayout cl = new CardLayout(); 
       final JPanel gui = new JPanel(cl); 
       // remove if no border is needed 
       gui.setBorder(new EmptyBorder(10,10,10,10)); 

       JPanel menu = new JPanel(new GridBagLayout()); 
       JButton playGame = new JButton("Play!"); 
       ActionListener playGameListener = new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         cl.show(gui, "game"); 
        } 
       }; 
       playGame.addActionListener(playGameListener); 
       Insets margin = new Insets(20, 50, 20, 50); 
       playGame.setMargin(margin); 
       menu.add(playGame); 
       gui.add(menu); 
       cl.addLayoutComponent(menu, "menu"); 

       final JPanel pipes = new Pipes(); 
       gui.add(pipes); 
       cl.addLayoutComponent(pipes, "game"); 

       JFrame f = new JFrame("Pipes Game"); 
       f.add(gui); 
       // Ensures JVM closes after frame(s) closed and 
       // all non-daemon threads are finished 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       // See http://stackoverflow.com/a/7143398/418556 for demo. 
       f.setLocationByPlatform(true); 

       // ensures the frame is the minimum size it needs to be 
       // in order display the components within it 
       f.pack(); 
       // should be done last, to avoid flickering, moving, 
       // resizing artifacts. 
       f.setVisible(true); 

       /*if (playerIsReady) { 
        Timer speed = new Timer(10, new ActionListener() { //pipe speed 
         @Override 
         public void actionPerformed(ActionEvent e) { 
          pipes.move(); 
         } 
        }); 
        speed.start(); 

        Timer refresh = new Timer(30, new ActionListener() { //refresh rate 
         @Override 
         public void actionPerformed(ActionEvent e) { 
          pipes.repaint(); 
         } 
        }); 
        refresh.start(); 
       }*/ 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency 
     SwingUtilities.invokeLater(r); 
    } 
} 

PipeObject

import java.awt.Graphics; 

public class PipeObject { 
    //Declare and initialiaze variables 
    int x1 = 754;    //xVal start 
    int x2 = 75;    //pipe width 
           //total width is 83 
    int y1 = -1;    //yVal start 
    int y2 = setHeightVal(); //pipe height 
    int gap = 130;    //gap height 

    public void drawPipe(Graphics g) { 

     g.clearRect(0,0,750,500);      //Clear screen 
     g.drawRect(x1,y1,x2,y2);      //Draw part 1 
     g.drawRect(x1-3,y2-1,x2+6,25);     //Draw part 2 
     g.drawRect(x1-3,y2+25+gap,x2+6,25);    //Draw part 3 
     g.drawRect(x1,y2+25+gap+25,x2,500-y2-49-gap); //Draw part 4 
    } 

    public void move() { 
     x1--; 
    } 

    public int getMyX() { //To determine where the pipe is horizontally 
     return x1-3; 
    } 

    public int getMyY() { //To determine where the pipe is vertically 
     return y2+25; 
    } 

    public int setHeightVal() {  //Get a random number and select a preset height 
     int num = (int)(9*Math.random() + 1); 
     int val = 0; 
     if (num == 9) 
     { 
      val = 295; 
     } 
     else if (num == 8) 
     { 
      val = 246; 
     } 
     else if (num == 7) 
     { 
      val = 216; 
     } 
     else if (num == 6) 
     { 
      val = 185; 
     } 
     else if (num == 5) 
     { 
      val = 156; 
     } 
     else if (num == 4) 
     { 
      val = 125; 
     } 
     else if (num == 3) 
     { 
      val = 96; 
     } 
     else if (num == 2) 
     { 
      val = 66; 
     } 
     else 
     { 
      val = 25; 
     } 
     return val; 
    } 
} 

ответ

2

Так что ваш PipeObject класс просто класс модели данных. метод drawPipe на самом деле ничего не делает. Вам нужен класс JPanel для визуализации этих данных и вызывать метод drawPipe в методе paintComponentJPanel, передавая ему контекст Graphics.

Кроме того, если yo хочет иметь разные местоположения местоположения x, вам нужен конструктор, который принимает различные значения x. Кажется, что значения y должны быть одинаковыми, так как всегда остаются на одной и той же оси y. Ваш конструктор в вашем PipeObject классе должен выглядеть как этот

int x1; // no need to give them values. 
int x2; // This will be done when you create a new PipeObject object 

public PipeObject(int x1, int x2) { 
    this.x1 = x1; 
    this.x1 = x2; 
} 

И когда вы создаете new PipeObject объект, вы будете передавать различные значения для него. Чтобы подвести итог двум пунктам выше, у вас будет что-то вроде этого.

public class PipePanel extends JPanel { 
    List<PipeObject> pipes = new ArrayList<PipeObject>(); 

    public PipePanel() { 
     pipes.add(new PipeObject(100, 90)); 
     pipes.add(new PipeObject(300, 290)); 
     pipes.add(new PipeObject(500, 490)); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     for (PipeObject pipe : pipes){ 
      pipe.drawPipe(g); 
     } 
    } 
} 

Затем вы можете добавить и экземпляр PipesPanel к раме.Также обратите внимание, что в вашем PipesPanel вы должны переопределить getPreferredSize, поэтому он будет иметь нужный размер, и вы можете просто pack() кадр

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(800, 500); // or what ever values you want for screen size 
} 

Кроме того, если вы хотите, чтобы манипулировать или анимировать PipeObject просто позвонить по одному из его methods like переезд() , then call repaint`. Что-то вроде

Timer timer = new Timer(50, new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     for (PipeObject pipe : pipes) { 
      pipe.move(); 
     } 
     repaint(); 
    } 
}); 
+0

Это потребует некоторой практики, но хорошее объяснение –

+0

Держите [** Действительно Big Index **] (http://docs.oracle.com/javase/tutorial/reallybigindex.html) как справочное руководство. Попытайтесь заполнить пару разделов каждый день. Это позволит вам быстро освоить основы Java. Объекты - это очень простая концепция Java. Вы можете начать с раздела [** Объектно-ориентированные концепции программирования **] (http://docs.oracle.com/javase/tutorial/java/concepts/index.html). Счастливое кодирование! –

+0

Каждый раз, когда вас предстает с концепцией, которую вы не понимаете, 95% времени вы найдете в этой ссылке справочное руководство. –

Смежные вопросы