Как сделать игру на кнопочный телефон
С приходомMIDP 2.0 API написание игр для мобильных устройств превратилось в очень приятное и занимательное занятие. Меня, как разработчика не могут не радовать появившееся во второй версии богатые графические возможности. Конечно, игры можно было писать и сMIDP 1.0 (Atair 2600 яркое тому подтверждение), но это требовало такого терпения и упорства, что многие не выдерживали, да и возможности были весьма скудными.MIDP 2.0 по прежнему не позволяет писать игры сопоставимые по уровню с играми современных PC. По понятным причинам телефоны всегда будут отставать по своим возможностям от настольных компьютеров. Однако уже сейчас вы можете писать игры уровняSuper Mario Brothers и Alladin.
В этом руководстве описывается создание простого игровогоMIDlet-а (Maidlet - это такое приложение, которое можно запускать на мобильном телефоне). Подразумевается,что Вы знакомы с языком Java, но не знаете что такоеJ2ME.
Собственно, что мы будем разрабатывать? Игра очень проста. Вы управляете ковбоем, который бегежит через прерии, перепрыгивая через перекати-поле. Конечно, это очень глупая игра, но с ее помощью можно продемонстрировать основные приемы, которые вам понадобятся при написании серьезных игр.
Если Вы начнете изучать демонстрационные приложения, то обнаружите, что они состоят из двух файлов: *.jad и *.jar. Jar файл - это архив, в котором содержатся файлы классов, ресурсов, и манифест. Jad файлы (файлы дескриптора) содержат описательную информацию, которая помогает устройству загрузить MIDlet. В Jad файле должены быть описаны размер приложения и URL jar файла MIDlet-а. Ниже приведен пример jad файла Hello World приложения:
Свойство MIDlet-1 (и MIDlet-2, и т.д.) включает имя MIDlet-а, положение его иконки, а также название класса, который должен быть запущен. Первые две строки описывают как MIDlet появится в меню MIDlet-ов. Иконка должна содержаться в jar архиве, и ее путь должен быть представлен в формате, используемом в методе Class.getResource(). В этом примере jar содержит папку icons, в которой находится иконка hello.jpg. Она выглядит вот так:
Hello World
Привет хаброжители. Данный пост является «рерайтом» моего поста для песочницы. На этот раз я постараюсь охватить больше тем, чем тогда.
Почему Java?
Ничего объективного я тут не скажу, а скажу лишь то, что я люблю этот язык, и мне нравиться писать на нем. Да, на Java нет игр AAA-класса, но Java предоставляет огромные возможности, больше кол-во встроенных средств и быстроту написания кода.
Начнем с выбора IDE. Я являюсь фанатом Eclipse и посоветую вам его.
Если же почему-то вам он не понравился, вы можете использовать NetBeans, Intellij IDEA или командную строку и ваш любимый редактор.
И скачаем JDK последней версии: JDK 7u4
Скорее всего проблем с установкой IDE у вас не возникнет, а если у вас 64-битная система, все же посоветую устанавливать 32-битный Eclipse, так как иногда бывают ошибки и Eclipse у вас просто не запустится.
Под катом мы приступим к созданию игры.
Класс Game
Итак, создаем проект, в нем класс Game(попутно создав в нем точку входа). Данный класс должен наследовать класс Canvas и реализовать интерфейс Runnable:
Создадим переменную running типа Boolean, которая, как вы уже догадались будет показывать нам запущена ли игра, или нет.
Создадим функцию start() и в ней мы будем создавать новый поток и переводить running в true:
Создадим три функции — update(long delta), render() и init(). Я надеюсь что их значение вам понятно. В функции run() создадим главный игровой цикл, перед ним будем вызывать init(), а в нем самом render() и update(). Так же мы будем вычислять разницу между кадрами(delta time).
Пока поработаем над функцией render().
Вам наверное уже не терпится запустить и попробовать, но не спешите. Мы должны создать фрейм и добавить наш холст на него. Заодно и объявим три переменных.
Примерно вот так выглядит наш класс Game сейчас.
Класс Sprite
Создадим новый класс Sprite. Поскольку этот класс небольшой, я сразу приведу весь его код с комментариями:
Сразу же проверим работоспособность. Возьмем эту картинку и скопируем ее в папку с нашим классом Sprite. Добавим функцию getSprite() в класс Game(временно).
Добавим нашу картинку в папку assets(папку создать в корне проекта), саму папку надо добавить в build path.
Далее создаем переменную hero типа Sprite. В функции init() инициализируем ее. В Функции render() рисуем:
Input
Для обработки инпута мы создадим класс, наследующий KeyAdapter:
Тут же и объявим две переменных в шапке класса Game:
Внутри класса KeyInputHandler создадим две функции:
Теперь в функции init() добавим следующее:
Создадим переменные x и y для героя(так как пока что мы еще не написали класс Entity). Сделаем чтобы герой всегда рисовался на этих координатах.
А теперь в функции update() будем проверять нажаты ли клавиши и изменять x-координату.
Любите ли вы играть? А создавать игры? Даже если раньше не пробовали, никогда не поздно начать! Тем более, написать свою собственную игру теперь можно всего за час. А если понравится быть не игроком, а творцом, новое умение можно превратить в полноценную профессию. Как? Сейчас расскажем!
Змейка или Тетрис - какая вам ближе?
IT-портал GeekBrains запустил новый проект - серию вебинаров по созданию несложных игр на языке Java.
Что нужно для участия? Ничего, кроме собственно компьютера. Даже если вы никогда в жизни не видели исходный код программы и при слове Java вспоминаете чашку с дымком, которая иногда просит обновлений - ничто не помешает написать игру.
На вебинарах подробно рассказывается о создании таких игр, как Conway'sGameofLife, Snake, Тетрис, SpaceInvaders, и полностью раскрывается процесс написания кода. Если же что-то не получилось или вам интересно увидеть “официальный” вариант кода, - все файлы для игры можно скачать со страницы с описанием вебинара.
Сейчас для просмотра доступны четыре вебинара, посвященных теплым ламповым играм 80-х годов. То, во что вы самозабвенно рубились когда-то на приставке или Nokia 3310, теперь можете создать сами!
А дальше что?
Люди, которые занимаются созданием игр, называются разработчиками игр или гейм-девелоперами. Этой профессии пока не учат в российских вузах, но ей за совсем небольшую плату учит GeekBrains!
Гейм-девелоперы сейчас востребованы как никогда: люди любят играть, и аудитория онлайн- и оффлайн-игр постоянно увеличивается. Соответственно, всегда нужны новые разработчики, свежие идеи и предложения. В перспективе разработчик может возглавить, например, отдел, занимающийся конкретной игрой, или войти в руководство компании-девелопера игр. Нижний зарплатный порог в индустрии выше, чем у обычного менеджера среднего звена, а потолок ограничен только вашей фантазией - в прямом и переносном смысле. Так что подумайте, вдруг именно это и есть ваша будущая любимая работа?!
Эта статья рассчитана на новичков в программировании. Её цель — объяснить азы языка Java (классы, методы, компиляция, байт-код, JVM, переменные, условия, циклы, импорт). Этот материал поможет:
- научиться писать код, компилировать и запускать байт-код;
- познакомиться с переменными;
- узнать об условных операторах и циклах;
- освоить использование классов из стандартных пакетов;
- написать простую консольную игру «Угадай число».
Java Development Kit (JDK)
Счастливым обладателям Windows потребуется также настройка системных переменных. Как их найти: Панель управления → Система → Дополнительные параметры системы → Вкладка «Дополнительно» → кнопка «Переменные среды», второе окошко сверху. В нем надо создать переменную JAVA_HOME и изменить (дополнить) Path (для этого используются кнопки «Создать» и «Изменить». Значение для переменной JAVA_HOME содержит путь к папке JDK. Переменную Path дополняем значением %JAVA_HOME%\bin. Обратите внимание, что список путей разделяется точкой с запятой (;). Инструкция есть также на сайте Oracle.
JDK содержит много утилит, но нам потребуется только компилятор (javac) и виртуальная машина Java — JVM (java).
Проверить правильность установки и настройки можно в командной строке (на Windows: Win + R → cmd) или в терминале (Linux, Mac), набрав следующие команды:
В качестве альтернативы можно использовать онлайн-JDK вместе с редактором, например на сайте Repl.it.
Написание кода
Писать исходный код можно в любом текстовом редакторе. А компиляцию и запуск проводить в командной строке (терминале). Но удобнее будет работать в редакторе с подсветкой синтаксиса и плагином, автоматизирующим компиляцию и запуск.
Для Windows хорошим выбором будет Notepad++ с плагином NppExec. Для Linux и Мас существуют другие текстовые редакторы, например Atom или Geany. Подробно об их настройке можно прочитать в статье «Пишем код на Java и Go в текстовом редакторе».
Hello, world!
При изучении нового языка писать программу, выводящую «Hello, world!», — это традиция. Она возникла в 1978 году, с выходом в свет книги «Язык программирования С» Брайана Кернигана и Денниса Ричи.
Код начинается с ключевого слова class. Java-программы состоят из классов — это «кирпичики» приложения. В реальных приложениях их могут быть десятки, сотни и тысячи. Затем пишется имя класса — HelloWorld. Имена классов принято писать в стиле CamelCase (все слова слитно, каждое с заглавной буквы). Классам, как и другим сущностям — методам, полям и переменным — рекомендуется давать мнемонические, «говорящие» имена.
После имени в фигурных скобках записывается тело класса. Оно может содержать поля, методы и другие классы. Поля хранят данные. Они подобны переменным, однако в Java это несколько иная сущность. Методы содержат набор команд или код. Имена методов (как и полей, переменных) принято писать в стиле camelCase, со строчной буквы.
Наш метод main() содержит лишь одну строку, которая выводит в консоль текст "Hello, world!".
Перед компиляцией сохраняем написанный код в файл. Имя файла должно соответствовать имени класса с точностью до регистра символов (Java — регистрозависимый язык). Затем открываем командную строку (или терминал) и вызываем сначала компилятор (javac), а потом виртуальную машину JVM (java).
После компиляции возникнет бинарный файл HelloWorld.class, содержащий байт-код. Имя этого файла (без расширения) передаётся как параметр при вызове виртуальной машины. В результате видим строку «Hello, world!» — это результат выполнения программы.
Переменные
Переменные хранят данные (числа, строки, логические значения и другие). Они похожи на коробочки: надписи на них — это имя и тип переменной, а внутри находится значение. При этом возможны две операции:
- запись значения в переменную (или присвоение значения);
- чтение значения из переменной.
В Java перед использованием переменную нужно обязательно объявить, указав тип и имя, поскольку Java — язык со строгой и статической типизацией. Попытка использовать переменную без объявления приведёт к ошибке компиляции. По типу переменные могут быть простыми (числа, символы, логические значения) или ссылочными (массивы, строки, любые другие объекты). В Java есть восемь простых типов (byte, int, short, long, float, double, boolean, char) и бесконечное количество ссылочных.
В примере ниже мы видим объявление двух переменных целого типа (int). Причём переменная second инициируется при объявлении. Затем переменной first присваивается результат выражения, в котором присутствует переменная second. В результате выполнения программы в консоль будут выведены значения обеих переменных: 35 и 10.
Имя переменной может содержать буквы и цифры, знак подчёркивания и $. Имя не должно начинаться с цифры. В профессиональной разработке в именах переменных используют только буквы. Имя должно явно указывать на назначение переменной. Например: countString — счётчик строк, errorSign — признак ошибки. Рекомендуется избегать однобуквенных имён — за исключением временных переменных (существующих в рамках цикла или небольшого кодового блока).
Проверка условий
Любой язык программирования высокого уровня позволяет изменять порядок выполнения программы в зависимости от заданного условия. В Java для этого используется конструкция if. После этого ключевого слова в скобках записывается логическое выражение, затем в фигурных скобках — группа команд. Если результат логического выражения — true (истина), то эта группа команд выполняется, если false (ложь) — нет.
Результат этого примера — строка “i = 10” в консоли, так как результат логического выражения (проверка на равенство) будет true.
В качестве знаков сравнения допустимы: <, <=, >, >=, ==, !=. Добавив ключевое слово else, получаем полную форму оператора сравнения.
Циклы
Циклы предназначены для повторения группы команд. Java позволяет использовать два вида циклов:
- с определённым количеством итераций: for;
- без определенного количества итераций: while и do-while.
Запустив этот пример, мы увидим в консоли колонку чисел от 0 до 4. Это результат работы классического цикла for со счётчиком. В круглых скобках три параметра цикла, разделённые точкой с запятой: объявление и инициализация счётчика, проверка условия продолжения цикла, действие после каждой итерации. В фигурных скобках — тело цикла. В нашем случае это команда, выводящая значение счётчика i в консоль.
Когда будем писать игру, используем циклы while и do-while — там и увидим их работу на практике. Пока достаточно сказать, что их синтаксис проще for, а тело цикла повторяется до тех пор, пока логическое выражение в круглых скобках после while возвращает true.
Пример ниже иллюстрирует вторую форму цикла for — без счётчика. Такой вариант удобен при переборе элементов массива или списка.
Импорт и использование классов
Один из важных принципов программирования — DRY: Don’t Repeat Youself (не повторяйся). Разработчик должен уметь использовать то, уже создано, отлажено и работает.
В игре нам потребуется случайное число от 0 до 9. Писать генератор случайных чисел незачем, так как в пакете java.util есть готовый класс Random. Чтобы использовать класс из пакета, его нужно импортировать. Строки с директивами импорта располагаются в самом начале файла класса.
Создадим объект на основании класса, чтобы можно было вызвать нужный метод. Слева от знака присваивания (=) объявляем ссылочную переменную (объект) random типа Random. Справа создаём объект с помощью директивы new.
Вызываем метод через точку после имени объекта: random.nextInt(10). Цифра 10 ограничивает диапазон генерируемых чисел (от 0 до 9). В результате получим строку из 30 случайных чисел. Запустите программу несколько раз и обратите внимание, что последовательность чисел не повторяется.
Игра «Угадай число»
Мы узнали достаточно, чтобы написать игру «Угадай число». В ней компьютер «загадывает» целое число от 0 до 9, а человек должен угадать его — есть три попытки.
Создадим класс GuessTheNumber с методом main(), импортируем нужные нам классы и добавим соответствующие объекты. Класс Scanner обеспечит чтение чисел с консоли (System.in — консоль).
Объявим и инициируем три переменные: счётчик попыток count, для чтения числа с консоли — guess, для хранения загаданного числа — number.
Опишем основной игровой цикл, используя while. В цикле запрашиваем число с консоли, сравниваем с загаданным. В случае несовпадения выводим подсказку и увеличиваем счётчик попыток на 1.
Тело цикла while повторяется, пока логическое значение в скобках возвращает true. Таким образом наш цикл будет повторяться, пока значение счётчика попыток меньше 3 и число не отгадано. Обратите внимание на конструкцию, которая позволяет выбрать одно из двух значений согласно условию в скобках. Это тернарный оператор. Если условие в скобках true, то возвращается значение слева от двоеточия, если false — справа.
Остаётся добавить строку с выводом результата игры (победа или проигрыш) после цикла — тут снова используется тернарный оператор. Текст работающей программы выглядит так:
Сохраняем программу в файл GuessTheNumber.java, компилируем (javac), вызываем JVM (java) — и пробуем выиграть у компьютера.
Добавим заключительный штрих: используя цикл do-while, позволим пользователю повторять сеанс игры без перезапуска программы. В приведённом ниже коде комментарий нужно заменить на соответствующий фрагмент из предыдущей программы. Попробуйте сделать это самостоятельно.
Обратите внимание, что тело цикла do-while повторяется на тех же условиях, что и тело цикла while: логическое выражение в скобках должно быть true.
Заключение
На всякий случай прилагаю мой telegram — @biblelamp. Если вас заинтересовала тема, рекомендую почитать «Java-программирование для начинающих» Майка МакГрата и «Изучаем Java» Кэти Сьерра и Берт Бейтс. В следующих статьях мы продолжим начальное изучение Java на примере создания других игр. Следите за блогом!
Другие статьи из серии «Быстрый старт с Java»:
Если язык Java вас заинтересовал — приглашаем на факультет Java-разработки. Если ещё не совсем уверены — посмотрите истории успеха наших Java-выпускников:
Я давно бросил играть в мобильные игры. Сделал я это примерно в тот момент, когда осознал, что телефоны стали пристанищем для условно-бесплатных доилок без геймплея, но с дюжиной способов заставить пользователя задонатить. Хорошие игры для смартфонов теперь приходится выискивать среди огромной кучи условно-бесплатного мусора в GooglePlay или AppStore. Но так было не всегда. Всего каких-то пятнадцать лет назад, когда в ходу были не сенсорные, а кнопочные телефоны, игры для них выпускались гораздо лучше и интереснее, чем сегодня. Об этой ушедшей эпохе я и вспомню сегодня.
Первые мобильные приложения появились еще на старинных черно-белых телефонах и были встроены в софт. Обычно каждая модель телефона предоставляла две-три незамысловатых игры. Например: змейку, тетрис, аналоги Space Invaders или Pacman. Все они были простенькими убийцами времени, которые неплохо справлялись со своей основной задачей – дать скоротать время, когда под рукой нет ничего более серьезного.
Древняя игра Stack Attack была чем-то похожа на тетрис. Мы должны укладывать падающие сверху блоки в ряды.
Идея встроить игры в портативное устройство оказалась удачной. Для превращения мобильного телефона в игровую платформу не хватало только возможности самостоятельно устанавливать игры. Очень скоро такая опция появилась. В 1999 году появились телефоны, поддерживающие WAP (Wireless Application Protocol) — первый мобильный интернет. Стало возможно загружать на мобильники картинки, рингтоны, ну и мобильные игры. Помню, как задняя сторона обложки каждого журнала предлагала “Послать СМС и скачать недорого …”
В середине нулевых такими объявлениями пестрела обложка каждого журнала.
Но настоящий прорыв в сфере мобильных игр произошел в 2001 году. Именно тогда вышли первые телефоны с поддержкой Java2ME – технологии, позволяющей создавать приложения для компактных устройств. Удобной технологией очень быстро воспользовались десятки студий, наводнив рынок огромным количеством мобильных игр.
Пожалуй, самым популярным мобильным разработчиком стала студия Gameloft – отделившееся от Ubisoft подразделение, которое в последствие превратилось в самостоятельную компанию. Gameloft была создана одним из отцов-основателей Ubisoft, Мишелем Гийермо. Студия активно использовала доступ к интеллектуальной собственности старшей сестры, выпустив мобильные версии таких знаменитых игр, как Prince of Persia, Asassin’s Creed, Far Cry 2 и Tom Clancy's Splinter Cell. Несмотря на большое количество собственных популярных франшиз, компания не стеснялась заимствовать чужие идеи и откровенно клонировать чужие игры. Многие, думаю, вспомнят серию игр Gangstar, создатели которых явно вдохновлялись GTA. А вот Zombie Infection, очевидно сделанная на основе Resident Evil, известна не каждому.
Серия игр Gangstar вышла отличной заменой GTA с большим городом песочницей и возможностью творить безумие.
Gameloft успешно пережила закат эпохи Java игр и сейчас выпускает свои проекты на смартфоны. Вы, наверное, слышали про их самые популярные серии – Modern Combat, очевидный клон Call of Duty, а также пародию на Need for Speed – Asphalt.
Если вы думаете, что только Ubisoft использовала свои наработки для Java игр, то это не так. Другие издатели тоже не стояли в стороне. В разработке мобильных проектов активно участвовали компании Electronic Arts, Sega, Konami и Capcom. Хотя те и не копировали чужие идеи, но активно пользовались своими брендами. Например, знаменитую игру Sonic The Hedgehog от Sega я прошел именно на мобильном телефоне. Разработчики заботливо портировали платформер на Java, и игра ощущается так, будто изначально создавалась для телефонов.
Мобильный порт игры Sonic The Hedgehog получился на редкость приближенным к оригиналу.
Вообще, удобный форм-фактор телефонов позволял играть во многие игры без затруднений. Казалось бы, всего 12 клавиш для управления позволяли сделать хорошие проекты в разных жанрах. Лучше всего, конечно игрались двухмерные сайдскроллеры с видом сверху или сбоку. Большинство игр-приключений на телефоны выполнены именно в таком формате.
Однако на Java нашлось место и для других жанров. Хорошо на этой платформе себя чувствовали гонки. Хотя обычно они делались с традиционным для игрока видом машины сзади, в играх Gangstar предстоит управлять машиной с видом сверху. И чувство контроля от этого нисколько не страдает. Мы видим, как машина разгоняется, чувствуем как ее заносит на крутых поворотах.
Gravity Defied и Hill Climb Racing. Ну вы поняли, откуда у второй ноги растут.
Немного в стороне от гонок стояла знаменитая серия игр Gravity Defied. В ней мы за мотоциклиста преодолеваем сложные трассы на время, стараясь не разбиться. Скорее всего, именно этими играми и вдохновлялись разработчики бесплатной убивалки времени для смартфонов Hill Climb Racing. Впрочем, в последней от оригинала оставили только реалистичную физику, добавив элементы прокачки: открываемые за гринд машины, улучшения и уровни.
Кроме гонок, телефоны предлагали на удивление качественные космосимы – дилогию Galaxy on Fire, где игроку предстояло взять под управление боевой звездолет. Если первая часть GoF ставила упор именно на миссии, кроме них давая лишь зачатки торговли, то вторая стала полноценным космическим симулятором с открытой звездной системой, по которой можно свободно перемещаться, огромным количеством кораблей, оружия и модулей для покупки, а также большим количеством способов заработать деньги на все это добро. Кстати, Galaxy on Fire 2 вышла еще и на смартфоны, и является вполне достойной игрой, если вы фанат подобного жанра.
Galaxy on Fire 2 на смартфоны. Графика вполне достойная.
Хотя Galaxy on Fire и некоторые другие игры выходили на телефонах в 3D, в целом трехмерные игры не особо подходят на эту платформу. С лаконичной телефонной системой управления не выйдет сделать хороший трехмерный шутер. В лучшем случае получатся игры, подобные старым частям Doom, где оригинальное “тракторное” управление очень походило на контроль с помощью клавиш телефона. Когда 4 кнопки отвечают за движение, просто нет удобной возможности дать игроку еще и наводиться. Правда, создатели Stalker Mobile пошли немного другим путем. Каждая арена игры представляет тир, в котором мы, стоя на месте, наводимся на выглядывающих врагов. Такая вот стрельба по уточкам.
Но лично я считаю, что попытки делать трехмерные игры на телефоны не стоили свеч. Слишком уж ограничены мощности платформы, чтобы выдать достойное изображение. Картинка даже на маленьком экране выходит слишком резкой, с ярко выраженными полигонами. Другое дело – спрайты. Мастерство художников способно вдохнуть в двухмерные картинки жизнь, заставить те красиво и органично двигаться. Кстати, я часто поражаюсь тому, как разработчики преодолевали технические ограничения телефонов. Сложно поверить, но большинство мобильных игр весило меньше мегабайта. Лишь самые проработанные занимали мегабайт – два. И как только у программистов получалось вместить в такой маленький объем памяти все спрайты, скрипты, а также музыкальное сопровождение? К сожалению, сейчас огромные объемы памяти разбаловали разработчиков, дав тем возможность подзабить на оптимизацию своих игр.
Stalker mobile. Каждая локация — всего лишь тир с неподвижным главным героем. Впечатления от шутера конечно не те, что от компьютерной версии.
Я с теплотой вспоминаю время Java игр, которые когда-то дарили мне яркие и незабываемые ощущения. К сожалению, с появлением смартфонов их эпоха безвозвратно ушла. Однако есть и способ вспомнить старые проекты. И нет, для этого не надо доставать из чулана старинный телефон и сдувать с него пыль. Уже давно есть различные удобные эмуляторы Java. Для компьютера можно скачать KEmulator, на андроид — J2MeLoader. Я, например, поиграл в несколько игр с помощью J2MeLoader. Многие из них до сих пор достойны прохождения.
Когда я писал этот материал, то думал, что ограничусь воспоминанием об эпохе Java игр с наиболее знаковыми проектами. Но я понял – так не выходит. Все-таки, на кнопочные телефоны выходило слишком много отличных игр, поэтому будет просто невежливо пройтись по верхам, не уделив им достаточно внимания. Поэтому ждите продолжения. Тема интересная, и я думаю, что ещё не раз к ней вернусь.
Читайте также: