Электронная библиотека » Майкл Моррисон » » онлайн чтение - страница 27


  • Текст добавлен: 14 ноября 2013, 04:34


Автор книги: Майкл Моррисон


Жанр: Зарубежная компьютерная литература, Зарубежная литература


сообщить о неприемлемом содержимом

Текущая страница: 27 (всего у книги 35 страниц) [доступный отрывок для чтения: 12 страниц]

Шрифт:
- 100% +
Тестирование игры

Несколько раз я упоминал в книге, что тестирование игр в большинстве случаев – самый веселый этап разработки, и этот случай не исключение.

Однако в случае сетевых игр тестирование может быть одним из самых трудных этапов. Нелегко сымитировать двух одновременно играющих людей. К счастью, эмулятор J2ME позволяет запускать несколько образов игры и создавать соединение между ними, будто они реальные устройства, работающие в сети.

Аналогично примеру Lighthouse, рассмотренному в предыдущей главе, в игре Connect 4 сперва появляется простой интерфейс, позволяющий игроку выбрать режим функционирования приложения – сервер или клиент. На рис. 15.5 показан процесс выбора типа работы.

Рис. 15.5. Мидлет Connect 4 начинается с запроса режима функционирования


После того как выбран режим работы сервера, игроку выводится сообщение о состоянии игры. В нем говорится, что сервер готов и ждет ответа клиента (рис. 15.6).

Рис. 15.6. Игра Connect 4 ожидает подключения клиента


В другой части сетевого уравнения запускается клиентский мидлет игры Connect 4. Когда между сервером и клиентом установлена связь, в мидлетах выводится соответствующая информация. На рис. 15.7 показан мидлет, ожидающий подключения клиента.

Рис. 15.7. Когда соединение установлено, игра ожидает хода игрока


В игре ход переходит от одного игрока к другому. На рис. 15.8 показан вид клиента, в котором уже сделано несколько ходов.

Рис. 15.8. Игрок на клиентском устройстве делает ход


Наконец, один из игроков одержит победу или игра закончится ничьей, поскольку на игровом поле не останется свободного места. На рис. 15.9 показан клиент, одержавший победу.

Рис. 15.9. Игрок-клиент выигрывает


Чтобы начать новую игру, оба игрока должны нажать клавишу Огонь. Игрок, потерпевший поражение, начинает игру, поскольку в этом случае он имеет небольшое преимущество.

Резюме

Программирование беспроводных соединений и многопользовательских игр – это достаточно сложные темы, но было бы несправедливо не продемонстрировать вам пример сетевой мобильной игры. Поэтому, эта глава провела вас через разработку и реализацию сетевой мобильной игры Connect 4. Хотя игра очень упрощена, вы можете создавать на ее основе более сложные и интересные игры.

В следующей главе вы отдохнете от обилия кодов и подробнее познакомитесь с тестированием мобильных игр, отладке и установке.

Экскурсия

Чтобы помочь вам уяснить отличия пошаговых игр как Connect 4, поиграйте в другие пошаговые игры с друзьями или родственниками. Неважно, будет ли это Connect 4, шахматы или шашки. Опыт игры и наблюдение за ее развитием помогут вам лучше понять разработку пошаговых игр.

Глава 16
Отладка и установка мобильных игр

Архив Аркад

Выпущенная в 1983 году компанией Taito игра Elevator Action использовала уникальную смесь лифтов, подъемников и шпионов и создала великолепную шпионскую игру своего времени. Вы играете за Агента 17 с кодовым именем Отто, ваша цель – выкрасть секретные документы. Вы стартуете на 30 этаже здания и должны сбежать через автомобильные ворота, расположенные в подвале. Одна из интересных особенностей игры – это то, что вы можете убивать плохих парней, пока находитесь в лифте. Также вы можете стрелять в светильники, однако в темноте попасть в противника сложнее. Такие особенности послужили тому, что игра Elevator Action стала классикой аркадных игр.

Несмотря на то что я люблю затрагивать такие темы, было бы несправедливо научить вас программированию мобильных игр, но не осветить вопросы отладки. В этой главе вы узнаете, что программные ошибки – это неотъемлемая часть программирования мобильных игр, потому что человек склонен совершать ошибки. Поэтому вы должны рассматривать процесс отладки как необходимую часть процесса разработки и принять тот факт, что даже самый тщательно построенный код будет содержать ошибки. В этой главе я постараюсь помочь вам получить навыки, которые сведут появление ошибок к минимуму, но остальное зависит от вас.

