2013-03-04 8 views
0

Я пытаюсь создать игру с той же системой, что и змея. Я создал окно с JPanel на нем, учитывая его фон и нарисованные линии, чтобы показать пользователю квадраты.Создание квадратов на событии

Совет - 600x600 (601x601 для всех видимых). Площади 20х20.

Теперь я пытаюсь добавить способ размещения цветных квадратов на доске, а также определить, есть ли идеальный цветной квадрат.

public class CreateWindow extends JFrame { 

    JPanel GameArea; 
    static JLayeredPane Java_Window; 
    Image Background; 

    public void CreateWindow() { 
     Dimension Panel_Size = new Dimension(800, 800); 
     this.setSize(800,800); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
     this.setTitle("LineRage"); 
     getContentPane().setBackground(Color.white); 

     Java_Window = new JLayeredPane(); 
     this.add(Java_Window); 
     Java_Window.setPreferredSize(Panel_Size); 

     GameArea = new JPanel() 
     { 
      @Override 
      public void paint(Graphics g) { 
       g.setColor(Color.BLACK); 
       g.fillRect(0,0,601,601); 

       g.setColor(Color.GRAY); 
       // Cut map into sections 
       int x; 
       //draw vertical lines 
       for(x = 0; x < 31; x++) { 
        g.drawLine(x*20,0,x*20,600); 
       }  
       //draw horizontal lines 
       for(x = 0; x < 31; x++) { 
        g.drawLine(0,x*20,600,x*20); 
       }  
      } 

      public void PaintSquare (int x,int y) { 
       //Check if square painted 

       //Paint square 
       Rectangle rect = new Rectangle(x, y, 20, 20); 
       GameArea.add(rect); 
      } 
     }; 
     Java_Window.add(GameArea, JLayeredPane.DEFAULT_LAYER); 
     GameArea.setBounds(20, 20, 601, 601); 
     GameArea.setVisible(true); 
    } 
} 

Так Java_Window (800x800) имеет белый фон, Game_Area (601x601) имеет черный фон с 32 линиями вдоль и поперек, чтобы разделить его на квадраты.

public void PaintSquare (int x, int y) { 
    //Check if square painted 

    //Paint square 
    Rectangle square = new Rectangle(x, y, 20, 20); 
    GameArea.add(square); 
} 

PaintSquare будет вызываться из другого объекта (основной игры) и проверить на фоне квадрата, если он свободен он будет рисовать квадрат на нем (20х20).

+1

В чем вопрос? – Reimeus

+0

Извините, что неясно, вопрос в том, как я могу создать квадраты, чтобы занять пространство, вызвав PaintSquare(). Я прочитал кучу вещей в Интернете, но ничего не смог сделать. –

ответ

1

Ваш точный вопрос неясен, но вот некоторые указатели:

  • Использование paintComponentpaint, а не при выполнении пользовательской картины в Swing. Не забудьте позвонить по номеру super.paintComponent(g).
  • java.awt.Rectangle не является производным от JComponent (или Component), поэтому его нельзя добавить в контейнер.
  • Один подход взять бы использовать fillRect и «краски» квадраты:

Кроме того, в Java, методы начинаются с строчной письма. Добавление этого и предыдущий пункт вместе, вы могли бы сделать:

public void paintSquare(Graphics g, int x, int y) { 
    g.fillRect(x, y, 20, 20); 
} 

Здесь метод paintSquare будет вызываться из paintComponent.

+0

+1 лучший подход; см. также этот пример [пример] (http://stackoverflow.com/a/3518047/230513). – trashgod

+0

Может ли fill fill использоваться после создания JPanel? –

+0

@ChrisBrown, Да, абсолютно ... – Reimeus

0

Следуйте советам Reimeus, и, кроме того, вам необходимо создать графический интерфейс.

Определите массив прямоугольников того же размера, что и игровая панель в классе игровой модели.

Rectangle[][] board; 

Таким образом, вы можете проверить внахлест змея в вашем классе модели, а не беспокоиться о том, что вы уже окрашены.

Ваш метод paintComponent становится довольно простым.

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    model.draw(g); 
} 

См. this answer для более полного разъяснения.

+0

Будет ли эффективен int 2-мерный массив? В конце концов, будет несколько пользователей, а затем переключатель, чтобы найти, если он свободен, есть змея пользователей или другой объект? –

+0

Массив int не будет достаточным. Модель должна содержать достаточно информации для рисования, поэтому я использовал класс Rectangle. Вы можете определить свой собственный класс и превратить его в двумерный массив. Ваш класс будет включать определяющий прямоугольник и любую другую информацию, которую вы хотите сохранить в своей модели. –

+0

Что делать, если я использовал Для int [30] [30] переключатель (int [x] [y]) case 1: paintSquare (g, x * 20, y * 20, Color.RED); paintSquare (Графика g, int x, int y, Цвет c) g.setColor (c); g.fillRect (x, y, 20, 20); –