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

Поиск:

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


Опытный
**


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

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



А мне не понятно зачем выделение последней точки каждого игрока smile Вот посмотришь ты с этим выделением на поле и будет тебе непонятно чей ход. А если одна только точка выделена, то всё очевидно.
Вообще это мелочи. Надо замыкание срочно писать.


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
Qawra
Дата 30.1.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Расказываю и показываю  как я последнию точку выделила   smile
Много мучалась потому что ободок зарисовывался цветом игрока .
Пришлось вводить private boolean lastPoint
  два классах подкорректированы 
Код

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 cellSize=30 ;
     private Color color;
     private DrawablePoint points[][]; // array to hold all possible  points
     
       
    GridsCanvas(int r, int c,int cellSize) {
        this.rows = r;
        this.cols = c;
        this.cellSize=cellSize;
        setVisible(true);
        
        setPreferredSize(new Dimension( (c+1)*cellSize, (r+1)*cellSize )); // we make our window bigger than grid to have extra place and easier access to the points on the edge of the grids
        points = new DrawablePoint[cols][rows];
        makePoints(rows,cols);
    }

    public void paintComponent(Graphics g) {
        
        g.translate(cellSize, cellSize); //we move the grid rigt and down on the distance of the cellSize
        
        for (int i = 0; i < rows; i++)
             g.drawLine( i * cellSize, rows*cellSize-cellSize,  i * cellSize,0 );//g.drawLine(0, cellSize*i, cols*cellSize, cellSize*i);
            
        for (int j = 0; j < cols; j++)
            g.drawLine(0, cellSize*j, cols*cellSize-cellSize, cellSize*j); // g.drawLine(j * cellSize, rows*cellSize,  j * cellSize,0);
            
        for(int y=0; y<cols; y++) {
          for(int x=0; x<rows; x++) {
              
              points[x][y].paint(field2screen(x), field2screen(y), g);  //  displays   points     
           }
          }
         g.translate(-cellSize, -cellSize);
       }
     
     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); // create  all points    
            }      
          }
         }
     public boolean mouseWasClicked(int x, int y, Color playerColor) // accepts coordinates and the playerColor of the mouse click
     { 
         int pointX = screen2field(x); // count which point was clicked
         int pointY = screen2field(y);
         boolean ok = false;
         if( goodCoords(pointX, pointY) ) {
                ok = points[pointX][pointY].setNewColor(playerColor); // sets the  owner  color show that the point is occupied by player    
            }
        // else - do nothing if coorditates is not good 
               return ok;
     }
     
     private boolean goodCoords(int fieldX, int fieldY) {
       /*if X is zero or positive and  if Y is zero or positive and  if X is less than field width and  if Y is less than field height...
       we can use   coordinates of the mouse click */
       if(fieldX>=0 && fieldY>=0 && fieldX<cols && fieldY<rows)  // ...good coordinates
       return true;

       else //  bad coordinates which dive  ArrayIndexOutOfBoundsException
       return false;
       }
   
     private int screen2field(int coord) { // screen to field convert coordinates
       return (coord-cellSize/2) /cellSize; // shift  coordinates of the click by half cellSize to draw points on the corners of the grids  
      }

     private int field2screen(int coord) { // field to screen  convert coordinates
       return coord*cellSize;
      }
  }


и
Код

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

class DrawablePoint 
{

    private Color color;
    public  int radius;
    private int x;
    private int y;
    private Graphics g;
    private boolean lastPoint;
    
    DrawablePoint(Color color) 
    {
        this.color = color ;
        radius = 6;
        lastPoint = true;
    }
    public void   paint (int  x,int   y,  Graphics g)
    {   
        this.x = x;
        this.y = y;
        this.g = g;

        g.setColor(color);          
        if(color==null) {
            
        }
        else {
            if (lastPoint) {
              drawOutline(x,y);
              lastPoint = false;
            }
            drawCircle(x, y, g); // pass  x, y ,Graphics  g   and draw the points         
        }  
 }
    public void   drawCircle (int  x,int   y,  Graphics g)
    {   
        this.g = g;
        g.setColor(color);
        g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
    }  
     
    public void drawOutline(int x, int y){        
        this.g.setColor(new Color(0,0,0));
        this.g.drawOval(x- 8, y-8, (6*2)+2,(6*2)+2);
        this.g.setColor(color);
    }
    
