2012-03-22 2 views
1

Я развиваю игру в java только для удовольствия. Это игра, играющая в мяч, что-то вроде.Разрыв кирпича с цепной реакцией

enter image description here

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

Таким образом, он будет очищать все на этом уровне без серых кирпичей.

Я думаю, что я должен спросить кирпич, который взорвался для других кирпичей, к LEFT, RIGHT, UP и DOWN этого кирпича, затем начать тот же процесс с этими ячейками.


// Примечание для себя: читать на Перечисления и Список

Когда взрывчатое клетка ударил с мячом он называет explodeMyAdjecentCells();

// Это в классе Cell

public void explodeMyAdjecentCells() { 

    exploded = true; 

    ballGame.breakCell(x, y, imageURL[thickness - 1][0]); 

    cellBlocks.explodeCell(getX() - getWidth(),getY()); 
    cellBlocks.explodeCell(getX() + getWidth(),getY()); 
    cellBlocks.explodeCell(getX(),getY() - getHeight()); 
    cellBlocks.explodeCell(getX(),getY() + getHeight()); 

    remove(); 

    ballGame.playSound("src\\ballgame\\Sound\\cellBrakes.wav", 100.0f, 0.0f, false, 0.0d); 

} 

// Это CellHandler -> (CellBlocks)

public void explodeCell(int _X, int _Y) { 


    for(int c = 0; c < cells.length; c++){ 

     if(cells[c] != null && !cells[c].hasExploded()) { 

      if(cells[c].getX() == _X && cells[c].getY() == _Y) { 

       int type = cells[c].getThickness(); 

       if(type != 7 && type != 6 && type != 2) { 

        cells[c].explodeMyAdjecentCells(); 
       } 


      } 
     } 
    } 

} 

Он успешно удаляет мои все соседние клетки,

Но в методе explodeMyAdjecentCells() у меня есть эта строка кода

ballGame.breakCell(x, y, imageURL[thickness - 1][0]); 

//

Эта строка сообщает ParticleHandler о создании 25 небольших изображений (частиц) взорванной ячейки.

Жесткие все мои клетки удалены, частицы частицы не создают частицы для всех удаленных ячеек.


Проблема была решена youst сейчас, его действительно глупо. Я установил particleHandler, чтобы создать максимум 1500 частиц. Мой бог, как я этого не видел!

private int particleCellsMax = 1500; 
private int particleCellsMax = 2500; 

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

Исходный код для разделения изображения на части была взята из: Kalani's Tech Blog

// Particle Handler

public void breakCell(int _X, int _Y, String URL) { 

    File file = new File(URL); 

    try { 

     FileInputStream fis = new FileInputStream(file); 
     BufferedImage image = ImageIO.read(fis); 

    int rows = 5; 
    int colums = 5; 

    int parts = rows * colums; 

    int partWidth = image.getWidth()/colums; 
    int partHeight = image.getHeight()/rows; 

    int count = 0; 

    BufferedImage imgs[] = new BufferedImage[parts]; 

    for(int x = 0; x < colums; x++) { 

     for(int y = 0; y < rows; y++) { 

      imgs[count] = new BufferedImage(partWidth, partHeight, image.getType()); 

      Graphics2D g = imgs[count++].createGraphics(); 

      g.drawImage(image, 0, 0, partWidth, partHeight, partWidth * y, partHeight * x, partWidth * y + partWidth, partHeight * x + partHeight, null); 
      g.dispose(); 
     } 
    } 

    int numParts = imgs.length; 
    int c = 0; 

    for(int iy = 0; iy < rows; iy ++) { 

     for(int ix = 0; ix < colums; ix++) { 

      if(c < numParts) { 

       Image imagePart = Toolkit.getDefaultToolkit().createImage(imgs[c].getSource()); 
       createCellPart(_X + ((image.getWidth()/colums) * ix), _Y + ((image.getHeight()/rows) * iy), c, imagePart); 

       c++; 

      } else { 

       break; 
      } 
     } 
    } 


    } catch(IOException io) {} 
} 

ответ

1

Я бы предположил, что метод, который рекурсивно получит все соприкасающиеся ячейки одинакового цвета. Тогда вы можете работать с этим списком (всех трогательных блоков) довольно легко и сломать все, которые не были сломаны.

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

// I agree with Matt that color (or type) should probably be an enum, 
// or at least a class. int isn't very descriptive 
public enum CellType { GRAY, RED, ORANGE } 

public class Cell{ 
.... 
    public final CellType type; 

    /** 
    * Recursively find all adjacent cells that have the same type as this one. 
    */ 
    public List<Cell> getTouchingSimilarCells() { 
     List<Cell> result = new ArrayList<Cell>(); 
     result.add(this); 
     for (Cell c : getAdjecentCells()) { 
      if (c != null && c.type == this.type) { 
       result.addAll(c.getTouchingSimilarCells()); 
      } 
     } 
     return result; 
    } 

    /** 
    * Get the 4 adjacent cells (above, below, left and right).<br/> 
    * NOTE: a cell may be null in the list if it does not exist. 
    */ 
    public List<Cell> getAdjecentCells() { 
     List<Cell> result = new ArrayList<Cell>(); 
     result.add(cellBlock(this.getX() + 1, this.getY())); 
     result.add(cellBlock(this.getX() - 1, this.getY())); 
     result.add(cellBlock(this.getX(), this.getY() + 1)); 
     result.add(cellBlock(this.getX(), this.getY() - 1)); 
     return result; 
    } 
} 
+0

Спасибо, я понимаю, что перечисления - лучший способ пойти. Жесткий, у меня мало опыта работы с Enums и с помощью List, я должен был бы прочитать об этом. Я немного переписал свой код (вид сверху) и проблема, с которой я все время сталкиваюсь, заключается в том, что все ячейки удаляются, но не все удаляются с эффектом (обработчик частиц) .. вы бы так чтобы просмотреть обновленный код. thx –

+0

Отлично! Я рад, что вы это поняли. – JohnnyK

2

Вы могли бы рассмотреть глядя на это более OO способом, и с помощью «сказать дон 't ask'. Таким образом, вы бы посмотрели на класс Brick, который бы знал, каков его цвет, и его соседние блоки.Тогда вы сказали бы, что первый блок взорвется, тогда он знал бы, что если бы он был оранжевым (и, возможно, подумайте об использовании Enums для этого, а не только о числах), тогда он сообщит соседним блокам о «реакции цепи» (или что-то вроде этого), эти блоки затем решат, что делать (либо взорваться в случае оранжевого блока - и называть их соседними блоками, либо нет в случае серого блока.

Я знаю, что он отличается от того, что вы делаете в настоящее время, но, надеюсь, даст вам лучшую структурированную программу.

+0

Спасибо, я понимаю, что перечисления - лучший способ пойти. Жесткий, у меня мало опыта работы с Enums и с помощью List, я должен был бы прочитать об этом. –

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