Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка игры "Территория" (Точки), Java, с нуля 
:(
    Опции темы
Qawra
Дата 11.1.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



Эту строчку я не могу найти  smile 
Код

points[x][y] = new DrawablePoint(int x, int y); // ы?..

Судя по всему я её успела отредактировать как
Код

 points = new DrawablePoint[rows][cols];

Класс Grids я скомпелировала так 
Код

import javax.swing.*;
import java.awt.Dimension;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Grids extends JFrame {
    GridsCanvas canvas; 
     public int rows=20;
     public int cols=20;
     public int sellSize=20 ;
    
    Grids() // constructor
    {
        canvas = new GridsCanvas(rows, cols, sellSize); 
      
        canvas.setSize(rows*sellSize , cols*sellSize);
        add(canvas);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                int exitCode = JOptionPane.showConfirmDialog(Grids.this, "Exit " + getTitle() + "?", "Confirm exit", JOptionPane.YES_NO_OPTION);
                if (exitCode == JOptionPane.OK_OPTION) {
                    System.exit(0);
                }
            }
        });
        pack();
        setTitle("Points");
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    } 
    }


Где-то закралась ошибка потому что окошко выходит без решётки и не по центру экрана . Закрывается нормально но есть Terminal window с текстом
Код

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container
    at java.awt.Container.addImpl(Container.java:1022)
    at java.awt.Container.add(Container.java:935)
    at javax.swing.JFrame.addImpl(JFrame.java:545)
    at java.awt.Container.add(Container.java:352)
    at Grids.<init>(Grids.java:18)
    at Window.mouseClicked(Window.java:74)
    at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
    at java.awt.Component.processMouseEvent(Component.java:6044)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5806)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4413)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4243)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3995)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
    at java.awt.Container.dispatchEventImpl(Container.java:2102)
    at java.awt.Window.dispatchEventImpl(Window.java:2440)
    at java.awt.Component.dispatchEvent(Component.java:4243)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


На кнопке старт я изменила вызов конструктора с  new Grids("Points", 800, 800, 20, 20).setVisible(true);    на new Grids( );

DrawablePoints выглядят теперь так 
Код

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;

class DrawablePoint //extends Component
{

    private Color color;
    public  int radius = 6;
    public int x;
    public int y;
    
    DrawablePoint(Color color) 
    {
        this.color = color ;
    }

    private void   drawCircle (int  x,int   y,  int radius, Graphics g)
    {
    g.drawOval(x - radius, y - radius, radius*2, radius*2);
   }  
   
   public void paint(Graphics g, int x, int y) {
  int pointRadius = 3;
  drawCircle(x, y, pointRadius, g);
  }
}

И остался ещё класс BattleField который нам не нужен но там прописан метод
Код

