2016-10-15 4 views
1

В настоящее время я использую группу переключателей/корпусов для добавления частей тела в свою игру в палач. По мере увеличения неправильных догадок добавляется конечность. Это формирует длинный блок переключения и задается вопросом, могу ли я добавить каждый случай к массиву ArrayList, TreeMap и т. Д. И вызвать части тела на основе их номера индекса? Некоторые из них являются штрихами, а другие - инсультами.Могу ли я добавить различные штрихи к холсту в массив?

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

public void paint(){ 
    GraphicsContext g = gameCanvas.getGraphicsContext2D(); 

    switch (newGame.getIncGuessMade()){ 
     case 0:{ 
      //gallows... 
      g.strokeLine(X,Y,X,Y); 
      g.strokeLine(X,Y,X,Y); 
      g.strokeLine(X,Y,X,Y); 
      g.strokeLine(X,Y,X,Y); 
      g.strokeLine(X,Y,X,Y); 
      g.strokeLine(X,Y,X,Y); 
      g.strokeLine(X,Y,X,Y); 
     } 
     break; 
     case 1: g.strokeOval(X,Y,X,Y);  //head 
      break; 
     case 2: g.strokeLine(X,Y,X,Y);  //chest 
      break; 
     case 3: g.strokeLine(X,Y,X,Y);  //Right Arm 
      break; 
     case 4: g.strokeLine(X,Y,X,Y);  //Left Arm 
      break; 
     case 5: g.strokeLine(X,Y,X,Y);  //Right Leg 
      break; 
     case 6: g.strokeLine(X,Y,X,Y);  //Left Leg 
      break; 
     case 7: g.strokeOval(X,Y,X,Y);  //Right Eye 
      break; 
     case 8: g.strokeOval(X,Y,X,Y);  //Left Eye 
      break; 
    } 

} 

ответ

1

Вариант 1: Вы могли бы сделать 2d массива.

double[][] strokes = new double[][] { 
    { ... }, 
    ... 
    { ... } 
}; 

Затем

public void paint(){ 
    GraphicsContext g = gameCanvas.getGraphicsContext2D(); 
    int i = newGame.getIncGuessMade(); 
    g.strokeLine(strokes[i][0], ..., strokes[i][3]); 
} 

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


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

public interface Drawable { 
    void draw(GraphicsContext g); 
} 

public class Gallows implements Drawable { 
    @Override 
    public void draw(GraphicsContext g) { 
     // call what you need to draw the gallows. 
    } 
} 

public class Head implements Drawable { 
    @Override 
    public void draw(GraphicsContext g) { 
     // call what you need to draw the head. 
    } 
} 

Каждый из этих чертежей будет иметь свои координаты локально. Код вызова не должен знать никаких подробностей о том, что означает draw; он должен знать только, чтобы позвонить по телефону draw.


Вариант 3: Если вам не нравится этот способ, и вы используете Java 8, у вас может быть такой же 2d двойной массив, как и раньше, и напишите BiConsumer<GraphicsContext, double[]> s и сохраните их в массиве или списке. Пример:

BiConsumer<GraphicsContext, double[]> chest = (g, strokes) -> { 
    g.strokeLine(strokes[0], ..., strokes[3]); 
}; 

Вы бы тогда назвать это нравится:

chest.accept(g, strokes[i]);

или, если предположить, что это в массиве, например:

consumers[i].accept(g, strokes[i]);

+1

Мне нравится было это но просто проблема некоторых штрихов - это не strokeLine, а ошибка исключения. Как бы я обрабатывал strokeOval (s) в этом цикле? –

+0

@SkiftWolf, я думаю, что лучшая практика состоит в том, чтобы иметь доступные объекты. Я добавил код. Это может показаться много, но в конце вы просто имеете массив или список 'Drawable' и do 'drawables [i] .draw (g);' и пусть волшебство произойдет. – ChiefTwoPencils

+0

@SkiftWolf, извините за отсутствие разных штрихов. – ChiefTwoPencils

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