Magic balls для андроид

Пишем Magic 8-Ball для Android

В данной статье мы напишем локализованный Magic 8-Ball для Android, которому можно будет задать вопрос, потрясти и получить ответ. Небольшая вибрация оповестит нас о том, что тряски достаточно.

Статья рассчитана на тех, кто уже написал хелловорлд под Android и собирается идти дальше в этом направлении. Полная версия исходного кода лежит на google code. Там же можно попробовать файл magic-8-ball 1.1.apk во вкладке download.

Для успешной работы нам будут нужны установленные jdk, android sdk, eclipse и ADT плагин. Как это сделать, доступно написано здесь.

Локализация

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

Итак, концепция локализации приложений такова, мы создаем несколько наборов ресурсов, первый — по умолчанию res/values/strings.xml , остальные для нужной нам локали res/values- /strings.xml , например, values-en для английского или values-ja для японского. При запуске Android выбирает какие ресурсы загрузить, основываясь на локали самого устройства. К слову, под ресурсами в Android подразумеваются не только текстовые строки, а также layout’ы, звуковые файлы, графика и другие статические данные.

Для нашего приложения мы создадим папки res/values/ , res/values-en и res/values-ru , в них будут лежать файлы strings.xml. Эти файлы содержат название приложения, заголовки и ответы магического шара, которые хранятся в массиве responses. Выглядит это так:

xml version =»1.0″ encoding =»utf-8″ ? >
resources >
string name =»app_name» > Magic 8-Ball string >
string name =»shake_me_caption» > Shake Me string >
string name =»press_menu_shake_caption» > Press Menu\n- Shake string >
string name =»menu_shake_caption» > Shake string >
string name =»menu_preferences_caption» > Preferences string >

string name =»preferences_section_title» > Magic 8-ball Preferences string >

string name =»shake_count_id» > shakeCount string >
string name =»shake_count_title» > Shake count string >
.
string-array name =»responses» >
item > As I see\nit, yes item >
item > It is\ncertain item >
item > It is\ndecidedly\nso item >
item > Most\nlikely item >
item > Outlook\ngood item >
item > Signs point\nto yes item >
item > Without\na doubt item >
item > Yes item >
item > Yes -\ndefinitely item >
.
item > Very\ndoubtful item >
string-array >

Читайте также:  Как посмотреть пароль от gmail андроид

* This source code was highlighted with Source Code Highlighter .

Еще нюанс, android developer’s guide предупреждает нас о необходимости иметь точную копию какой-нибудь локализации в качестве ресурса по умолчанию, чаще всего — английскую. И приводит пример, что если не будет хватать строки в файле res/values/strings.xml , которая есть в res/values-en/strings.xml и используется в приложении, то возможно все скомпилируется без проблем, но в локали отличной от английской пользователь увидит сообщение об ошибке и кнопку Force Close.

Layout, анимация и вибрация

xml version =»1.0″ encoding =»utf-8″ ? >
FrameLayout xmlns:android =»http://schemas.android.com/apk/res/android»
android:layout_width =»fill_parent»
android:layout_height =»fill_parent»
android:background =»@drawable/bg» >
ImageView android:layout_width =»fill_parent»
android:layout_height =»fill_parent»
android:src =»@drawable/eight_ball»
android:layout_gravity =»center_vertical»
android:layout_margin =»10px»/>
LinearLayout xmlns:android =»http://schemas.android.com/apk/res/android»
android:orientation =»vertical»
android:layout_width =»fill_parent»
android:layout_height =»fill_parent»
android:gravity =»center» >
TextView android:id =»@+id/MessageTextView»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
android:layout_gravity =»center»
android:background =»@drawable/triangle»
android:text =»@string/shake_me_caption»
android:focusable =»false»
android:gravity =»center_vertical|center» android:layout_marginTop =»14dip» >
TextView >
LinearLayout >
FrameLayout >
* This source code was highlighted with Source Code Highlighter .

private void showMessage( String message) <
TextView triangle = (TextView) findViewById(R.id.MessageTextView);
triangle.setVisibility(TextView.INVISIBLE);
triangle.setText(message);

AlphaAnimation animation = new AlphaAnimation(0, 1);
animation.setStartOffset(Defaults.START_OFFSET);
triangle.setVisibility(TextView.VISIBLE);
animation.setDuration(Defaults.FADE_DURATION);
triangle.startAnimation(animation);

vibrator.vibrate(Integer.parseInt(preferences.getString(
getString(R. string .vibrate_time_id), Defaults.VIBRATE_TIME)));
>

* This source code was highlighted with Source Code Highlighter .

Перед тем как дать ответ Magic 8-Ball завибрирует на время VIBRATE_TIME, взятое из настроек (о них ниже). По дефолту это значение 250мс. Вибрацию маленькой длительностью (50мс) можно использовать в приложениях как ответную реакцию на действия пользователя. Для корректной работы с классом Vibrator нужно не забыть объявить uses-permission в файле AndroidManifest.xml: uses-permission android:name =»android.permission.VIBRATE»/>

xml version =»1.0″ encoding =»utf-8″ ? >
menu xmlns:android =»http://schemas.android.com/apk/res/android» >
item android:id =»@+id/shake»
android:title =»@string/menu_shake_caption»
android:icon =»@android:drawable/ic_menu_always_landscape_portrait»/>
item android:id =»@+id/preferences»
android:title =»@string/menu_preferences_caption»
android:icon =»@android:drawable/ic_menu_preferences»/>
menu >
* This source code was highlighted with Source Code Highlighter .

