- PVSM.RU - https://www.pvsm.ru -
В предыдущих постах [1] про Октодон мы уже не раз упоминали о скорости печати, которую нам удалось достигнуть [2], и получили много вопросов, сколько же надо для этого тренироваться.
На определенном этапе этим вопросом задались и мы, а способ получить ответ только один — тестировать. В этой статье я расскажу, как мы обучались печати на собственной клавиатуре и сделали приложение для Android [3], где каждый может узнать свою скорость печати и посоревноваться с другими людьми, использующими другие методы ввода!
Изначальный замысел — по примеру других клавиатур (вроде игр MessagEase [4]), сделать обучающее приложение с несколькими уровнями:
Художник вооружился фотографией зверька Octodon Degus и сделал нам арт, а я взялся за программирование. Имея небольшой опыт геймдева под iOS, я полагал, что средств родного Android-фреймворка хватит, чтобы сделать небольшую игру с примитивной анимацией из спрайтов. Однако я жестоко ошибался. Несколько потраченных впустую дней привели меня на форум с целой веткой из нецензурных сообщений, касающихся сильных тормозов и глюков при работе с 2D графикой, с которыми я и столкнулся.
Отложив грабли в сторону, я занялся тем, что должен был сделать сразу — нагуглил замечательный движок AndEngine [5]. Для решения большинства задач мне хватило примеров из репозитория AndEngineExamples [6]. Также в сети обитает множество туториалов и большой форум [7] пользователей.
public class MenuActivity extends BaseGameActivity implements Scene.IOnSceneTouchListener {
private Camera mCamera;
private MenuResMan resMan;
//инициализируем движок и камеру
@Override
public Engine onLoadEngine() {
this.mCamera = new Camera(0, 0, UIConstants.CAMERA_WIDTH, UIConstants.CAMERA_HEIGHT);
return new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, new RatioResolutionPolicy(UIConstants.CAMERA_WIDTH, UIConstants.CAMERA_HEIGHT), this.mCamera));
}
//загружаем ресурсы
@Override
public void onLoadResources() {
resMan = new MenuResMan(this);
resMan.LoadResources();
}
//загружаем сцену
@Override
public Scene onLoadScene() {
mEngine.registerUpdateHandler(new FPSLogger());
final Scene scene = resMan.LoadScene();
scene.setOnSceneTouchListener(this);
String lang = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
testingModel.ChangeLang(lang);
return scene;
}
@Override
public void onLoadComplete() {
<...>
}
@Override
protected void onCreate(Bundle pSavedInstanceState) {
<...>
}
@Override
protected void onStop() {
<...>
}
Для перехода между экранами меню я создаю дочерние сцены с необходимым контентом (для самой игры и других больших элементов создается отдельная activity) и добавляю следующий код для корректной работы кнопки Back:
@Override
public void onBackPressed()
{
Scene scene = this.mEngine.getScene();
if(scene.hasChildScene()){
scene.back();
}
else{
this.finish();
}
}
Всю работу с ресурсами (загрузка картинок, шрифтов, звуков, создание сцены и ее компоновка) находится в отдельном классе ResMan.
public class MenuResMan {
private BaseGameActivity activity;
private BitmapTextureAtlas textFontTexture;
public Font textFont;
private BitmapTextureAtlas backgroundTexture;
public TextureRegion mainBackgroundRegion;
public Sprite mainBackground;
public void LoadResources()
{
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("Menu/");
//должны быть степени двойки
backgroundTexture = new BitmapTextureAtlas(512, 1024, TextureOptions.REPEATING_BILINEAR_PREMULTIPLYALPHA);
textFont = new Font(textFontTexture, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL),
UIConstants.TEXT_FONT_SIZE, true, Color.BLACK);
activity.getTextureManager().loadTexture(backgroundTexture);
activity.getTextureManager().loadTexture(textFontTexture);
activity.getFontManager().loadFont(textFont);
mainBackgroundRegion = BitmapTextureAtlasTextureRegionFactory
.createFromAsset(backgroundTexture, activity, "mymenu.png", 0, 0); //480x800
<...>
}
public Scene LoadScene()
{
Scene scene = new Scene();
mainBackground = new Sprite(0,0,mainBackgroundRegion);
scene.attachChild(mainBackground);
Rectangle textBackground = new Rectangle(0,0,
UIConstants.CAMERA_WIDTH - UIConstants.BORDER_WIDTH*2,
UIConstants.CAMERA_HEIGHT - UIConstants.BORDER_WIDTH*2 - headerBackground.getHeight()
);
speedText = new ChangeableText(UIConstants.TESTING_BORDER_WIDTH, UIConstants.TESTING_BORDER_WIDTH, headerFont, " ", 10);
textBackground .attachChild(speedText);
scene.attachChild(textBackground);
//аттач всего необходимого к сцене
<...>
return scene;
}
public MenuResMan(BaseGameActivity activity)
{
this.activity = activity;
}
}
Далее осталось аналогичным образом создать активность для игры и подключить игровые графические элементы. Есть некоторые тонкости, (например, чтобы была возможность менять цвет текста, используемый шрифт должен быть инициализирован в белом цвете), но в целом движок крайне прост для освоения.
Эту программу с некоторыми доработками мы выложим одновременно с выпуском Октодона, а пока она обучает на первых этапах наших тестеров и дожидается своего часа.
Параллельно с разработкой, мы решили обратиться к признанным специалистам по клавиатурам Logitech и спросить, как они оценивают новые клавиатуры. В ответ нам прислали методику тестирования (о том, как мы проводили по ней тесты — в следующих постах), включающую использование специального онлайн-сервиса [8]. Однако он не работал браузерах на Android, а найденные в вебе и на GooglePlay аналоги в были очень куцые и предоставляли либо мало данных, либо вообще давали использовать только встроенную в них клавиатуру.
Мы пришли к выводу, что писать надо своё, тем более, что у нас уже есть готовый уровень для работы с текстами из обучающей игры. Оставалось добавить туда возможность быстро подгружать свои тексты и, для отслеживания скорости, способность замерять основные показатели печати:
В итоговом лаконичном приложении «Typing Test» пользователь предварительно пишет свое имя, метод ввода, выбирает текст и время тренировки, на выходе получает лог со статистикой. Можно сделать скриншот и твит счёта. Также есть отдельный уровень с каноническим текстом про пираний [9], на котором можно попробовать установить новый мировой рекорд.
Мы думаем, что идея измерения скорости печати будет интересна многим, поэтому решили выложить приложение на GooglePlay и планируем развивать это приложение и далее, но уже независимо от Октодона. Как сервис, на котором можно будет замерять производительность ввода на любой клавиатуре и для любого языка, где эти результаты можно будет наглядно сравнить и проанализировать статистику.
Приложение на GooglePlay [3]
Сбор статистики был очень нужен нам ещё и по маркетинговым причинам. Если проводить тестирование Октодона на случайных людях в течение небольшого времени, то, конечно, мы получим далеко не впечатляющие результаты. Есть много причин, почему так происходит: метод ввода новый, юзер в шоке, что за баян на телефоне и т.д. Но без материальных доказательств это звучит неубедительно, как для потребителей, так и для инвесторов.
Кривая обучения — очень веский аргумент в таком споре, она позволяет показать якобы мучительный процесс обучения в реальном свете. При достаточной выборке она показывает реальную динамику — определенное время тренировки перерастает в определенную скорость печати.
Каждый сеанс тестирования проводился на случайном тексте из 5 существующих, ограничение по времени — 3 минуты. Ниже представлены графики по собранным данным. На оси X отмечено суммарное время, потраченное на набор текстов пользователем.
По количеству слов в минуту:
По точности:
Вот график для скорости по всем имеющимся данным без масштабирования:
Из графиков можно сделать несколько выводов:
На данный момент, в целях улучшения раскладки, мы начали сбор статистики по времени между нажатиями различных пар-направлений джойстиков и думаем, что бы собирать помимо этого (будем рады вашим идеям и предложениям).
В следующих постах мы расскажем про наше массовое тестирование методов ввода на пользователях, процесс создания раскладки для Октодона, также вас ждет обзор back-typing клавиатуры AlphaGrip [10]. Оставайтесь с нами! :)
Автор: kotlyarovsa
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/58267
Ссылки в тексте:
[1] предыдущих постах: http://habrahabr.ru/company/octodon/blog/210956/
[2] нам удалось достигнуть: http://habrahabr.ru/company/octodon/blog/213625/
[3] приложение для Android: https://play.google.com/store/apps/details?id=mobi.octodon.TypingTest
[4] игр MessagEase: https://play.google.com/store/apps/details?id=com.exideas.megame
[5] AndEngine: https://github.com/nicolasgramlich/AndEngine
[6] AndEngineExamples: https://github.com/nicolasgramlich/AndEngineExamples
[7] форум: http://www.andengine.org/forums/tutorials/
[8] онлайн-сервиса: http://www.speedtypingonline.com/typing-test
[9] каноническим текстом про пираний: http://everything2.com/title/The+razor-toothed+piranhas+of+the+genera+Serrasalmus+and+Pygocentrus
[10] AlphaGrip: http://www.alphagrips.com
[11] Источник: http://habrahabr.ru/post/217095/
Нажмите здесь для печати.