В этой главе также пойдет речь об установке мобильных игр. Это очень важная тема, поскольку так вы поставляете созданную вами игру пользователю. Несмотря на то что концепция доставки программного обеспечения через беспроводное соединение может показаться мистикой, в реальности это сделать очень просто.

В этой главе вы изучите:

► основы отладки игр;

► как избегать и детектировать ошибки в мобильных играх;

► как подготовить игру для установки через беспроводное соединение;

► как эмитировать доставку игры по беспроводной сети, используя KTollbar.

Основы отладки игр

Перед тем как перейти к серьезным обсуждениям вопросов отладки мобильных игр, давайте рассмотрим, что собой представляет ошибка (или баг). Ошибка – это ошибка в коде, которая выполняет нежелательные действия в игре. Нежелательное действие – это может быть все что угодно, от неправильного подсчета набранных очков до воспламенения телефона. Хотя последнее – это сильное преувеличение, вы должны относиться к ошибкам очень серьезно, потому как они говорят о достоинствах (или недостатках) вашей игры.

Понятие об ошибках в течение уже долгого времени является обязательной частью программирования. Хотя все программисты стремятся к точности написания кода, лишь немногие достигают этого. Даже те, кто достигает, на своем пути к цели проходят через большое число ошибок. Дело в том, что программисты предвидят ошибки в создаваемом коде, а не думают, что их код лишен ошибок. Следовательно, первое правило отладки – предположить, что в коде есть ошибки, выявить их и устранить.

Вопрос поиска и отладки ошибок особенно важен для игр, поскольку игроки зачастую импульсивные люди. Если в игре что-то пойдет не так, например, неправильный подсчет набранных очков, то игрок, вероятно, будет расстроен и забросит игру. Поэтому очень важно находить ошибки перед тем, как выпускать игру. Конечно, вы можете выпустить патч к игре, однако это понижает впечатление от игры.

Перед тем как перейти к рассмотрению специфических стратегий поиска ошибок, давайте рассмотрим основы отладки. Если вы уже знакомы с отладкой в Java или любом другом языке программирования, смело переходите к следующему разделу. Ниже приведены основные методы, незаменимые для поиска и устранения ошибок в программах:

► пошаговое выполнение кода;

► наблюдение переменных;

► использование точек останова.

Пошаговое выполнение кода

Одна из широко распространенных возможностей отладчиков – это пошаговое выполнение кода. Пошаговое выполнение – это процесс, при котором строки кода выполняются последовательно. Важное отличие пошагового выполнения кода как технологии отладки состоит в том, что вы видите, как выполняется код, а также можете проследить выполнение программы в целом. Обычно пошаговое выполнение не используется отдельно, а сочетается с другой методикой – наблюдением (watching), которая позволяет посмотреть, как изменяются значения переменных в ходе выполнения.

В копилку Игрока

Отладчик – это программное обеспечение, созданное, чтобы помогать вам в поиске ошибок, оно позволяет анализировать код в процессе выполнения. Java 2 SDK поставляется с отладчиком, который называется jab. О нем вы узнаете в разделе «Выбор отладчика».

Наблюдение переменных

Наблюдение – это методика, которая подразумевает отслеживание наблюдаемых переменных кода. Наблюдаемая переменная – это переменная, изменение значения которой вы можете наблюдать в отладчике. Конечно, если программа запущена с обычной скоростью, то наблюдение за переменными не поможет. Однако если вы наблюдаете за ними при пошаговом выполнении кода, вы сможете четко понять, что происходит в программе. Очень часто вы можете заметить, что значения тех или иных переменных изменяются непредсказуемо или принимают значения, которые в контексте созданного кода бессмысленны. Этот тип проникновения в исполнение кода может помочь вам найти ошибки. Пошаговое выполнение кода в сочетании с наблюдением переменных – это стандартный подход к поиску ошибок с помощью отладчика.

Использование точек останова

Другая фундаментальная техника поиска ошибок – это использование точек останова. Точка останова – это строка кода, которая прерывает выполнение программы. Чтобы понять пользу точек останова, представьте, что вас интересует строка, расположенная в середине программного кода. Чтобы добраться до этой строки, вам понадобится пройти половину программы по шагам. Но вы можете поставить в строке точку останова и запустить программу на выполнение. Программа будет выполняться до тех пор, пока ее работу не прервет точка останова. В этом случае программа останавливается, и вы оказываетесь в нужной точке кода. Теперь вы можете наблюдать переменные и даже пошагово выполнить программу. Вы также можете назначить несколько точек останова в ключевых местах программы, что очень удобно для последовательной отладки кода.