@Override
public boolean onCreateOptionsMenu(Menu menu) <
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
>

@Override
public boolean onOptionsItemSelected(MenuItem item) <
switch (item.getItemId()) <
case R.id.shake:
showMessage(getAnswer());
return true ;
case R.id.preferences:
startActivity( new Intent( this , Preferences. class ));
return true ;
>
return false ;
>

* This source code was highlighted with Source Code Highlighter .

Читайте также:  Что обозначает версия андроид

Класс MenuInflater используется для создания объектов Меню из xml файла. В метод onOptionsItemSelected мы попадаем в момент выбора элемента меню, о чем говорит нам само название метода. При нажатии на кнопку Shake, мы получим ответ. О кнопке Preferences расскажет глава Настройки.

Работа с сенсором

sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

public void onSensorChanged(SensorEvent event ) <
if ( event .sensor.getType() == Sensor.TYPE_ACCELEROMETER)
if (isShakeEnough( event .values[0], event .values[1], event .values[2]))
showMessage(getAnswer());
>

private boolean isShakeEnough( float x, float y, float z) <
double force = 0.0d;
force += Math .pow((x — lastX) / SensorManager.GRAVITY_EARTH, 2.0);
force += Math .pow((y — lastY) / SensorManager.GRAVITY_EARTH, 2.0);
force += Math .pow((z — lastZ) / SensorManager.GRAVITY_EARTH, 2.0);
force = Math .sqrt(force);

lastX = x;
lastY = y;
lastZ = z;

if (force > Float.parseFloat(preferences.getString(
getString(R. string .threshold_id), Defaults.THRESHOLD))) <
shakeCount++;
if (shakeCount > Integer.parseInt(preferences.getString(
getString(R. string .shake_count_id), Defaults.SHAKE_COUNT))) <
shakeCount = 0;
lastX = 0;
lastY = 0;
lastZ = 0;
return true ;
>
>
return false ;
>

* This source code was highlighted with Source Code Highlighter .

@Override
public void onResume() <
super.onResume();
registerSensorListener();
if (isSensorRegistered())
showMessage(getString(R. string .shake_me_caption));
else
showMessage(getString(R. string .menu_shake_caption));
>

@Override
public void onPause() <
unregisterSensorListener();
super.onPause();
>

* This source code was highlighted with Source Code Highlighter .

Настройки

Наконец, мы дошли до настроек. Тестирование на различных телефонах показало необходимость задавать порог силы встряхивания — threshold. Между HTC Wildfire, Motorola Milestone и, например, Highscreen Zeus, это значение отличалось раза в три. Это ставит перед нами задачи:

  1. Нужно окно настроек, где пользователь может вручную задать значение порога и другие параметры
  2. Эти значения настроек надо где-то хранить и откуда-то читать.

Тут в помощь нам приходят два уже готовых класса PreferenceActivity для отображения настроек и SharedPreferences для их хранения. Теперь более подробно.

PreferenceActivity — класс, который визуально отображает нам иерархию объектов preference. Он загружает контент из xml файла методом addPreferencesFromResource. Он автоматически взаимодействует с объектом класса SharedPreferences и сохраняет настройки по указанному ключу. Создадим xml файл наших настроек и надуем (inflate) наш PreferenceActivity.

Источник

Magnetic Balls 1.207

Magnetic balls — на игровом поле гравитация направлена «вверх», исходя из этого допущения рассчитывается геометрия отражения от стенок и падения шаров.

Читайте также:  Размер кластера при форматировании флешки для андроид

Во время игры слева показан счёт, время и количество монет, справа очередь шаров игрока, а снизу — текущий шар.

  • 4 мира с разной физикой, 384 этапов с увеличением сложности
  • 16 коллекционных котят с 80 предметами, за сбор которых вы получаете опыт
  • новая локация «Отпуск» (по окончанию этапа) в которой можно помочь пингвину сделать горнолыжный курорт
  • бесконечный геймплей с выбранной сложностью (кошмар, в том числе)
  • забавная физика шаров из разных материалов
  • таблицы лидеров
  • нет внутренних покупок и без доната
  • простой пользовательский интерфейс
  • режим игры для людей с нарушенным цветовосприятием (в настройках справа-сверху кнопка с черно-белыми шариками)

В игре два режима: бесконечный с настройкой сложности (кнопка «Аркада») и на прохождение (кнопка «Уровни»), а также четыре мира с различной физикой и оформлением, между которыми можно переключаться по кнопке «Миры» в главном меню.

Стрельба шарами ведётся по нажатию на игровое поле.

Выбор спец-шаров производится по нажатию на текущий шар игрока. Повторное нажатие приведёт к смене на следующий вид шара.

В бесплатной версии игры показывается реклама.

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

За четыре и более шариков в цепочке вы зарабатываете монеты, которые можно тратить на спец-шары в сложных ситуациях (или для веселья).

Комбо даётся за последовательное уничтожение шаров с интервалом не более полутора секунд.

За 3 комбо на поле появляется спецшар-мина, при соединении в цепочку с тремя и более шарами происходит взрыв и игрок получает дополнительную монету.

За 5 и более комбо игрок получает до 6 монет.

Для выбора спец-шарика нажмите на шарик внизу экрана. Повторное нажатие приведёт к смене на следующий вид шарика.

Если у вас есть проблемы с установкой игры, напишите нам. Мы постараемся решить проблему как можно быстрее.

Если вам что то не нравится в игре, напишите нам и мы сделаем её лучше.

Источник

Оцените статью