    public boolean setNewColor(Color playerColor) { // accepts new color
        if(color!=null) // color is changed already
         return false; // do nothing and return false
        color = playerColor; // changes color
         return true;
   }
   
   public int getX(){
       return x;
    }
    
    public int getY(){
        return y;
    }
   
    public Graphics getGraphics(){
        return g;
    }
    
    public boolean isDrawn(){
        return lastPoint;
    }
   
}








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


0xdeadbeef
*


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

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



Цитата

будет тебе непонятно чей ход

А ну если в этом смысле... тогда вообще можно надпись сделать вроде "Ход игрока 1" и "Ход игрока 2". Заголовок окна менять например.

Добавлено @ 18:59
Qawra, хитро smile 
Ну это можно убрать:
Код

   this.g = g;

и передавать Graphics прямо в метод:
Код

public void drawOutline(int x, int y, Graphics g){
   g.setColor(Color.black);//g.setColor(new Color(0,0,0));
...

Ни к чему нам плодить ненужные переменные класса.

Это сообщение отредактировал(а) Rpahut - 30.1.2009, 19:01
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Rpahut
Дата 30.1.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Сейчас думаю как организовать соединение точек.

Вообще нужно решить три задачи:
1. Как хранить соединение
2. Как создавать соединение
3. Как отображать соединение

Хранить соединения лучше всего внутри класса DrawablePoint, потому как "соединенность" с другой точкой - это свойство самой точки. Для дальнейшей обработки удобнее хранить их в виде массива DrawablePoint размером [8](максимальное количество соединений у каждой точки). Каждый элемент этого массива будет тогда либо содержать null, либо хранить Точку, с которой у данной точки есть соединение.

Создание соединений обязан выполнять класс GridsCanvas - именно в нем хранится поле, что позволяет нам рассмотреть каждую из соседних точек и определить необходимость соединения. В класс DrawablePoint нужно добавить метод connectTo(DrawablePoint p) чтобы можно было сохранить найденное соединение внутри Точки.

Отображение соединений опять же возлагается на DrawablePoint. Единственное что для его реализации Точка должна знать свои собственные экранные координаты и иметь возможность получить координаты точек с которыми она соединена(для использования drawLine()). Из этих соображений нужно переделать конструктор класса DrawablePoint так, чтобы он принимал не Цвет, а экранные координаты Точки. Тем более что в качестве цвета в конструктор сейчас мы передаем всегда null - можно обойтись без передачи этого параметра. Тем более что в классе уже есть переменные int x, y которые нигде не используются. Тем более что мы рассчитываем и передаем экранные координаты точки каждый раз когда нужно ее нарисовать, хотя они всегда одинаковые и можно рассчитать их один раз.
Еще у Точки должны быть методы
public int getX();
public int getY();
которые позволят получить ее экранные координаты.

====================
Итак:

Добавляем в члены класса DrawablePoint массив
Код

private DrawablePoint connectedTo[] = new DrawablePoint[8];


Модифицируем конструктор DrawablePoint:
Код

    public DrawablePoint(int sx, int sy)
    {
        x = sx;
        y = sy;
        radius = 6;

    }


Добавляем в DrawablePoint методы для получения ее координат:
Код

    public int getX() {
        return x;
    }
    public int getY() {
        return Y;
    }


Добавляем drawConnections() и используем его в DrawablePoint.paint():
Код

    private void drawConnections(Graphics g) {
        DrawablePoint B;

        for(int i=0; i<8; i++) { // for each from connectedTo[]
            B = connectedTo[i];
            if(B==null) break; // if no more points - end loop
            g.drawLine(x, y, B.getX(), B.getY()); // draw line from this point to B point
        }
    }

    public void paint (Graphics g) // x and y is now stored within class
    {   
        g.setColor(color);          
        if(color==null) {
            
        }
        else {
            drawConnections(g); // <- display all connections of this point
            if (lastPoint) {
              drawOutline(x, y, g);
              lastPoint = false;
            }
            drawCircle(x, y, g); // pass  x, y ,Graphics  g   and draw the points         
        }  
     }


=====================
Вторичные изменения:
Поскольку мы изменили код конструктора Точки, создавать точки теперь тоже нужно по-другому:
Код

     public void makePoints ( int rows , int cols)
     {
          for(int y=0; y<cols; y++) {
               for(int x=0; x<rows; x++) {
                    // pass screen coords to point constructor
                    points[x][y] = new DrawablePoint( field2screen(x), field2screen(y) ); // create  all points    
               }      
          }
     }


То же самое с кодом отрисовки - экранные координаты точки теперь хранятся внутри нее и передавать их в paint() не нужно:
Код

     public void paintComponent(Graphics g) {
          g.translate(cellSize, cellSize); //we move the grid rigt and down on the distance of the cellSize

          for (int i = 0; i < rows; i++)
               g.drawLine( i * cellSize, rows*cellSize-cellSize,  i * cellSize,0 );//g.drawLine(0, cellSize*i, cols*cellSize, cellSize*i);

          for (int j = 0; j < cols; j++)
               g.drawLine(0, cellSize*j, cols*cellSize-cellSize, cellSize*j); // g.drawLine(j * cellSize, rows*cellSize,  j * cellSize,0);

          for(int y=0; y<cols; y++) {
               for(int x=0; x<rows; x++) {
                    points[x][y].paint(g);  //  displays   points     
               }
          }
          g.translate(-cellSize, -cellSize);
     }


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


Опытный
**


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

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



Гм, Уважаемая. Мне такой подход в наведении окаёма вокруг точек кажется несколько подозрительным, как по мне то нелогично для каждой точки добавлять переменную, показывающую последняя ли она, когда по логике игры таких точек будет максимум две. (Логично ссылки на эти точки вынести полем класса DrawablePoint) Но я поверил наслово, скопипастил и убедился, что указанное выше не очень работает.
Собственно, у меня вопрос. Где вы присваиваете какой-нить точке true в поле для рисования окаёма?

P.S. Мне долго надоедало, что если я нажал мышку, немного её подвигал и точка не ставилась. Теперь я всё, что было написано в MouseClicked переписал в MouseRealeased. Предлагаю автору сделать также.

Это сообщение отредактировал(а) Kakadu - 31.1.2009, 15:00


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
Qawra
Дата 31.1.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А зачем вы нажали мышку и немного подвигали ?  Вы же не рисовать собирались а территорию захватывать smile
Ваш метод рисования ободка я воплотить пыталась но у меня не получилось .Очень бы хотелось взглянуть на код . Буду очень вам признательна если вы его опубликуете и обьясните как он работает .

У нас сейчас с замыканием поля много работы . Я внесла последнии изменения и там есть одно узкое место в paintComponent
Код

public void paintComponent(Graphics g) {
          g.translate(cellSize, cellSize); //we move the grid right and down on the distance of the cellSize

          for (int i = 0; i < rows; i++)
               g.drawLine( i * cellSize, rows*cellSize-cellSize,  i * cellSize,0 );

          for (int j = 0; j < cols; j++)
               g.drawLine(0, cellSize*j, cols*cellSize-cellSize, cellSize*j); 

          for(int y=0; y<cols; y++) {
               for(int x=0; x<rows; x++) {
                    points[x][y].paint(g);  //  displays   points     
               }
          }
          g.translate(-cellSize, -cellSize);
     }
строчка points[x][y].paint(g);  не компелируется 
пишет что не может быть применена к  paint (int  ,int , java.awt.Graphics ) я подставила x и y .Строчка 
Код
points[x][y].paint(x,y,g);
 скомпелировалась нормально . Не факт что я сделала правильно потому что 
начались 

Код

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at DrawablePoint.drawOutline(DrawablePoint.java:49)
    at DrawablePoint.paint(DrawablePoint.java:33)
    at GridsCanvas.paintComponent(GridsCanvas.java:38)
    at javax.swing.JComponent.paint(JComponent.java:1027)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
    at javax.swing.JComponent.paint(JComponent.java:1013)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
    at java.awt.Container.paint(Container.java:1797)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:734)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    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)

  если строчку просто отключить то всё компелируется  . Но NullPointerException  остаётся и точки не прорисовываются.

