Буквально через неделю после того, как у меня в руках оказался iPad, я как и положено каждому порядочному гику, задался вопросом: можно ли программировать на этой штуке? Беглый поиск в AppStore выдал только пару каких-то подозрительных редакторов для пехапе. Уже было разочаровавшись, я полез в Гугл, который на волнах поисковой выдачи вынес прекрасное: .
Программирование на планшете ipad
Небольшое техническое отступление: - это основанная на javascript реализация языка , который, в свою очередь, является очень интересной попыткой создать специализированный язык для компьютерной графики, визуализации данных, цифрового искусства и прочих подобных вещей. С очень симпатичными примерами применения processing можно ознакомиться на официальном сайте и понять что этот инструмент художника дефис программиста совершенно неслучайно повстречался к такой гиково-гламурной штукой как iPad. Но познакомимся поближе к плоду этой странной конвергенции.
С самого начала обрадовал процесс установки и запуска этого чуда веб-технологий: оная сводится к сохранению закладки на страницу с IDE на рабочем столе устройства. После этого IDE может совершенно нормально работать даже в оффлайн-режиме, и более того, магически сохранять набранный код (это происходит при его запуске).
Сам интерфейс IDE сделан по самым строгим спартанским стандартам: обычное поле ввода без единого признака таких рюшечек как подсветка синтаксиса или автокомплит, да пара кнопок. Можно без промедления приступать непосредственно к кодингу.
Как мы увидим дальше, в тексте можно использовать не только функции processing, но и все возможности доступные javascript. Предвкушая открывающиеся возможности, я сунулся было экспериментировать с мобильными плюшками HTML 5, такими как работа с акселерометром, но тут меня ждало горькое разочарование. Фичи, упорно рекламируемые евангелистами этого самого HTML 5, попросту отсутствовали. Немного поигравшись с рисованием кружочков, я временно охладел к идее мобильных веб-приложений.
Месяца через три фирма Apple выпустила долгожданное обновление прошивки для iPad, и как будто узнав о моих разочарованиях, включила в него изрядно улучшенную версию Safari. Помимо всего прочего, в него вошла реализация нескольких фич HTML 5: websockets, SVG, и (ура-ура!) DeviceOrientation API. Засучив рукава, я вернулся к processing.js. Итак, первым делом предстояло проверить что поддержка акселерометра исправно работает и выдаёт данные. Сделать это, согласно примеру в документации, не сложнее чем обработать onMouseClick.
Итак, разработку можно вести прямо на iPad, однако для тех, кто к такой лаконичности относится без особого фанатизма, есть более привычный способ: вести разработку на компьютере. Для этого достаточно положить в какую-нибудь папку библиотеку processing.js (например Processing-1.0.0.js), файл собственно программы, назовём его accel_example.pde, и небольшой index.html для того чтобы собрать всё это вместе.
<html>
<head>
<title>Accelerometer API exampletitle>
<script src="processing-0.9.7.min.js">script>
head>
<body style="backgroung-color: #000000">
<canvas data-processing-sources="accel_example.pde" style="width: 1024px; height: 600px;">canvas>
body>
html>
* This source code was highlighted with .
Осталось только устроить маленький карманный веб-сервер. Если в вашей системе есть python, то для этого достаточно находясь в этой папке, выполнить в консоли команду
python -m SimpleHTTPServer
теперь, наше приложение будет доступно из браузера iPad по адресу , где xxx.xxx.xxx.xxx - IP компьютера.
Для начала, объявим несколько нужных нам переменных и подготовим canvas к работе. За это в processing отвечает функция setup. В ней мы установим размер холста в пикселях и цвет заливки (он используется и как цвет текста).
var w = 1024;
var h = 600;
var sp;
var orientation = [0,0,0];
void setup() {
size(w, h);
fill(0);
sp = new sphere(w/2, h/2);
}
* This source code was highlighted with .
Получив три составляющие accelerationWithGravity, мы кладём их массив, чтобы вывести их потом при перерисовке холста в виде текста и, для наглядности, отрезка. Код, перерисовки в processing содержится в функции draw, в ней мы выведем необходимый текст и нарисуем отрезок.
void draw() {
background(255);
var x = orientation[0];
var y = orientation[1];
text("x="+x, 10, 10);
text("y="+y, 10, 30);
text("z="+orientation[2], 10, 50);
text("t="+(new Date().getTime()), 10, 70);
text("FPS: "+frameRate, 10, 90);
line(w/2, h/2, w/2-(y*20), h/2-(x*20));
}
window.ondevicemotion=function(event) {
var aig = event.accelerationIncludingGravity;
orientation[0] = aig.x;
orientation[1] = aig.y;
orientation[2] = aig.z;
}
* This source code was highlighted with .
Итак, как видно из скриншота, акселерометр работает. К сожалению мы не можем управлять блокировкой ориентации из браузера, так что при запуске очень желательно заблокировать её самостоятельно, и при необходимости поменять оператор - на + во второй паре аргументов функции line()
Теперь попробуем сделать небольшой пример, который при желании можно превратить в вариацию на тему labyrinth. Для этого нужно всего ничего: создаём объект Ball, который инкапсулирует в себе состояние шарика (координаты и скорость), время последнего изменения (оно нам пригодится для того чтобы узнать интервал времени прошедший с момента прошлой перерисовки) и пару методов - для перерасчёта состояния, и для отрисовки.
var w = 1024;
var h = 600;
var b;
var orientation = [0,0,0];
void setup() {
size(w, h);
fill(0);
frameRate(60);
b = new ball(w/2, h/2);
}
void draw() {
background(255);
var x = orientation[0];
var y = orientation[1];
text("x="+x, 10, 10);
text("y="+y, 10, 30);
text("z="+orientation[2], 10, 50);
text("t="+(new Date().getTime()), 10, 70);
text("FPS: "+frameRate, 10, 90);
b.move(x, y);
b.draw();
if (b.x < 0 || b.x > w || b.y < 0 || b.y > h) {
alert("you lose!");
noLoop();
}
}
window.ondevicemotion=function(event) {
var aig = event.accelerationIncludingGravity;
orientation[0] = aig.x;
orientation[1] = aig.y;
orientation[2] = aig.z;
}
ball = function(x, y){
this.x = x;
this.y = y;
this.lastUpd = new Date().getTime();
this.draw = function() {
text("x:"+this.x+"; y:"+this.y, 20, 110);
ellipse(this.x, this.y, 20, 20);
}
this.move = function(ax, ay){
var now = new Date().getTime();
var td = (now-this.lastUpd)/1000;
this.y -= ax * td * 30;
this.x -= ay * td * 30;
this.lastUpd = now;
}
}
* This source code was highlighted with .
Да, я знаю что физическая модель совсем совершенно неправильная, но для иллюстрации нам пока хватит этой. Итак, мы можем управлять движением шарика с помощью наклона устройства, точно так же как в labyrinth, ну или любой другой игре, посвящённой увлекательным приключениям шарика на плоскости.
К сожалению, несмотря на громкие заявления Googe о будущем HTML 5 в качестве мобильной платформы, даже в браузере HTC Desire эта фича не заработала. То ли её вообще там нет, то ли API для него не совместим с моим кодом.
Интересно также было бы сравнить быстродействие processing.js с работой напрямую с canvas, но и эта версия выдавала на iPad вполне нормальные для мобильного устройства 20-25 FPS.
Добавить комментарий