Стратегии отладки игр

Хотя инструменты отладки прошли длинный путь от зари программирования, основная часть работы по устранению ошибок и по сей день лежит на ваших плечах. Думайте об отладчиках и стандартных методиках отладки как о средствах, с помощью которых можно обнаружить ошибки, а не как о единственном средстве защиты от ошибок. Для устранения ошибок необходим значительный багаж знаний, практики, инструментов отладки и даже немного удачи.

Отладку можно сравнить с охотой: вы знаете, что где-то есть проблема, и должны найти ее. Поэтому вы должны подходить к отладке с определенной стратегией. Стратегии отладки могут быть разделены на две основные группы – предотвращение ошибок и определение ошибок. Давайте рассмотрим обе стратегии и увидим, как их можно совместно использовать, чтобы с легкостью исправлять ошибки.

Предотвращение ошибок

Предотвращение ошибок направлено на исключение их появления до того, как они могут проявиться. Предотвращение ошибок может показаться вполне очевидным, потому что это действительно так. Однако большое число программистов не использует этой стратегии при написании кода, а занимаются отладкой в конце. Помните, что стратегия предотвращения ошибок более трудоемкая работа, чем отладка. Я полностью поддерживаю эту стратегию как предварительный этап борьбы с ошибками.

Предотвращение ошибок и их устранение можно сравнить с вакцинацией и лечением болезни, после того, как вы ей заразились. Конечно, лучше потерпеть укол, чем сражаться с заболеванием. Эта метафора, но она хорошо применима к реальности. Ошибки подобны болезням: когда вы думаете, что победили их, применять эту метафору к отладке опасно, так как ошибки в коде подобны болезни – только решить, что избавился от нее, как она вновь проявляется совершенно неожиданным образом.

Расставляйте скобки явно

Очень часто ошибки возникают из-за неправильной интерпретации приоритетов операций. Я и сам не раз полагал, что точно помню, какой приоритет у данного оператора, а потом оказывалось, что ошибся. Взгляните на следующий пример:


int a = 37, b = 26;

int n = a % 3 + b / 7 ^ 8


Если у вас хорошая память и вы можете без тени сомнения сказать, чему равно значение выражения, то вы – счастливчик! Для остальных это весьма рискованная строка кода, потому что она может давать множество результатов в зависимости от порядка выполнения операторов. На самом деле она возвращает единственное значение, которое вычисляется в соответствии с правилами языка программирования Java. Программисты легко могут перепутать порядок выполнения операторов, который приведет к ошибке вычислений.

Каково же решение? Выход из этой ситуации – использовать скобки, даже если в этом нет необходимости, таким образом вы сможете контролировать порядок выполнения действий. Ниже приведен тот же самый код, но уточненный скобками:


int a = 37, b = 26;

int n = ((a % 3) + (b / 7)) ^ 8;

Скрытые переменные класса

Другая ошибка, которая свойственна объектно-ориентированному программированию игр – это сокрытые переменные класса. Сокрытые переменные могут «потеряться», если в производном классе есть новая одноименная переменная. Взгляните на код, приведенный в листинге 16.1. Он реализует два класса Weapon и Bazooka.

Листинг 16.1. Классы Weapon и Bazooka

class Weapon {

int power;

int numShots;

public Weapon() {

power = 5;

numShots = 10;

}

public void fire() {

numShots–; //Переменная numShots в классе Weapon определена

}

}

class Bazooka : extends Weapon {

int numShots; //Переменная numShots скрывает переменную numShots родительского класса Weapon

public Bazooka() {

super();

}

public blastEm() {

power–;

numShots -= 2; //Переменная numShots класса Bazooka увеличивается, в то время как сокрытая переменная numShots класса Weapon остается неизменной

}

}


Класс Weapon определяет две переменные: power и numShots. Класс Bazooka, производный от класса Weapon, также содержит переменную numShots, которая замещает одноименную переменную родительского класса. Проблема с этим кодом заключается в том, что когда конструктор класса Bazooka вызывает конструктор класса Weapon (через функцию super()), инициализируется переменная numShots класса Weapon, a не класса Bazooka. При вызове метода blastEm() в классе Bazooka используется видимая переменная numShots, которая по умолчанию инициализируется нулем. Как вы, вероятно, можете представить, в более сложных классах подобные проблемы более серьезны.

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

Обработка исключений

