Майкл Моррисон

Создание игр для мобильных телефонов


Скачать книгу

Skeleton обрабатывается методом commandAction():

      public void commandAction(Command c, Displayable s) {

      if (c.getCommandType() == Command.EXIT) {

      destroyApp(true);

      notifyDestroyed();

      }

      }

      Методу commandAction() передаются два аргумента – команда и экран, на котором будет сгенерирована команда. В рассматриваемом примере интересна лишь команда. Объект Command сравнивается с константой Command.EXIT, таким образом осуществляется проверка, действительно ли выполняется команда Exit. Если да, то вызывается метод destroyApp() и мидлет разрушается. Аргумент true означает, что разрушение безусловно, то есть мидлет разрушается в любом случае, даже если возникла ошибка. Затем вызывается метод notifyDestriyed(), который сообщает менеджеру приложений о том, что мидлет перешел в состояние Destroyed.

      Мидлет Skeleton не работает с методами pauseApp() и destroyApp(), но вы должны реализовать их в любом случае:

      public void pauseApp() {}

      public void destroyApp(boolean unconditional) {}

      Хотя вы уже видели все фрагменты кода, полное содержимое файла SkeletonMIDlet.java представлено в листинге 3.1.

Листинг 3.1. Код класса SkeletonMIDlet, расположенный в файле SkeletonMIDlet.java

      import javax.microedition.midlet.*;

      import javax.microedition.lcdui.*;

      public class SkeletonMIDlet extends MIDlet implements CommandListener {

      private SCanvas canvas;

      public void startApp() {

      if (canvas == null) {

      canvas = new SCanvas(Display.getDisplay(this));

      Command exitCommand = new Command("Exit", Command.EXIT, 0);

      canvas.addCommand(exitCommand);

      canvas.setCommandListener(this);

      }

      // инициализация холста

      canvas.start();

      }

      public void pauseApp() {} //В данном примере эти методы не используются вовсе, однако все равно

      public void destroyApp(boolean unconditional) {} //необходимо предоставить пустые реализации, чтобы удовлетворить требованиям класса MIDLET

      public void commandAction(Command c, Displayable s) {

      if (c.getCommandType() == Command.EXIT) {

      destroyApp(true); //В конце следует вызвать метод destroyApp(), хотя на самом деле

      notifyDestroyed(); //работу мидлета завершает метод notifyDestroyed()

      }

      }

      }

      Оставшаяся часть кода мидлета Skeleton связана с классом SCanvas и представлена в листинге 3.2.

Листинг 3.2. Класс SCanvas служит как настраиваемый холст мидлета Skeleton

      import javax.microedition.lcdui.*;

      public class SCanvas extends Canvas {

      private Display display;

      public SCanvas(Display d) {

      super();

      display = d;

      }

      void start() {

      display.setCurrent(this); //Это весьма важный код, так как он устанавливает текущий холст для мидлета

      repaint();

      }

      public void paint(Graphics g) {

      // очистить холст

      g.setColor(0, 0, 0); // черный //Прежде чем начинать

      g.fillRect(0, 0, getWidth(), getHeight()); //рисование на холсте,

      g.setColor(255, 255, 255); // белый //необходимо очистить фон

      // вывести размер экрана

      int y = 0;

      String screenSize = "Screen size: " + Integer.toString(getWidth()) + " x " + Integer.toString(getHeight());

      g.drawString(screenSize, 0, y, Graphics.TOP | Graphics.LEFT);

      // вывести число цветов дисплея

      y += Font.getDefaultFont().getHeight();

      String numColors = "# of colors: " + Integer.toString(display.numColors());

      g.drawString(numColors, 0, y, Graphics.TOP | Graphics.LEFT);

      // вывести число доступных альфа-уровней

      y += Font.getDefaultFont().getHeight();

      String numAlphas = "# of alphas: " + Integer.toString(display.numAlphaLevels());

      g.drawString(numAlphas, 0, y, Graphics.TOP | Graphics.LEFT);

      // вывести полный объем памяти и объем свободной памяти

      Runtime runtime = Runtime.getRuntime();

      y += Font.getDefaultFont().getHeight();

      String totalMem = "Total memory: " + Long.toString(runtime.totalMemory() / 1024) + "KB";

      g.drawString(totalMem, 0, y, Graphics.TOP | Graphics.LEFT);

      y