public void makePoints (int rows , int cols)
  {  points = new DrawablePoint[rows][cols];
      for(int y=0; y<cols; y++)
          {for(int x=0; x<rows; x++) 
             {
 который теперь надо вызывать прописать в GridCanvas/

PM MAIL   Вверх
Rpahut
Дата 12.1.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Цитата

Эту строчку я не могу найти  smile 

Эта плоха. Быть она должна.
Цитата

Судя по всему я её успела отредактировать как
points = new DrawablePoint[rows][cols];

Вот после этой строчки у вас был там цикл инициализации массива в котором я видел ошибку... Если вы ее уже поправили - тогда ладно.

Цитата

Класс Grids я скомпелировала так 

Одно замечание:
canvas.setSize(rows*sellSize , cols*sellSize);
можно убрать. Для JPanel размер устанавливается через setPreferredSize(), и делать это нужно в конструкторе GridsCanvas.

Цитата

Где-то закралась ошибка
java.lang.IllegalArgumentException: adding a window to a container

Видимо ему не нравится extends класса GridsCanvas. Пока там не будет extends JPanel ошибка так и останется.

Цитата

На кнопке старт я изменила вызов конструктора
...
DrawablePoints выглядят теперь так
...

Норм. 

Метод makePoints() нужно перенести из BattleField в GridsCanvas. Класс BattleField можно после этого убрать совсем.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 12.1.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



Нашла ! Эта строчка была в классе BattleField который мы уже не используем .Там мы инициализировали массив точек в методе  makePoints
Код

 public void makePoints ( int rows , int cols)
  {  points = new DrawablePoint[rows][cols];
      for(int y=0; y<cols; y++)
          {for(int x=0; x<rows; x++) 
             { points[x][y] = new DrawablePoint( x,  y);  
              }
 Теперь мы  уже не можем это делать потому что класс DrawablePoint  в настоящий момент не содержит такого конструктора . Там теперь конструктор 
Код

 DrawablePoint(Color color) 
    {
        this.color = color ;
    }
 

нужно видимо ввести  соординаты x,y как аргументы  , либо  сделать два разных конструктора DrawablePoint  . Один только с цветом а второй только с координатами .

class GridsCanvas extends JFrame  было ещё вчера .. Сегодня ошибка повторилась . 
"adding a window to a container" может означать что мы добавляем add(canvas); неправильно с точки зрения компайлера ..?


PM MAIL   Вверх
Rpahut
Дата 12.1.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Цитата

class GridsCanvas extends JFrame  было ещё вчера

extends JPanel. JFrame - это окно, нельзя добавить окно в окно.

Конструктор точки пусть остается как есть. Цикл инициализации массива нужно модифицировать - передавать точке вместо координат цвет. Кроме того x и y мы будем передавать точке во время отрисовки.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 12.1.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



C extends JPanel всё получилось замечательно.Сообщение о ошибке изчезло и решётка вышла нормально . 
PM MAIL   Вверх
Rpahut
Дата 13.1.2009, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Ну вот, дальше собственно берем цикл
Код

for(int y=0; y<cols; y++) {
  for(int x=0; x<rows; x++) {
    points[x][y].paint(g, x*cellSize, y*cellSize); // вызываем метод paint() каждой точки
  }
}

и вставляем его в GridsCanvas в метод paintComponent(). Точки должны рисоваться цветом, который вы передаете им при создании.
И не удивляйтесь если точки окажутся неправильно расположены на сетке.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 13.1.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



Я изменила цикл инициализации массива 
Код

public void makePoints ( int rows , int cols)
      {  points = new DrawablePoint[rows][cols];
          for(int y=0; y<cols; y++)
            {for(int x=0; x<rows; x++) 
             {  points[x][y] = new DrawablePoint( color);  
              }
  и вызвала paint() для каждой точки 
 на строчке 
Код
             points[x][y].paint(g, x*cellSize, y*cellSize);  
 компайлер не может найти переменную cellSize которая является public членом того же класса. ..
Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

class GridsCanvas extends JPanel{

     public int rows=20;
     public int cols=20;
     public int sellSize=20 ;
     private Color color;
    
     private DrawablePoint points[][]; 
         
    GridsCanvas(int r, int c,int sellSize) {
        this.rows = r;
        this.cols = c;
        this.sellSize=sellSize;
        setVisible(true);
        setPreferredSize(new Dimension(800, 800));
    }

    public void paintComponent(Graphics g) {
        int i;
        int width = getSize().width;
        int height = getSize().height;
        // draw the rows
        int rowHt = height / (rows);
        for (i = 0; i < rows; i++)
            g.drawLine(0, i * rowHt, width, i * rowHt);
        // draw the columns
        int rowWid = width / (cols);
        for (i = 0; i < cols; i++)
            g.drawLine(i * rowWid, 0, i * rowWid, height);
            
        for(int y=0; y<cols; y++) {
          for(int x=0; x<rows; x++) {
             points[x][y].paint(g, x*cellSize, y*cellSize);  // вызываем метод paint() каждой точки
               }
              }
             }
    
     public void makePoints ( int rows , int cols)
      {  points = new DrawablePoint[rows][cols];
          for(int y=0; y<cols; y++)
            {for(int x=0; x<rows; x++) 
             {  points[x][y] = new DrawablePoint( color);  
              }
       }
   }
}

 

Это сообщение отредактировал(а) Qawra - 13.1.2009, 18:34
PM MAIL   Вверх
arilou
Дата 13.1.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Qawra, 
[
Цитата

  public int sellSize=20 ;


опечатка. должно быть cellSize


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Rpahut
Дата 13.1.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Угу.
И переменные rowHt и rowWid в методе paintComponent() это тот же cellSize, так что от них можно избавиться.
Код

// эти строчки можно выкинуть
        int width = getSize().width;
        int height = getSize().height;
        ...
        int rowHt = height / (rows);
        ...
        int rowWid = width / (cols);

В остальных местах где эти переменные используются меняем их на cellSize.

Кстати, переменные-члены класса у нас везде должны быть private, потому что пользуется ими только сам класс. Да и вообще разумно спрятать переменные класса от остальной программы.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 13.1.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



Если отключить 
Код

int rowHt = height / (rows);
int rowWid = width / (cols);
 то надо как-то модифицировать  paintComponent потому что
без них ничего нарисовать в данный момент нельзя.
Код

// draw the rows
       
        for (i = 0; i < rows; i++)
            g.drawLine(0, i * rowHt, width, i * rowHt);
        // draw the columns
        
        for (i = 0; i < cols; i++)
            g.drawLine(i * rowWid, 0, i * rowWid, height);
  
PM MAIL   Вверх
Rpahut
Дата 14.1.2009, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Код

g.drawLine(0, i * cellSize, width, i * cellSize);

и дальше в том же духе
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 14.1.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



скомпелировалось так 
Код

 public void paintComponent(Graphics g) {
        int i;
        
        for (i = 0; i < rows; i++)
            g.drawLine(0, i * cellSize, i * cellSize,rows);
        
        for (i = 0; i < cols; i++)
            g.drawLine(i * cellSize, 0, i * cellSize,cols);
            
        for(int y=0; y<cols; y++) {
          for(int x=0; x<rows; x++) {
             points[x][y].paint(g, x*cellSize, y*cellSize);  
               }
              }
             }
 без rows и cols в аргументах drawLine не компелировалось поэтому я их там прописала. Как вы и предупреждали  рисует косые линии  там где предполагается решётка. Есть сообщение о NullPointerException в 34 строкe:
Код

  points[x][y].paint(g, x*cellSize, y*cellSize);  
 Array у нас инициализирован как private  член класса 
Код

private DrawablePoint points[][]; 
 
PM MAIL   Вверх
Rpahut
Дата 15.1.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 5
Всего: 7



Цитата

Как вы и предупреждали  рисует косые линии

Вот этого я не ожидал  smile 

Цитата

без rows и cols в аргументах drawLine не компелировалось поэтому я их там прописала.

А почему именно их?

Давайте разберемся:
Лини рисуются при помощи drawLine() + Линии рисуются неправильно = Неправильно используется метод drawLine()

drawLine() принимает четыре аргумента:
drawLine(x1, y1, x2, y2)
x1 и y1 это координаты начала линии, x2 и y2 - координаты ее конца. Нам, чтобы начертить сетку, нужно нарисовать вертикальные и горизонтальные линии на поле
Код

// чертим горизонтальные линии, строки
for (i = 0; i < rows; i++)
  g.drawLine(???);
// чертим вертикальные линии, колонки
for (i = 0; i < cols; i++)
  g.drawLine(???);

У горизонтальных линий y1 и y2 должны быть одинаковые, иначе они не будут горизонтальными. Вообще любая точка на горизонтальной прямой имеет ту же координату Y. У вертикальных линий должны быть одинаковые x1 и x2.
Дальше - первую горизонтальную линию нам надо начертить в самом верху поля, все остальные - ниже предыдущей на cellSize. Т.е. координата Y кратна cellSize и равна cellSize*номерСтроки; у нас в цикле уже есть переменная i которая считает строки и содержит номер текущей строки. Записываем:
Код

drawLine(x?, cellSize*i, x?, cellSize*i) // одинаковые Y для начала и конца линии

Теперь x1 и x2. Каждая линия должна идти от одного края поля до другого, для этого один икс должен быть равен нулю(у левого края поля x=0), а другой равен ширине поля (т.е. cols*cellSize); вписываем иксы:
Код

drawLine(0, cellSize*i, cols*cellSize, cellSize*i) // вот так линии не будут косыми


Аналогично для вертикальных линий:
X начала и конца каждой линии одинаковый.
X кратен cellSize и равен cellSize*номерСтолбца (вместо номера столбца опять используем переменную i).
Y начала линии - ноль.
Y конца линии - расстояние от верха до низа поля = высота поля = количествоСтрок*cellSize

===========================
Цитата

Есть сообщение о NullPointerException

В этой строке:
Код

points[x][y].paint(g, x*cellSize, y*cellSize);

такое исключение может возникнуть, только если points[x][y] не содержит точки.
Скорее всего что-то случилось с циклом инициализации массива points.
Вообще с этим массивом мы много чего делаем, напомню самые важные моменты:
Код

private DrawablePoint points[][]; /* объявление; "у нас будет двумерный массив с именем points
  в котром будут храниться DrawablePoint" */
...
points = new DrawablePoint[cols][rows]; /* создание; "points-это двумерный массив DrawablePoints
  размером cols-на-rows" */
...
points[x][y] = new DrawablePoint(); /* инициализация; создаем и раскладываем DrawablePoints в
  ячейки массива*/

Когда мы создаем массив, в его ячейки раскладывается значение null. Если не инициализировать массив, null так там и останется. Если после этого попытаться что-то сделать с элементом в массиве, например
Код

points[x][y].paint()

возникает NullPointerException.

Когда инициализация у вас будет работать как надо, на экране сразу появятся точки.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 15.1.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



Зашла в интернет утром перед школой и убегаю ..В школе попробую переделать . У меня часовой пояс на два часа раньше чем московкий .Поэтому я иногда не успеваю smile
PM MAIL   Вверх
Qawra
Дата 15.1.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: 3
Всего: 4



Решётка теперь рисуется нормально.
Цикл инициализации массива points ...
Мне кажется чего - то нехватает в классе  DrawablePoint ..
Но начнём по порядку :
В классе GridsCanvas если мы инициализируем как член класса 
Код

private DrawablePoint points[][] ; // array to hold all possible  points
 а затем указываем его размер 
Код

 points [][]= new DrawablePoint[cols][rows];
 компайлер на этой строчке требует идентифайер . Если сделать всё в одну строчку 
Код

private DrawablePoint points[][] = new DrawablePoint[cols][rows]; 
 то это компелируется и мы переходим к созданию и раскладыванию точек по ячейкам .У нас есть для этого  метод makePoints но конструктору к которому он нас отсылает 
Код

 DrawablePoint(Color color) 
    {
        this.color = color ;    
    }
 нужен аргумент color.
Если мы передадим цвет при создании точек (не знаю правда какой реально  это цвет с точки зрения компайлера ..наверно firstPlayerColor..) то сообщение об ошибке изчезает 

Код

public void makePoints ( int rows , int cols)
      {  for(int y=0; y<cols; y++)
            {for(int x=0; x<rows; x++) 
             {  points[x][y] = new DrawablePoint( color);       
           }      
    

Осталась нарисовать точки...Для этого нам нужны аргументы. В классе  DrawablePoint у нас прописано почему- то даже два метода
Код

 public void   drawCircle (int  x,int   y,  int radius, Graphics g)
    {
    g.drawOval(x - radius, y - radius, radius*2, radius*2);
   }  
   
   public void paint(Graphics g, int x, int y) 
   {
    int pointRadius = 6;
    drawCircle(x, y, pointRadius, g);
  }

 
когда я пытаюсь нарисовать точки как 
Код

points[x][y].drawCircle(x, y, 6, g);
 класс компелируется но при запуске программы выходит NullPointerException на этой строчке. Я думаю  нам надо переделать метод для рисования . Может быть проблема в Graphics g ..
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.3397 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.