Одна из полезных стратегий предотвращения ошибок в Java – это обработка исключений. Эта методика основана на предотвращении появления неожиданных сообщений во время выполнения программы. Чтобы обработать «проблемный» код, его необходимо заключить в конструкцию try и обработать исключение командой catch. Событие «ошибка» по своей природе является исключением, а конструкция catch называется «обработчиком исключения».

Ниже приведен пример кода обработки исключений, который вы уже неоднократно встречали в книге:


try {

//действия

}

catch (Exception e) {

System.err.println(e);

}


В этом коде обрабатываемое исключение – это исключение типа Exception, общий тип для всех исключений. В некоторых случаях в ответ на возникшее исключение может понадобиться выполнить какие-нибудь действия, а не просто вывести сообщение об ошибке. Или вы можете никак не обрабатывать возникшее исключение, подобно тому, как это сделано в некоторых мидлетах в книге.

Совет Разработчику

Java поддерживает стандартные устройства ввода/вывода, которые можно использовать для отображения отладочной информации. System.err – это стандартное «устройство» ошибок, которое можно использовать для вывода ошибок в специальном окне или в командной строке эмулятора J2ME. Метод println() выводит строку в стандартное устройство.

Мы обсудили лишь малую часть обработки ошибок во время выполнения программы (исключений). Я настоятельно рекомендую более глубоко познакомиться с исключениями и их обработкой. К счастью, об обработке исключений в Java написано достаточно много, поэтому у вас не возникнет трудностей с поиском этой информации.

Выявление ошибок

Даже если вы применяли стратегии предотвращения ошибок, тем не менее вам придется отладить ряд ошибок. Программисты часто допускают ошибки, а высокая сложность многих мобильных игр вызывает проблемы. Просто поймите, что вы не идеальны, и сфокусируйтесь на поиске и устранении ошибок. Необходимо не только применять методы предотвращения ошибок, но и научиться отслеживать неминуемые погрешности, которые проявятся при тестировании игры. Давайте рассмотрим несколько методик поиска ошибок.

Использование стандартного вывода

Одна из самых старых методик поиска ошибок – это вывод отладочной информации на одно из устройств. Этот подход, вероятно, покажется вам архаичным, и во многом это так, однако он поможет быстро вникнуть, что происходит в игре.

Использовать стандартный прием вывода очень просто, например, вызовите метод System.out.println() в любом месте кода. Вы можете использовать стандартный вывод для выполнения многих задач – от отслеживания значений переменных до выявления запускаемых методов – просто вызовите метод println(), когда это нужно. Остерегайтесь вызывать метод println() в цикле обновления, например, внутри метода update(), который управляет анимацией мидлетов. В этом случае метод println() может замедлить работу мидлета, поскольку вывод текста на экран – достаточно медленная операция.

Совет Разработчику

Стандартный вывод очень похож на стандартное устройство ошибок. В реальности они очень похожи. На практике очень полезно применять описанную выше методику для вывода отладочной информации.

Отслеживание стека вызовов

Незаменимый инструмент поиска сложных ошибок – это использование стека вызовов. Метод стека вызовов – это ряд методов, вызываемых для перехода в текущую выполняемую строку кода. Изучая стек вызовов, вы видите, какие методы вызываются. Эта информация помогает выявить неверный вызов методов.

Чтобы просмотреть стек вызовов, необходимо применить метод printStackTrace() класса Throwable. Поскольку метод printStackTrace() принадлежит классу Throwable, то для просмотра стека вызовов необходимо создать соответствующий объект. Все исключения являются производными от класса Throwable, поэтому каждый раз, когда в программе возникает исключение, вы можете просмотреть стек вызовов. Посмотрите на фрагмент кода:


try {

int nums[] = new int[5];

for(int i = 0; i < 10; i++)

nums[i] = 6670;

}

catch (ArrayIndexOutOfBoundsException e) {

System.out.println("**Exception** : " + e.getMessage());

e.printStackTrace(); //Вывести стек вызовов

}


В этом коде индекс массива nums выходит за пределы внутри цикла for, в результате возникает исключение ArraylndexOutOfBoundsException. Это исключение выводится на стандартное устройство вывода в конструкции catch, здесь же вызывается метод printStackTrace().

Выбор отладчика

Когда вы решили приступить к отладке кода, важно выбрать отладчик. Отладчик – это бесценное средство для поиска и устранения ошибок в программе, он напрямую определяет, сколько времени вы потратите на поиск и устранение ошибок. Следовательно, вы должны мудро распределить ресурсы и выбрать отладчик, который в наибольшей степени подходит к вашему стилю отладки.

