Листинг 14.6. Метод update() класса LHCanvas отправляет сообщения, закодированные азбукой Морзе, в соответствии с нажатыми клавишами
private void update() {
// обработка пользовательского ввода
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
if (isServer) //Передать точку на другой телефон
server.sendMessage("Dot");
else
client.sendMessage("Dot");
status = "Dot";
}
else if ((keyState & RIGHT_PRESSED) != 0) {
if (isServer) //Передать тире на другой телефон
server.sendMessage("Dash");
else
client.sendMessage("Dash");
status = "Dash";
}
// обновить таймер кода Морзе
if (mode != 0) {
morseTimer++;
// тайм-аут точки
if (mode == 1 && morseTimer > 3)
mode = 0;
// тайм-аут тире
else if (mode == 2 && morseTimer > 9)
mode = 0;
}
}
Метод update() проверяет нажатие клавиш и в соответствии с нажатыми клавишами отправляет нужный знак. Клавиша влево соответствует точке, а клавиша вправо – тире. Чтобы отправить код азбуки Морзе, метод update() просто вызывает метод sendMessage() сетевого объекта (клиента или сервера).
После проверки нажатий клавиш и отправки сообщения, если необходимо, метод update() обновляет таймер Морзе. Если значение переменной mode равно 1, то выводится точка, затем значение таймера увеличивается до 3, после чего выводится изображение маяка с погашенным огнем. Если значение переменной mode равно 2, выводится тире, при этом счетчик будет увеличиваться до 9. И наконец, если значение переменной mode равно 0, то следует вывести изображение маяка с погашенным огнем, таймер не изменяется.
Метод draw() выводит изображение маяка на экран (листинг 14.7).
Листинг 14.7. Метод draw() класса LHCanvas выводит на экран нужное изображение маяка
private void draw(Graphics g) {
// вывести фоновое изображение
if (mode == 0) //В зависимости от режима маяк светится или нет
g.drawImage(background[0], 0, 0, Graphics.TOP | Graphics.LEFT);
else
g.drawImage(background[1], 0, 0, Graphics.TOP | Graphics.LEFT);
// вывести сообщение о статусе
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD, Font.SIZE_MEDIUM));
g.drawString(status, getWidth() / 2, 5, Graphics.TOP | Graphics.HCENTER); // В верхней части экрана выводится статусное сообщение
// вывести содержимое буфера на экран
flushGraphics();
}
Метод draw() начинается с проверки значения переменной mode, которая определяет, какое изображение маяка следует вывести. Если значение этой переменной равно 0, то выводится изображение маяка с погашенным огнем, в противном случае выводится изображение маяка с включенным огнем. Остальной код выводит в нижней части экрана сообщение о статусе соединения. Сообщение о текущем статусе выводится функцией setStatus():
public void setStatus(String s) {
// установить текущий статус
status = s;
}
Последний метод класса LHCanvas – это метод receiveMessage(), принимающий сообщение, закодированное азбукой Морзе, и в соответствии с сообщением настраивает холст. В листинге 14.8 приведен код этого метода: Листинг 14.8. Метод receiveMessage() класса LHCanvas получает сообщение, отправленное по сети
public void receiveMessage(String message) {
// установить режим
if (message.equals("Dash")) // Изменить режим в соответствие с сообщением
mode = 2;
else if (message.equals("Dot"))
mode = 1;
else
mode = 0;
// обнулить таймер
morseTimer = 0;
// очистить сообщение о статусе
status = ""; // При отображении символов азбуки Морзе нет необходимости выводить статусное сообщение
}
Параметр метода receiveMessage() – это отправленное сообщение. Это сообщение всегда точка (Dot) или тире (Dash). В последнем случае значение переменной mode становится равным 2, в то время как в первом случае – 1. Если по какой-либо причине сообщение не содержит ни один из возможных вариантов, его значение переменной mode становится равным 0. После этого обнуляется таймер, обеспечивающий правильную работу мидлета. Мидлет Lighthouse
Последний функциональный представляющий интерес фрагмент кода мидлета Lighthouse – это сам класс мидлета, в котором есть код, отличающий его от всех созданных ранее в книге мидлетов. В листинге 14.9 приведен код класса LighthouseMIDlet.
Листинг 14.9. Класс LighthouseMIDlet при загрузке приложения позволяет пользователю выбрать режим работы: клиент или сервер
public class LighthouseMIDlet extends MIDlet implements CommandListener {
private Form initForm; // Объект типа Form используется для реализации интерфейса
private ChoiceGroup choices;
private LHCanvas gameCanvas;
public void startApp() {
// создать стартовую форму
initForm = new Form("Connect 4");
// добавить выбор устройства
String[] peerNames = { "Server", "Client" }; // Создать группу выбора с двумя опциями: Клиент и Сервер
choices = new ChoiceGroup("Please select peer type:", Choice.EXCLUSIVE,
peerNames, null);
initForm.append(choices);
// добавить команды Play и Exit
Command exitCommand = new Command("Exit", Command.EXIT, 0);
initForm.addCommand(exitCommand);
Command playCommand = new Command("Play", Command.OK, 0);
initForm.addCommand(playCommand);
Читать дальше
Конец ознакомительного отрывка
Купить книгу