Создаю  сейчас документацию . Use Case Diagram для нашей игры оказалась совсем несложная . user posted image

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


0xdeadbeef
*


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

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



Цитата

Мне долго надоедало, что если я нажал мышку, немного её подвигал и точка не ставилась. Теперь я всё, что было написано в MouseClicked переписал в MouseRealeased.

Да есть такой момент - но это на мой взгляд вопрос "доводки" игры и решать его именно сейчас, да и решать вообще, мне кажется нет необходимости.
Вообще, если по-хорошему делать, надо запоминать где была нажата кнопка мыши, и если указатель не уходил слишком далеко от этого места, засчитывать отпускание как клик в Точку. Можно и просто следить чтобы нажатие и отпускание было в пределах одной Точки.

Цитата

строчка points[x][y].paint(g);  не компелируется 
пишет что не может быть применена к  paint (int  ,int , java.awt.Graphics ) 

Правильно пишет.
Очевидно метод paint() все еще не исправлен. Он должен начинаться вот так:
Код

    public void paint (Graphics g) // note method parameters; x and y is now stored within class
    {
...


Цитата

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Нужно код посмотреть. Скорее всего проблема в this.g или может в setColor(color);

Кстати, расшифровка сообщения об ошибке:
Цитата

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at DrawablePoint.drawOutline(DrawablePoint.java:49)         // ошибка в DrawablePoint.drawOutline(); файл DrawablePoint.java строка 49

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


Бывалый
*


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

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



Вы были правы . Я исправила в двух местах this.g на g  и всё нормально заработало . 
Код

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

class DrawablePoint 
{

    private Color color;
    public  int radius;
    private int x;
    private int y;
    private Graphics g;
    private boolean lastPoint;
    
    private DrawablePoint connectedTo[] = new DrawablePoint[8];   // array  to keep information about points  around each point .
    
    DrawablePoint(int sx, int sy) 
    {
        
        x = sx;
        y = sy;
        radius = 6;
        lastPoint = true;
    }
    public void   paint (  Graphics g)// x and y coordinates are  stored within class
    {  
        g.setColor(color);          
        if(color==null) {
            
        }
        else {
            drawConnections(g); //  display all connections of this point
            if (lastPoint) {
              drawOutline(x,y,g);
              lastPoint = false;
            }
            drawCircle(x, y, g); // pass  x, y ,Graphics  g   and draw the points         
        }  
 }
    
    public void   drawCircle (int  x,int   y,  Graphics g)
    {   
        
        g.setColor(color);
        g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
    }  
     
    public void drawOutline(int x, int y, Graphics g){        
       
        g.setColor(Color.black);
        g.drawOval(x- 8, y-8, (6*2)+2,(6*2)+2);
        g.setColor(color);
    }
    
    public boolean setNewColor(Color playerColor) { // accepts new color
        if(color!=null) // if  color is changed already
         return false; // do nothing and return false
        color = playerColor; // changes color
         return true;
   }
   
   private void drawConnections(Graphics g) {
          DrawablePoint B;

        for(int i=0; i<8; i++) { // for each point  from  connectedTo[]
            B = connectedTo[i];
            if(B==null) break; // if no more points - end loop
            g.drawLine(x, y, B.getX(), B.getY()); // draw line from this point to B point
        }
    }
   
   public int getX(){
       return x;
    }
    
    public int getY(){
        return y;
    }
    
   
    public Graphics getGraphics(){
        return g;
    }
    
    public boolean isDrawn(){
        return lastPoint;
    }
   
}

PM MAIL   Вверх
Kakadu
Дата 2.2.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



user posted image
Я тут кое-что состряпал. Правда пришлось несколько изменить количество классов и логику. Ну да ладно, потом распишу, если будут вопросы.

P.S. прикрепляю исходники на NetBeans.

Это сообщение отредактировал(а) Kakadu - 2.2.2009, 14:08

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Faraon.zip 41,51 Kb


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
Qawra
Дата 2.2.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Cочетание цветов понравилось . В нём что-то есть . У меня к сожалению нет  NetBeans  . Поэтому я просто запустила jar файл и покликала мышкой .
Точки были а крестиков небыло ... Но всё равно неплохо .  
Какие идеи о замыкании поля ?



Это сообщение отредактировал(а) Qawra - 2.2.2009, 20:31
PM MAIL   Вверх
Rpahut
Дата 2.2.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Крестиков в самом деле почему-то нет. В jikes собрать не получилось, качаю Сеть-Бобы.

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


Бывалый
*


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

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



Я поняла что если линии начать рисовать до того как контур можно  замкнуть то играть не получиться . Они будут мешать искать замыкания . Красная линия автоматом соединилась ?
PM MAIL   Вверх
Rpahut
Дата 2.2.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Создание соединений

Создаваться соединения будут в mouseWasClicked(), но сначала подготовим почву.
От Точки нам нужны следующие методы:
Код

// не помню создавали мы его уже или нет
   /**
   * Get point color
   */
   Color getColor() {
      return color;
   }

Код

   /** connect this point to point p
   * @param p DrawablePoint this point should be connected to
   */
   void connectTo(DrawablePoint p) {
      for(int i=0; i<8; i++) {
         if(connectedTo[i]==p) return; // return if already connected to p
         if(connectedTo[i]==null) {
            connectedTo[i] = p; // write p to connectedTo[] array
            return;
         }
      }
   }

Код

   /**
   * check if this point is connected to point p
   * @param p DrawablePoint to be checked
   */
   boolean isConnectedTo(DrawablePoint p) {
      for(int i=0; i<8; i++) {
         if(connectedTo[i] == p) return true; // yes, its connected
      }
      return false; // no its not
   }


Дальше можно вставлять метод создания соединений в GridsCanvas
Код

    /**
    * Create connections for point
    * @param px point x coord
    * @param py point y coord
    */
    private void makeConnections(int px, int py) {
        DrawablePoint a, b;

        a = points[px][py]; // a - current point

        // for all eight points around current point
        for(int j=-1; j<=1; j++) {
            for(int i=-1; i<=1; i++) {
                if( goodCoords(px+i, py+j) ) {
                    b = points[px+i][py+j]; // b - point to check
                    // if not current point but have same color
                    if(a!=b && b.getColor() == a.getColor()) {
                        // if no another diagonal connection in this cell already exists
                        if( !points[px][py+j].isConnectedTo(points[px+i][py]) ) {
                            a.connectTo(b); // connect a to b
                            b.connectTo(a); // connect b to a
                        }
                    }
                } // if goodcoords end
            } // loop i end
        } // loop j end

    }

Используем его в mouseWasClicked():
Код

...
                ok = points[pointX][pointY].setNewColor(playerColor); // sets the  owner  color
                if(ok) {
                    // if color changed - create connections for this point
                    makeConnections(pointX, pointY);
               }
...


Добавлено через 9 минут и 11 секунд
Qawra, да, между соседними точками автоматически образуется соединение, если этому ничего не мешает.
Если в клетке уже есть одно диагональное соединение, то второе там уже не образуется. Это как раз правильно - просто при проверке захвата нам надо будет поиск по другому как-то делать.

user posted image
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Rpahut
Дата 3.2.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Пояснения по поводу создания соединений:
После щелчка пользователя в точку, если ее цвет успешно изменился, мы перебираем все точки рядом с ней. Если цвет соседней точки совпадает с цветом нашей точки, мы их соединяем друг с другом. Так же, чтобы программа не падала, каждый раз проверяются координаты точки (goodCoords()), и если мы соединяем по диагонали, проверяем чтобы в клетке небыло другого диагонального соединения:
Код

if( !points[px][py+j].isConnectedTo(points[px+i][py]) ) {

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


Бывалый
*


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

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



Как интересно получилось ! Мне нравиться ! Можно будет ещё соединяющие линии потолще сделать и цветом заливать захваченную территорию . Совершенно другое ощущение от игры . Не надо ждать пока вражеские точки в плен попадуться . Динамично отхватываешь по кусочку территории и душа радуется smile
Не знаю как увеличить толщину линий .Залить территорию можно с Graphics FillPolygon . Только где его прописать ...В makeConnections ?

Для меня удивительно что компайлер понимает что такое 
Код
a = points[px][py];
  вы уже обьяснили  что  px и  py  это координаты точки p 
Но если бы меня попросили их заранее написать я бы их написала через точку p.x  и p.y    (что выглядит немного странно ) . . 
Теоретически , p   -  это обьект , а координаты это его свойства - поэтому я бы их написала  через точку ...   В каких случаях можно обойтись без точки ?

Буду пробовать изобразить алгоритм графически используя flow chart ... хотя нет ...oн слишком сложный что бы сразу рисовать диаграмму   .Надо сначала в псевдо-коде его описать . 


Это сообщение отредактировал(а) Qawra - 3.2.2009, 14:58
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

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

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

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

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


 




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


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

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