Существует ряд интегрированных сред разработки, в состав которых входят визуальные отладчики Java. Такие отладчики хороши и обычно содержат массу дополнительных возможностей. По возможности приобретите один из таких отладчиков.

Помните, что важно выбрать наиболее подходящий вам отладчик, поскольку это напрямую определяет то, как быстро вы сможете найти ошибки. К счастью, практически все отладчики реализуют основные функции отладки (пошаговое выполнение, отслеживание переменных и использование точек останова).

В копилку Игрока

Для справки, я упрямый и принадлежу к старой школе, что сочетается не очень хорошо. Я говорю вам это потому, что я разработал код примеров, приводимых в книге, используя для отладки только метод System.out.println(). Если вы найдете ошибки в моем коде, то, по крайней мере, у меня есть оправдание! А если серьезно, то нет необходимости использовать сложные инструменты, пока вы пишете надежный код и выполняете тестирование.

Java 2 SDK поставляется со стандартным отладчиком (jab), который реализует множество функций отладки, которые я упоминал ранее. Этот отладчик работает с командной строкой, в нем нет графики и функций «покажи и щелкни». Если вы не готовы использовать отладчики сторонних производителей, то попробуйте применить jab. Поработав с этим отладчиком, вы поймете, что он хорошо подходит для задач отладки.

Перед тем как начать использовать jab, необходимо откомпилировать код таким образом, чтобы он содержал отладочную информацию. Компилятор Java делает это, если использовать ключ – g. В результате компилятор сформирует отладочные таблицы, содержащие информацию о номерах строк и переменных.

Совет Разработчику

Обсуждение отладчика jab не входит в эту книгу, вы можете найти необходимую информацию в книгах по Java Или вы можете изучить онлайн пособие по использованию отладчика jab на сайте компании Sun http://javasun.com/learning/.

Распространение мобильных игр

В отличие от традиционных компьютерных и консольных игр, которые обычно распространяются на компакт-дисках, мобильные игры обычно загружаются и устанавливаются непосредственно по беспроводной сети. Это связано с тем, что большинство мобильных телефонов не поддерживают средства переноса данных, как CD-ROM, а используют сетевое соединение. Зная, что ваши игры будут устанавливаться через беспроводное соединение, вы, вероятно, можете догадаться, что есть ряд вопросов по установке, которые следует рассмотреть, прежде чем вы сможете сделать вашу игру доступной для всех.

Существует два варианта загрузки и установки мобильных игр:

локальная установка – мидлет передается с компьютера на мобильный телефон посредством соединения с компьютером, например, USB-кабелем;

удаленная установка – мидлет загружается и устанавливается через беспроводное соединение.

Первый вариант вы уже использовали, когда загружали игры в мобильный телефон для тестирования. Этот вариант загрузки устройствозависимый, то есть вы должны быть уверены, что телефон поддерживает соединение с компьютером. Также вам придется положиться на программное обеспечение телефона – Application Management Software (Менеджер приложений), – которое поможет корректно установить мидлет на мобильный телефон.

В копилку Игрока

Для выполнения «локальной установки» ваших мобильных игр на сотовый телефон для последующего тестирования необходим специальный кабель. Большинство мобильных телефонов используют USB или последовательный кабель для выполнения соединения, хотя некоторые телефоны выполняют это посредством инфракрасного порта или Bluetooth. Конечно, в последнем случае необходимо, чтобы компьютер поддерживал прямое Bluetooth-соединение, но вы можете купить USB-адаптер Bluetooth, который просто вставляется в USB-порт компьютера.

Второй подход также использует Менеджер приложений мобильного телефона, однако при этом игра закачивается с помощью удаленного сетевого соединения. В этом случае обычно дается ссылка на Web-сайт, содержащий JAD-файл игры. Загрузив JAD-файл, содержащий информацию об игре, например, размер JAR-файла, вы можете загрузить сам JAR-файл. Далее установка выполняется средствами Менеджера приложений точно так, будто вы загрузили игру через прямое соединение.

Итак, подведем итог, важное отличие между двумя способами установки мобильных игр – это способ получения JAR-файла. Он передается или через локальное соединение, или загружается непосредственно с сервера. Поскольку первый подход практически не зависит от Менеджера приложений телефона, я сфокусируюсь на рассмотрении второго способа, который является наиболее важным для распространения мобильных игр.


Страницы книги >> Предыдущая | 1 2 3 4 5 6 7 8 9 10 11 12
  • 0 Оценок: 0

Правообладателям!

Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.

Читателям!

Оплатили, но не знаете что делать дальше?


Популярные книги за неделю


Рекомендации