Translate

вторник, 22 мая 2012 г.

Пишем игру "виселица" на android. Суть и создание базового компонента.

  Начинаем делать игру "виселица" для android. Суть игры состоит в том, чтобы отгадать загаданное слово, выбивая буквы из списка. Если буква есть в слове, нам показывают все ее местоположения в слове. Если нет - мы теряем одну жизнь. Если жизней не осталось - мы проиграли. Если  все буквы в слове найдены - мы выиграли.





  Самый лучший способ графического оформления для написания такой игры - создать компонент, который будет отрисовывать игровую ситуацию на самом себе в методе onDraw(). Назовем этот компонент LetterField и создадим соответствующий ему класс LetterField.java
  Таким образом, наша игра будет включать в себя 2 класса : WordGameActivity и LetterField.
 

  В классе LetterField нам, прежде всего, нужно сделать следующее:
-сделать его наследником класса визуальных компонентов View
-объявить конструктор класса
-объявить метод onMeasure()
-создать метод OnDraw() - в этом методе будет производиться отрисовка всех игровых объектов


  Заведем поля width и height класса LetterField, отвечающие за длину и ширину игрового поля. Кроме того, нам позже понадобится поле context типа Context - для вывода сообщений пользователю.
  Конструктор будет принимать извне контекст, длину и ширину:
public LetterField(Context _context, double _width, double _height) {
        super(_context);
        width=_width;
        height=_height;
        context=_context;
}
Метод OnMeasure должен быть таким (происходит установка размеров при размещении компонента в activity):
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension((int)width, (int)height);
}
  Метод onDraw() обязательно должен содержать первой строкой выполнение метода суперкласса :  super.onDraw(canvas);

  В метод onDraw() передается объект canvas - холст, на котором мы и будем рисовать:
 @Override
 protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
 }


  Таким образом, полный код класса на текущий момент:

public class LetterField extends View {  
    double width;
    double height;
    Context context;

    public LetterField(Context _context, double _width, double _height) {
        super(_context);
        width=_width;
        height=_height;    
        context=_context;
    }

  
    @Override
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension((int)width, (int)height);
    }
  
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}


   Теперь нужно поместить этот компонент на экран. Код главного activity:
public class WordGameActivity extends Activity {
    private LetterField field;
    private AbsoluteLayout Abs;
    double width;
    double height;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
      
        Abs=new AbsoluteLayout(this);
        setContentView(Abs);
        Display display = getWindowManager().getDefaultDisplay();
        width=display.getWidth();
        height=display.getHeight();
      
        field=new LetterField(this, (float)width, (float)(height));
        AbsoluteLayout.LayoutParams params=new AbsoluteLayout.LayoutParams(
                (int)width,(int)(height),0,(int)(height*0)
        );
      
      
        field.setLayoutParams(params);
        field.setBackgroundColor(0xBBFFFFFF);
      
        Abs.addView(field);
    }
}
  Сначала мы объявим компоненты field (наш) и Abs, а также переменные width и height.
  При создании приложения сначала выключим верхнюю панель и поместим наш компонент на дисплей с помощью кода, описанного здесь (вторая часть текста - про размещение кнопок). Запускаем прототип будущей игры на виртуальном устройстве - убеждаемся, что все работает - на экране серебряный прямоугольник.


Скачать исходник игры

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...