Как стать автором
Обновить

Курс на Google Play


Здравствуй всемогущий Хабр!
В наш век информационных технологий и процветающих коррупции и жадности, возможно, многие задавались вопросом: “как и денежку заработать, и сделать так, чтобы на твоём горбу не ехали все кому попало, и в добавок к этому ещё думая о работе не забывать о прекрасном?”. Так случилось и со мной, и с некоторыми моими друзьями, вместе с которыми я и пытался найти ответ на сей, терзающий душу, вопрос.
Ответ, стоит заметить, не заставил себя долго ждать. На волне процветания мобильных устройств было сложно не заметить, какое число разработчиков ринулось штурмовать баррикады аппстора и андроид маркета. Что и навело нас на мысль самим заняться разработкой мобильных приложений. Справедливо сказать, что на момент зарождения нашей авантюры, идея разработки приложений отвечала всем необходимым параметрам. А именно: давала доход, освобождала от начальства и преподносила возможность творить добро.


С такой перспективой, наплыв идей был безграничен. Единственное что урезало ему спектр- сложность реализации. В результате такого взаимодействия желаний и возможностей мы остановились на одном забавном и интересном варианте — сделать простой и приятный сборник логических задачек. Поковырявшись на андроид маркете, мы уразумели, что если такого рода приложения и имеются, то качество их оставляет желать лучшего, подача самих загадок уж очень слабовата для коммерческих целей. Это, не сложно догадаться, послужило окончательным сигналом, и мы приступили к работе.

«Шелдон: ну раз ты главный, то с чего думаешь начать?
Леонард: Я вообще-то думал начать с дизайна.
Шелдон: Боже, мы обречены!»

Как выяснилось после прочтения энного количества постов по разработке под андроид, кодинг в реализации нашей идеи был не очень трудоёмкой работой. Гораздо больше времени занял именно сбор контента. Зацепившись за круглое число 100, мы как одержимые начали копипастить со всего интернета логические загадки. После чего выяснилось, что интересных и уникальных задач не так уж и много. Тем не менее, неделя усиленного поиска дала свои плоды, и волшебное число 100 было достигнуто.
При более близком знакомстве с рынком оказалось, что основная рыба говорит по-английски, а водится ближе к западу и на территории бывших колоний британского флага. Это заставило нас забыть про видео с котами на ютубе ещё на некоторое время, которое мы посвятили переводу наших горячо любимых загадок на заморский язык.

Что касается дизайна. Если строить график зависимости дизайна от функциональности, то в идеале он должен выглядеть как y=x. Но так уж случилось, что реальный мир вносит свои коррективы, что вынуждает жертвовать тем или иным.

Грубо говоря в нашем художнике боролись два чувства- либо сделать красиво, но программировать это будет очень сложно, либо сделать легко, но это будет банально. Поэтому, после анализа ситуации, было принято решение разбить игру на четыре категории, и оформить это в виде вкладок. Далее так как наше приложение связано с Да’Винчи художник долго думал, а какой стиль ему выбрать. Остановился он на стиле старинной бумаги, и, как мы все считаем, он отлично подошел. Потом пошла ручная работа и полет фантазии по поводу оформления отдельно каждого “Босса” в категориях и всего остального. В общем, работы было много, но я рад, что мы справились.

Когда весь контент, весь дизайн и другие частности были готовы, настало время активного кодинга.

Особых проблем по коду на протяжении разработки не возникало. Но пару моментов, с которыми возникли особые затруднения всё же можно обозначить.
Первое- это возникшая потребность в передаче объекта класса из одной деятельности в другую. Поскольку это игра, объект должен существовать на протяжении всей её жизни. Было найдено довольно удобное решение этой проблемы, а именно использование интерфейса.

<ahref="http://developer.android.com/reference/android/os/Parcelable.html">Parcelable:

public class Player implements Parcelable {
private Context context;
private static int PUZZLE_NUM = 20;
private String name;
private int[] puzzle = new int[PUZZLE_NUM];

public Player (){
/*Some initialization code*/
}

// 99.9% of the time you can just ignore this
public int describeContents() {
return 0;
}

// read your object's data to the passed-in Parcel
private Player(Parcel in) {
this.PUZZLE_NUM = in.readInt();
this.name = in.readString();
in.readIntArray(this.puzzle);
}

// write your object's data to the passed-in Parcel
public void writeToParcel(Parcel out, int flags) {
out.writeInt(PUZZLE_NUM);
out.writeString(name);
out.writeIntArray(puzzle);
}

// this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public AntcreateFromParcel(Parcel in) {
return new Player(in);
}

public Ant[] newArray(int size) {
return new Player[size];
}
};
}


Для создание объекта класса Player и передачи его через метод «PutExtra»:

Player ant = new Player();
Intent exampleIntent = new Intent();
exampleIntent.setClass(getApplicationContext(), Example.class );
exampleIntent.putExtra("Player", Player);
startActivity(exampleIntent);


Для получения объекта класса Player в другой деятельности (Activity):

public class Example extends Activity {
private Player newPlayer;

@Override
public void onCreate(Bundle savedInstanceState){
Intent exampleIntent= getIntent();
newPlayer = (Player) exampleIntent.getParcelableExtra("Player");
/*Some code*/
}
}


Второй момент, с которым мы столкнулись это затруднение при считывании информации из
<ahref=«developer.android.com/guide/topics/data/data-storage.html#filesInternal»>Internal Storage

Загвоздка таилась в том, что данные, записанные в файл при помощи потока
<ahref=«developer.android.com/reference/java/io/FileOutputStream.html»> FileOutputStream

сохранялись при помощи преобразования символов с помощью метода
<ahref=«developer.android.com/reference/java/lang/String.html#getBytes%28int,%20int,%20byte[],%20int%29»> getBytes

… преобразующего строку в массив байтов. Соответственно при чтении потребовалось считывать каждый символ, преобразовывать в строку, а потом уже конвертировать получившееся численное представление символа в нужное число. Нужны были именно символы, поэтому использовать методы вроде
<ahref=«developer.android.com/reference/java/io/BufferedReader.html#readLine%28%29»> readLine не представляло возможным.

public int[] readData(BufferedReader rdr, int amount){
char s;
int cat[];
cat = new int[amount];
String str="";
try {
for(int i=0;i<amount;i++){
s = (char) rdr.read(); /*Read symbol from rdr*/
str = str + s; /*Convert symbol to string*/
cat[i] = Integer.parseInt(str.toString()); /*Convert string to integer and write in array*/
str = ""; /*Zero str*/
}
} catch (Exception e) {
Log.v("ANT","Exception in readData() " + e );
}
return cat;
}


В остальном же по части кода, первое приложение оказалось не трудной задачей.

Подводя итог, хочется сказать, что глядя на всю проделанную работу, понимаешь, что из заданных в начале вопросов удалось ответить только на два. А именно «за прекрасное» и «за свободу». Последний вопрос «про деньги» остаётся висеть в воздухе. Я отлично понимаю, что мало кто с дебютного приложения имеет коммерческий успех. Но несмотря на это наше приложение “Загадки Да’Вични” неплохо стартовало и, на мой скромный взгляд, вполне оправдало затраченное время. И пусть у нас на счету всего лишь несколько долларов, нас это никак не расстраивает. Единственное, что хотелось бы узнать в рамках этой темы, у зарекомендовавшего себя обилием грамотных и умных людей, сообщества, как сделать свой продукт популярнее?
Таким образом, господа Хабрчане, мой пост превращается в насущный вопрос:
как правильно раскручиваются такие вещи?
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.