Мегаобучалка Главная | О нас | Обратная связь


Приложение 1. Примеры создания MIDP приложений



2019-07-03 165 Обсуждений (0)
Приложение 1. Примеры создания MIDP приложений 0.00 из 5.00 0 оценок




 

Давайте создадим простейшее MIDP приложение-заготовку для нашей игры, на основе игры «червяк».

package example.wormgame;

import java.lang.Thread;

// подключаем требуемые нам компоненты

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.Item;

import javax.microedition.lcdui.Gauge;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

/**

 * Основной класс нашего мидлета

 */

public class WormMain extends MIDlet implements CommandListener {

/** Класс описывающий "червяка" */

private WormPit theGame;

/** Кнопка выхода из игры. */

private Command exitCmd = new Command("Exit", Command.EXIT, 3);

/** Элемент меню, поменять уровень сложности. */

private Command levelCmd = new Command("Change Level", Command.SCREEN, 2);

/** Элемент меню, начать новую игру. */

private Command startCmd = new Command("Start", Command.SCREEN, 1);

/** Элемент меню, перезапустить игру. */

private Command restartCmd = new Command("Restart", Command.SCREEN, 1);

/** Элемент меню, вернутся в игру без извенений. */

private Command cancelCmd = new Command("Cancel", Command.ITEM, 1);

/** Элемент меню, для подтвержждения выбранных установок. */

private Command OKCmd = new Command("OK", Command.OK, 1);

 

/**

* Конструктор по умолчанию, в котором создаются графические вомпоненты и

* устанавливается command listener.

*/

public WormMain() {

theGame = new WormPit();

theGame.addCommand(exitCmd);

theGame.addCommand(levelCmd);

theGame.addCommand(startCmd);

theGame.addCommand(audioOnCmd);

theGame.setCommandListener(this);

}

 

/**

* Деструктор для очистки памяти занятой приложением.

*/

protected void destroyApp(boolean unconditional) {

theGame.destroyGame();

Display.getDisplay(this).setCurrent((Displayable)null);

}

 

/**

* Приостановка работы приложения

*/

protected void pauseApp() {

}

 

/**

* Запуск приложения

*/

protected void startApp() {

Display.getDisplay(this).setCurrent(theGame);

 

try {

   // Запуск игры в отдельном потоке

   Thread myThread = new Thread(theGame); // создаём новый поток

   myThread.start(); // запуск потока

} catch (Error e) {

   destroyApp(false);

   notifyDestroyed();

}

}

 

/**

* Выполнения функций приложения в ответ на действия пользователя.

*/

public void commandAction(Command c, Displayable d) {

   if (c == restartCmd) {

   theGame.restart();

   } else if (c == levelCmd) {

   Item[] levelItem = {

   new Gauge("Level", true, 9, theGame.getLevel())};

   Form f = new Form("Change Level", levelItem);

   f.addCommand(OKCmd);

   f.addCommand(cancelCmd);

   f.setCommandListener(this);

   Display.getDisplay(this).setCurrent(f);

   } else if (c == exitCmd) {

   destroyApp(false);

   notifyDestroyed();

   } else if (c == startCmd) {

  theGame.removeCommand(startCmd);

   theGame.addCommand(restartCmd);

   theGame.restart();

   } else if (c == OKCmd) {

   Form f = (Form)d;

   Gauge g = (Gauge)f.get(0);

   theGame.setLevel(g.getValue());

   Display.getDisplay(this).setCurrent(theGame);

   } else if (c == cancelCmd) {

   Display.getDisplay(this).setCurrent(theGame);

   }

}

 

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

 

public class WormPit extends Canvas implements Runnable {

/** Очки в игре. */

private int score = 0;

/** Уровень сложности. */

private int level = 5;

/** Ширина экрана в пикселях. */

static int CellWidth;

/** Длина экрана в пикселях. */

static int CellHeight;

/** Высота шрифта для вывода на экран счёта. */

private static final int SCORE_CHAR_HEIGHT;

/** Ширина шрифта для вывода на экран счёта. */

private static final int SCORE_CHAR_WIDTH;

/** Время по умолчанию между перерисовкой червя (400 milliseconds) */

private static final int DEFAULT_WAIT = 400;

/** Цвет шрифта. (0xff0000) */

static final int TEXT_COLOUR = 0x00ff0000;

/** Размер клетки червя. */

public static final int CELL_SIZE = 5;

 

// Установка размера шрифта

static {

Font defaultFont = Font.getDefaultFont(); // взять шрифт по умолчанию

SCORE_CHAR_WIDTH = defaultFont.charWidth('S');

SCORE_CHAR_HEIGHT = defaultFont.getHeight();

SCORE_HEIGHT = SCORE_CHAR_HEIGHT * 2;

}

 

/**

* Конструктор. Задания ширины и высоты червя.

*/

public WormPit() {

width = round(getWidth());

height = round(getHeight()-SCORE_HEIGHT);

WormPit.CellWidth = (width-(START_POS*2)) / WormPit.CELL_SIZE;

WormPit.CellHeight = (height-(START_POS*2)) / WormPit.CELL_SIZE;

myWorm = new Worm(this);

 

/**

* Обработчик событий от нажатия клавишь на мобильном устройстве.

* Стрелки(джойстик) на мобильном устройстве (UP, DOWN, LEFT, RIGHT)

*/

public void keyPressed(int keyCode) {

switch (getGameAction(keyCode)) {

case Canvas.UP:

   myWorm.setDirection(Worm.UP);

   break;

case Canvas.DOWN:

   myWorm.setDirection(Worm.DOWN);

   break;

case Canvas.LEFT:

   myWorm.setDirection(Worm.LEFT);

   break;

case Canvas.RIGHT:

   myWorm.setDirection(Worm.RIGHT);

   break;

case 0:

   // можно использовать клавиши с номерами 2,4,6,8

   switch (keyCode) {

   case Canvas.KEY_NUM2:

   myWorm.setDirection(Worm.UP);

   break;

   case Canvas.KEY_NUM8:

   myWorm.setDirection(Worm.DOWN);

   break;

   case Canvas.KEY_NUM4:

   myWorm.setDirection(Worm.LEFT);

   break;

   case Canvas.KEY_NUM6:

   myWorm.setDirection(Worm.RIGHT);

   break;

   }

   break;

}

}

 

/**

* Перерисовка экрана и всех объектов.

*/

private void paintPitContents(Graphics g) {

try {

   myWorm.update(g); // update worm position

       

   /* логика проверки съел ли червь объект или нет и подсчсёт очков

     для вывода на экран */

       

 

   g.setColor(WormPit.ERASE_COLOUR);

   g.fillRect((width - (SCORE_CHAR_WIDTH * 3))-START_POS,

          height-START_POS,

          (SCORE_CHAR_WIDTH * 3),

          SCORE_CHAR_HEIGHT);

   g.setColor(WormPit.DRAW_COLOUR);

 

   // Отобразить новый счёт

   g.drawString("" + score,

            width - (SCORE_CHAR_WIDTH * 3) - START_POS,

            height - START_POS, g.TOP|g.LEFT);

 

} catch (WormException se) {

   gameOver = true;

}

}

 

/**

* Вывод на экран всех компонентов

*/

public void paint(Graphics g) {

if (forceRedraw) {

   // Перерисовать весь экран

   forceRedraw = false;

 

   // Очистить задний план

   g.setColor(WormPit.ERASE_COLOUR);

   g.fillRect(0, 0, getWidth(),

         getHeight());

 

   // Нарисовать границы поля

   g.setColor(WormPit.DRAW_COLOUR);

   g.drawRect(1, 1, (width - START_POS), (height - START_POS));

 

   // Отобразить текущий счёт

   g.drawString("L: " + level, START_POS, height, g.TOP|g.LEFT);

   g.drawString("" + score,

        (width - (SCORE_CHAR_WIDTH * 3)),

        height, g.TOP|g.LEFT);

 

   // Отобразить наивысший счёт на этом уровне

   g.drawString("H: ",

        (width - (SCORE_CHAR_WIDTH * 4)),

        (height + SCORE_CHAR_HEIGHT),

        g.TOP|g.RIGHT);

   g.drawString("" + WormScore.getHighScore(level),

        (width - (SCORE_CHAR_WIDTH * 3)),

        (height + SCORE_CHAR_HEIGHT),

        g.TOP|g.LEFT);

 

   // Нарисовать червя и еду

   g.translate(START_POS, START_POS);

   g.setClip(0, 0, CellWidth*CELL_SIZE, CellHeight*CELL_SIZE);

   myWorm.paint(g);

   myFood.paint(g);

} else {

   // Нарисовать червя и еду

   g.translate(START_POS, START_POS);

}

 

/**

* Вызывает перерисовку экрана и компонентов при съёме паузы

*/

protected void hideNotify() {

super.hideNotify();

forceRedraw = true;

if (!gameOver) {

   gamePaused = true;

}

}

 

/**

* Основной цикл выполнения MIDP приложения

*/

public void run() {

while (!gameDestroyed) {

   try {

   synchronized (myWorm) {

       

   /* логика вычислений очков двидения червя и действий пользователя*/

       repaint();

       }

   }

   } catch (java.lang.InterruptedException ie) {

   }

}

}

 

/**

* Вызывает событие уничтожения приложения

*/

public void destroyGame() {

synchronized (myWorm) {

   gameDestroyed = true;

   //myWorm.notifyAll();

   myWorm.notifyAll();

}

}

}

 

Приложение 2. Примеры создания MIDP приложений

 

Для выполнения задания номер 2 потребуется создать TCP соединение с помощью сокетов и форму вводу передаваемых значений.

 

Для начала создадим MIDP приложение.

 

/**

 * Основной класс MIDP приложения

 */

public class SocketMIDlet extends MIDlet implements CommandListener {

 

private final static String SERVER = "Server";

private final static String CLIENT = "Client";

 

private static String[] names = {SERVER, CLIENT};

private static Display display; // дисплей

private Form f; // форма

private ChoiceGroup cg;

private boolean isPaused;

private Server server;

private Client client;

 

 

// левая функциональная кнопка на мобильном устройстве

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

// правая функциональная кнопка на мобильном устройстве

private Command startCommand = new Command("Start", Command.ITEM, 1);

 

   

/**

* Конструктор. создаёт графические компоненты на экране.

* И устанавливает обработчики событий.

*/

public SocketMIDlet() {

 

   display = Display.getDisplay(this);

   f = new Form("Socket Demo");

   cg = new ChoiceGroup("Please select peer",

                                       Choice.EXCLUSIVE, names, null);

   f.append(cg);

 

   f.addCommand(exitCommand);

   f.addCommand(startCommand);

   f.setCommandListener(this);

 

   display.setCurrent(f);

}

 

public boolean isPaused() {

   return isPaused;

}

 

   

/**

* Запуск приложения

*/

public void startApp() {

   isPaused = false;

}

 

 

/**

* Приостановка приложения

*/

public void pauseApp() {

   isPaused = true;

}

   

/**

* Остановка приложения

*/

public void destroyApp(boolean unconditional) {

   if (server != null) {

       server.stop();

   }

   if (client != null) {

       client.stop();

   }

}

 

/**

* Обработчик событий.

*/

public void commandAction(Command c, Displayable s) {

   if (c == exitCommand) {

       destroyApp(true);

       notifyDestroyed();

   } else if (c == startCommand) {

       String name = cg.getString(cg.getSelectedIndex());

          if (name.equals(SERVER)) {

           server = new Server(this);

           server.start();

       } else {

           client = new Client(this);

           client.start();

       }

   }

}

}

 

Для создания соединения с сервером с помощью сокетов потребуется следующая конструкция:

// Установить сокет соединение на 5000 порту с localhost

SocketConnection sc = (SocketConnection) Connector.open("socket://localhost:5000");

 

// Входной поток для записи онформации в сокет

InputStream is = sc.openInputStream();

 

// Выходной поток для чтения информации из сокета

OutputStream os = sc.openOutputStream();

 

Для открытия соединения для ожидания соединения потребуется следующая конструкция:

 

// Установить сокет на 5000 порту

ServerSocketConnection scn = (ServerSocketConnection) Connector.open("socket://:5000");

 

// Ожидать соединения от других машин

SocketConnection sc = (SocketConnection) scn.acceptAndOpen();


Литература.

 

1. Кен Арнольд, Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.

2. Официальный сайт Java - http://java.sun.com/ (есть раздел на русском языке с учебником).

3. Java™ 2 SDK, Micro Edition Documentation – http://java.sun.com/products/midp/index.jsp



2019-07-03 165 Обсуждений (0)
Приложение 1. Примеры создания MIDP приложений 0.00 из 5.00 0 оценок









Обсуждение в статье: Приложение 1. Примеры создания MIDP приложений

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (165)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)