Текст книги "Создание игр для мобильных телефонов"
Автор книги: Майкл Моррисон
Жанр: Зарубежная компьютерная литература, Зарубежная литература
сообщить о неприемлемом содержимом
Текущая страница: 34 (всего у книги 35 страниц)
В классе GameCanvas поддерживаются следующие методы:
► Graphics getGraphics() – получает объект Graphics для рисования на игровой схеме;
► void flushGraphics() – обнуляет буфер экрана и позволяет отобразить графические объекты на экране телефона;
► void flushGraphics(int x, int y, int width, int height) – обнуляет отдельную область буфера экрана и позволяет отобразить графические объекты в данной области;
► int getKeyStates() – считывает состояние клавиш игры (для определения состояния каждой клавиши используются константы, являющиеся масками бита);
► void paint(Graphics g) – рисует схему игры.
Для поддержки графики с двойной буферизацией в мобильной игре вам достаточно нарисовать графический объект, считанный с помощью функции getGraphics(), а затем отобразить данный объект на экране, используя функцию flushGraphics().
Класс LayerКласс Layer представляет в мобильной игре общий графический объект; он является базовым классом для таких классов, как Sprite и TiledLayer. Несмотря на то что вы напрямую не создаете объекты Layer, вам необходимо регулярно применять методы класса Layer во время работы со спрайтами и вложенными классами.
В классе Layer поддерживаются следующие методы:
► int getX() – считывает положение верхнего левого угла слоя по оси X относительно системы координат объекта (canvas или layer manager);
► int getY() – считывает положение верхнего левого угла слоя по оси Y относительно системы координат объекта (canvas или layer manager);
► int getWidth() – считывает ширину слоя (в пикселях);
► int getHeight() – считывает высоту слоя (в пикселях);
► void setPosition(int x, int y – считывает положение верхнего левого угла слоя по осям X и Y относительно системы координат объекта (canvas или layer manager);
► void move(int dx, int dy) – изменяет положение слоя по осям X и Y на указанное значение по горизонтали и вертикали (в пикселях);
► boolean isVisible() – считывает видимость слоя;
► void setVisible(boolean visible) – настраивает видимость слоя;
► abstract void paint(Graphics g) – рисует слой при условии, что он видимый.
Эти методы обеспечивают доступ к таким стандартным параметрам слоя, как положение по осям X и Y, ширина, высота и видимость. Помните о том, что данные методы поддерживаются и классами Sprite, и TiledLayer (так как они происходят от класса Layer).
Класс SpriteМодели класса Sprite являются двухмерными спрайтами, которые могут перемещаться и изменять параметры анимации одновременно. Спрайт перемещается путем изменения положения по осям X и Y, а изменение его внешнего вида достигается с помощью группы анимационных кадров, которые входят в состав изображения спрайта. Все анимационные кадры имеют одинаковые размеры, а кадры располагаются в изображении по порядку. По умолчанию спрайт содержит последовательность анимации, в которой анимационные кадры располагаются так же, как и на изображении. Чтобы создать уникальные эффекты анимации для спрайта, вы можете настроить анимационную последовательность любым способом.
Также вы можете трансформировать спрайты, то есть вращать и/или зеркально отображать их, чтобы уменьшить количество необходимых изображений. Кроме того, спрайты содержат пиксель ссылки (reference pixel), который является координатой по осям X и Y спрайта. Вы можете использовать этот пиксель для ссылки на спрайт (вместо левого верхнего угла спрайта, использующегося для ссылки по умолчанию). Действия и трансформации спрайта связаны с пикселем ссылки, что, в свою очередь, упрощает осмысленное управление спрайтом.
В классе Sprite заданы следующие константы, которые используются для идентификации трансформаций, применимых к спрайту:
► TRANS_NONE – спрайт никак не трансформируется;
► TRANS_ROT90 – спрайт вращается по часовой стрелке на 90 градусов;
► TRANS_ROT180 – спрайт вращается по часовой стрелке на 180 градусов;
► TRANS_ROT270 – спрайт вращается по часовой стрелке на 270 градусов;
► TRANS_MIRROR – спрайт наклоняется по вертикальной оси;
► TRANS_MIRROR_ROT90 – спрайт наклоняется по вертикальной оси и поворачивается по часовой стрелке на 90 градусов;
► TRANS_MIRROR_ROT180 – спрайт наклоняется по вертикальной оси и поворачивается по часовой стрелке на 180 градусов;
► TRANS_MIRROR_ROT270 – спрайт наклоняется по вертикальной оси и поворачивается по часовой стрелке на 270 градусов.
Эти константы трансформации применяются посредством методы setTransform() и позволяют вам создавать в спрайте различные эффекты, связанные с вращением и зеркальным отображением.
Для создания спрайтов в классе Sprite поддерживаются следующие конструкторы:
► Sprite(Image image) – создает основанный на изображении, не содержащий анимации спрайт;
► Sprite(Image image, int frameWidth, int frameHeight) – создает анимированный спрайт, основанный на изображении. Данный спрайт содержит кадры анимации (размер и количество кадров определяется заданной шириной и высотой кадра);
► Sprite(Sprite s) – создает один спрайт из другого.
Первые два конструктора позволяют вам создавать неанимированные и анимированные спрайты, соответственно, а третий конструктор используется только для копирования спрайта.
В классе Sprite поддерживаются следующие методы:
► void setFrameSequence(int[] sequence) – задает последовательность анимационных кадров для спрайта;
► void nextFrame() – настраивает текущий кадр спрайта на следующий кадр в анимационной последовательности;
► void prevFrame() – настраивает текущий кадр спрайта на предыдущий кадр в анимационной последовательности;
► int getFrame() – считывает индекс текущего кадра спрайта в последовательности кадров;
► void setFrame(int sequenceIndex) – настраивает текущий кадр спрайта в анимационной последовательности на определенный индекс кадра;
► int getFrameSequenceLength() – считывает количество кадров в анимационной последовательности;
► int getRawFrameCount() – считывает количество анимационных кадров для спрайта, указанное в изображении спрайта;
► void setImage(Image img, int frameWidth, int frameHeight) – задает для спрайта определенное изображение;
► boolean collidesWith(Image image, int x, int y, boolean pixelLevel) – проверяет наличие конфликта между спрайтом и изображением в определенном положении по осям X и Y (последний параметр указывает, должен ли этот конфликт быть пиксельным или основанным на конфликте прямоугольника);
► boolean collidesWith(Sprite s, boolean pixelLevel) – проверяет наличие конфликта между двумя спрайтами (второй параметр указывает, должен ли этот конфликт быть пиксельным или основанным на конфликте прямоугольника);
► boolean collidesWith(TiledLayer t, boolean pixelLevel) – проверяет наличие конфликта между спрайтом и вложенным слоем (второй параметр указывает, должен ли этот конфликт быть пиксельным или основанным на конфликте прямоугольника);
► void defineCollisionRectangle(int x, int y, int width, int height) – создает прямоугольник границы для спрайта. Данный прямоугольник предназначен для распознавания конфликтов прямоугольника (часто он меньше, чем сам спрайт; это позволяет учесть спрайты, не имеющие прямоугольной формы);
► void defineReferencePixel(int x, int y) – создает для спрайта пиксель ссылки, который используется для перемещения и трансформации спрайта вместо его левого верхнего угла;
► int getRefPixelX() – считывает положение пикселя ссылки спрайта по оси X относительно системы координат (canvas или layer manager);
► int getRefPixelY() – считывает положение пикселя ссылки спрайта по оси Y относительно системы координат (canvas или layer manager);
► void setRefPixelPosition(int x, int y) – задает положение пикселя ссылки слоя по осям X и Y относительно системы координат объекта (canvas или layer manager);
► void setTransform(int transform) – настраивает трансформацию спрайта (для указания типа трансформации используются константы трансформации);
► void paint(Graphics g) – рисует спрайт, если он видимый.
Данные методы поддерживают большое количество функций спрайта, например, создание анимационной последовательности, распознавание конфликтов, работу с пикселем ссылки и добавление трансформаций.
Класс TiledLayerКласс TiledLayer представляет собой слой, состоящий из нескольких слоев, которые выглядят, как единый графический объект. Вы можете воспринимать такой слой как головоломку, содержащую прямоугольные элементы одинакового размера. Вложенные слои очень удобны для создания фона и карты игры, особенно если такие карты больше, чем экран телефона. Класс TiledLayer позволяет более эффективно управлять изображениями, потому что вы можете использовать слои повторно, а также изменять последовательность слоев для формирования фона.
Аналогично анимационным кадрам, которые хранятся в одном анимированном изображении спрайта, слои хранятся в одном изображении. Класс TiledLayer даже поддерживает анимацию, однако она функционирует не совсем так, как анимация кадров в классе Sprite.
Класс TiledLayer имеет только один конструктор, который принимает различные параметры, определяющие размер карты и слоев:
TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight)
Первые два параметра данного конструктора указывают размеры слоя. Третий параметр – это изображение, содержащее слои, а два последних параметра определяют ширину и высоту отдельных слоев.
В классе TiledLayer поддерживаются следующие методы:
► void fillCells(int col, int row, int numCols, int numRows, int tileIndex) – заполняет группу ячеек прямоугольной формы выбранным индексом слоя;
► int createAnimatedTile(int staticTileIndex) – создает новый анимированный слой, который изначально настроен на определенный индекс слоя (данный индекс является возвратным, отрицательным значением);
► int getCell(int col, int row) – считывает индекс слоя в указанной ячейке;
► int getCellWidth() – считывает ширину ячейки (в пикселях);
► int getCellHeight() – считывает высоту ячейки (в пикселях);
► void setCell(int col, int row, int tileIndex) – задает индекс слоя для указанной ячейки;
► int getColumns() – считывает количество столбцов в карте слоя;
► int getRows() – считывает количество строк в карте слоя;
► void setStaticTileSet(Image image, int tileWidth, int tileHeight) – задает изображение для слоя, содержащего статичные вложенные слои;
► int getAnimatedTile(int animatedTileIndex) – считывает статичный слой, связанный с анимированным индексом слоя;
► void setAnimatedTile(int animatedTileIndex, int staticTileIndex) – задает индекс слоя в текущем слое, который соответствует указанному индексу анимированного слоя;
► void paint(Graphics g) – рисует вложенный слой.
Эти методы предлагают широкий набор функций для создания и управления вложенными слоями. Вы сможете не только составить карту вложенного слоя, но и создать анимированные слои, сформировать отдельные ячейки в карте слоя, а также изменить изображение слоя.
Класс LayerManagerКласс LayerManager играет роль определенного хранилища слоев и содержит функции, предназначенные для организации и управления спрайтами и вложенными слоями. Класс LayerManager не только помогает вам в управлении порядком в слое, но и позволяет нарисовать группу слоев с одной ячейкой; для этого применяется метод paint(). Самая важная функция класса LayerManager, – это поддержка окна View (Вид), которое позволяет вам просмотреть группу слоев. Данное окно дает пользователю возможность увидеть мир мобильной игры.
Класс LayerManager имеет только один конструктор, который не принимает никаких параметров:
LayerManager()
Для создания слоя вам достаточно вызвать данный конструктор (используется по умолчанию). Параметры добавления и управления слоями вызываются функцией layer manager после ее создания.
В классе LayerManager поддерживаются следующие методы:
► void append(Layer l) – применяет слой к нижней части layer manager;
► void insert(Layer l, int index) – вставляет слой в виде индекса в layer manager;
► void remove(Layer l) – удаляет определенный слой из layer manager;
► int getSize() – считывает количество слоев, которыми управляет layer manager;
► Layer getLayerAt(int index) – считывает слой в указанном индексе layer manager;
► void setViewWindow(int x, int y, int width, int height) – настраивает окно View для layer manager;
► void paint(Graphics g, int x, int y) – рисует окно layer manager в указанном положении по осям X и Y, как показано в окне View (верхний левый угол окна View рисуется в положении XY на игровом экране).
Эти методы позволяют вам управлять слоями layer manager. Вы можете вставлять слои, чтобы создать нужный порядок, а также удалять слои. Настройки окна View и рисование группы слоев достаточно просты.
Приложение B
Ресурсы программирования мобильных игр
Вероятно, самое важное в программировании мобильных игр – это постоянное обновление в соответствии с последними тенденциями и технологиями. К счастью, в сети Internet вы найдете большое количество ресурсов по программированию. В этом приложении вы найдете сведения по некоторым полезным ресурсам, с которыми я вам советую работать. Помните о том, что вам следует не только писать кодировку, но и читать статьи, участвовать в обсуждениях на форумах и общаться с другими пользователями.
Micro Dev NetВеб-сайт Micro Dev Net является одним из моих любимых ресурсов по программированию мобильных игр (особенно мне нравятся статьи на этом сайте). Вы найдете здесь большое количество статей, посвященных созданию мобильных игр в J2ME, не говоря об устройствах Java, мобильных играх, которые вы можете загрузить, а также форум MIDP. Обязательно зайдите на сайт http://www.microjava.com/.
J2ME GamerЭтот сайт не так велик, как Micro Dev Net. Но ресурс J2ME Gamer окажется очень полезным, если вы хотите больше узнать о разработке мобильных игр. Данный сайт организован как некое сообщество для разработчиков мобильных игр, а это значит, что вам будет интересно посетить его форумы. Также здесь вы найдете новости, посвященные устройствам Java и программному обеспечению. Этот ресурс находится по адресу http://www.j2megamer.com/.
J2ME.orgЭтот ресурс является аналогом J2ME Gamer и представляет собой форум для обсуждения всех аспектов программирования J2ME, а не только для создания игр. Посетите не только форум, но и все прочие ресурсы данного сайта. Вы найдете этот сайт по адресу http://www.j2me.org/.
Форум Nokia's Mobile Games CommunityЕсли вы хотите сконцентрироваться на программировании для мобильных устройств определенного производителя, посетите данный ресурс. Этот сайт содержит большое количество ценных ресурсов, которые будут вам интересны даже в том случае, если вы не планируете писать программы для телефонов Nokia. Одна из самых интересных статей на сайте посвящена подробному анализу развития коммерческих мобильных игр. Вы найдете большое количество статей по адресу http://www.forum.nokia.com/main/0,6566,050,00.html.
Wireless Developer NetworkРесурс Wireless Developer Network содержит информацию не столько об отдельных производителях, сколько обо всей индустрии беспроводных устройств. Здесь вы не найдете много сведений о программировании мобильных игр; вместо этого на данном сайте находятся подборки новостей и комментарии, связанные с миром беспроводных устройств, а также статьи, посвященные программированию в целом. Ресурс расположен по адресу http://www.wirelessdevnet.com/.
GameDev.netНе все в мире программирования мобильных игр концентрируется вокруг слова «мобильный». Я советую вам посетить сайты, посвященные программированию игр как таковому. GameDev.net – это один из подобных сайтов, содержащий такие сведения, как статьи по программированию, обзоры книг и объявления о работе.
Сайт GameDev.net содержит огромное количество полезных ресурсов и сведений. Обратитесь к разделу Game Dictionary, в котором рассматриваются практически все термины, связанные с программированием игр. Ресурс GameDev.net расположен по адресу http://www.gamedev.net/.
GamasutraGamasutra – это еще один общий сайт по программированию, который описывается как «искусство создания игр». Хорошее описание, не правда ли? Как и на сайте GameDev.net, вы найдете здесь много полезного, включая новости, статьи, объявления о работе, руководства по программированию игр и так далее. Обязательно посетите сайт Gamasutra по адресу http://www.gamasutra.com/.
Game Developer MagazineПоследний источник советов по программированию игр, о котором мы хотим вам рассказать, – это Game Developer Magazine, единственный журнал, посвященный исключительно разработке игр. Журнал Game Developer концентрируется, в первую очередь, на коммерческих играх для PC и консолей. Тем не менее данный ресурс содержит и весьма ценную информацию по последним тенденциям в мире программирования. Вы можете купить этот журнал в книжном магазине или зайт на веб-сайт http://www.gdmag.com/.
GamelanСайт Gamelan является частью сайта Developer.com и представляет собой один из оригинальных ресурсов Java. Я работаю с данным сайтом в течение многих лет. Ресурс Gamelan растет вместе с Java; теперь он содержит раздел, посвященный только J2ME. Здесь немного информации о программировании игр как таковом, однако, используя ресурсы данного сайта, вы сможете существенно улучшить свои навыки в Javas. Вы найдете сайт Gamelan по адресу http://www.developer.com/java/.
JavaWorldМы продолжаем рассказ об общих Java-ресурсах. Журнал JavaWorld в сети Internet является публикацией компании IDG Communications. Он содержит большое количество интересных статей по Java-программированию. Журнал JavaWorld состоит из набора статей и руководств; с его помощью вы не отстанете от событий в мире Java. Веб-сайт JavaWorld расположен по адресу http://www.javaworld.com/.
The Official Java WebsiteИ наконец, последний ресурс в области разработки мобильных игр, о котором мы расскажем, – это официальный сайт Java компании Sun Microsystems. Данный сайт включает самую последнюю информацию о Java и программах, выпускаемых компанией Sun Microsystems. Непременно заходите на этот сайт, так как отсюда вы сможете загрузить официальные обновления Java, например, новые версии Java SDK и J2ME Wireless Toolkit. Также здесь довольно много технической документации, включая руководство по Java. Официальный веб-сайт Java находится по адресу http://java.sun.com/.
Приложение C
Создание графики для мобильных игр
Мобильные игры сильно ограничены в разрешении и размерах экрана, однако именно график игры дает пользователю первое впечатление об игре в целом. Я с удовольствием поспорю о том, что игровой процесс является основным критерием оценки того, насколько интересна сама игра. Но у меня нет сомнений в том, что слабая графика способна «убить» самую увлекательную игру. Поэтому вам необходимо потратить свое время на создание для игры графики и анимации, которые смогут привлечь внимание пользователей. Отмечу, что ограничения в графике мобильных игр делают процесс ее создания более простым по сравнению с графикой для PC или консольных игр.
Оценка графики игрыЕсли у вас в штате нет отдела художников, это значит, что вам, как и большинству пользователей, придется создавать красивую графику своими руками. Даже если вы решили обратиться за помощью к художнику, вам все равно придется разработать основные принципы создания графики самостоятельно. В любом случае, любой вклад разработчика в процесс создания графики игры позволит улучшить внешний вид игры. В данном приложении вы найдете информацию о процессе.
Перед тем как начать создание графики, следует определить, какого результата вы хотите добиться. Ваша игра должна иметь полностью сформировавшуюся концепцию. Далее вам необходимо собрать воедино всю информацию по игре и выбрать графические объекты, которые смогут реализовать ваши идеи. Для этого следует выбрать графические элементы и добавить их в программу.
Первое важное решение, которое вам придется принять во время создания графики игры, – это выбор размера экрана. Обычно он зависит от модели мобильного телефона, на которую вы рассчитываете. Игровой экран представляет собой прямоугольник на экране телефона, на котором отображается игра; он не включает стандартные элементы пользовательского интерфейса, такие как, например, системное меню. Чтобы определить размер экрана для отдельной модели телефона, выполните команду Skeleton MIDlet из главы 3, «Конструирование скелета мобильной игры», и воспользуйтесь полученными результатами. Итоговое значение является размером схемы для графики игры, и именно оно необходимо для создания графики.
В отличие от игр на PC, размер экрана в мобильной игре определяется исключительно выбранной моделью телефона. Если вы не желаете создавать отдельную версию игры для каждой модели телефона, вы можете настроить графику, которая будет более универсальна. Один из способов добиться этого состоит в том, чтобы создать графику для той модели телефона, которая обладает наименьшим размером экрана (из числа всех выбранных вами для игры мoделей). На более крупных экранах вы сможете центрировать экран игры и оставить вокруг него пустое пространство.
Также для этого вы можете воспользоваться масштабируемыми графическими объектами. Как правило, при таком подходе игры создаются с примитивной графикой, которая рисуется без растровых изображений. Масштабировать растровые изображения сложно, но вы можете без труда масштабировать линии, прямоугольники, эллипсы и так далее. Помните о том, что классические аркадные игры используют векторную графику, представляющую собой то же самое, что и примитивная графика в мобильных играх, разработанных с помощью J2ME.
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.