DailyToys

На Пикабу
поставил 0 плюсов и 1 минус
Награды:
5 лет на Пикабу
27 рейтинг 1 подписчик 1 подписка 2 поста 0 в горячем

Как мы писали арифметическую головоломку на LibGDX под ведроид. Часть 2

Как  мы писали арифметическую головоломку на LibGDX под ведроид. Часть 2 Игры, Google Play, Головоломка, Логика, Труегольник, Длиннопост, Код, Libgdx

Историю создания и все предисловия вы можете найти в первой части статьи: http://pikabu.ru/story/kak_myi_pisali_arifmeticheskuyu_golov.... В этой статье будет больше конкретики. Хотелось бы рассказать о том, каким образом реализованы уровни в игре, и начнём с основополагающей сущности – треугольника.


С треугольником всё довольно просто. У него есть значение value, которое используется для последующих подсчётов сумы в пунктирной области, также по этому значению выбирается подходящая текстура для актёра. К слову, как и полагается, все текстуры упакованы в атласы. Также, у треугольника есть boolean переменная, которая определяет, скрыт ли треугольник (влияет только на подбор текстуры, если скрыт – текстура со знаком вопроса).

Итак, класс треугольника как он есть:


public class Triangle extends Actor {


public GdxGameCore game;


private int value;

private int placeNumber;

private boolean isHidden;


private TextureAtlas.AtlasRegion texture;


@Override

public void draw(Batch batch, float parentAlpha) {

batch.draw(texture, getX(), getY(), getWidth(), getHeight());

super.draw(batch, parentAlpha);

}


/**

* Конструктор для создания объекта Triangle

* @param value - числовое значение треугольника (0-9)

* @param isHidden - флаг скрытия теугольника (0 - не скрыт, 1- скрыт)

* @param placeNumber - положение треугольника на площадке уровня

*/

public Triangle (int value, boolean isHidden, int placeNumber, GdxGameCore game) {


this.game = game;


this.value = value;

this.isHidden = isHidden;

this.placeNumber = placeNumber;


/*

* Определение текстуры

*/

if (isHidden) {

this.texture = game.hidden;

} else {

switch (value) {

case 0:

this.texture = game.zero;

break;

case 1:

this.texture = game.one;

break;

case 2:

this.texture = game.two;

break;

case 3:

this.texture = game.three;

break;

case 4:

this.texture = game.four;

break;

case 5:

this.texture = game.five;

break;

case 6:

this.texture = game.six;

break;

case 7:

this.texture = game.seven;

break;

case 8:

this.texture = game.eight;

break;

case 9:

this.texture = game.nine;

break;

}

}


}


public boolean isHidden() {

return isHidden;

}


public int getPlaceNumber() {

return placeNumber;

}


public int getValue() {

return value;

}


public TextureAtlas.AtlasRegion getTexture() {

return texture;

}


@Override

public String toString() {

return super.toString();

}

}



Следующим шагом хочу рассказать о кнопке, с помощью которой осуществляется движение группы треугольников (по кругу, в заданном направлении). Класс кнопки также очень прост. У него есть переменная направления движения, с помощью которой мы определяем, в какую сторону прокручивать группу треугольников. По этой же переменной подбирается и текстура актёра.

Собственно, класс кнопки:


public class MoveButton extends Actor{


final GdxGameCore game;


private int direction;

private TextureAtlas.AtlasRegion texture, texturePressed;

private boolean isPressed = false;


@Override

public void draw(Batch batch, float parentAlpha) {

if (!isPressed) {

batch.draw(texture, getX(), getY(), getWidth(), getHeight());

} else {

batch.draw(texturePressed, getX(), getY(), getWidth(), getHeight());

}

super.draw(batch, parentAlpha);

}



/**

* Конструктор кнопки движения

* (Подбирает нужную текстуру и генерирует актёра)

* @param direction - направление (0 - влево, 1 - вправо)

*/

public MoveButton (int direction, GdxGameCore game) {

this.game = game;

this.direction = direction;


if (direction == 0) {

// LEFT BUTTON TEXTURE

this.texture = game.move_left;

this.texturePressed = game.move_left_pressed;

} else {

// RIGHT BUTTON TEXTURE

this.texture = game.move_right;

this.texturePressed = game.move_right_pressed;

}



}


public int getDirection() {

return direction;

}


public void setPressed () {

isPressed = true;

this.act(0.3f);

isPressed = false;

this.act(0.3f);

}


public TextureAtlas.AtlasRegion getTexture() {

return texture;

}


@Override

public String toString() {

return super.toString();

}

}


Далее, хочу рассказать о классе уровня. Класс уровня вмещает в себе конструктор, который создаёт объекты треугольников и кнопок, а также, ограничения на количество движений и времени. В классе есть три различных конструктора под каждую из трёх сложностей. В классе игры (GameScreen) осуществляется работа с объектом Level, что довольно удобно. Особых пояснений, думаю, не требуется, поэтому, просто покажу код:


public class Level {


GdxGameCore game;


private int levelNum;

// HARDNESS 1

private int triangle_1, triangle_2, triangle_3, triangle_4, triangle_5, triangle_6;

private boolean b_hide_1, b_hide_2, b_hide_3, b_hide_4, b_hide_5, b_hide_6;

private int btn_1, btn_2, btn_3; // 0 - LEFT, 1 - RIGHT;

// HARDNESS 2

private int triangle_7, triangle_8, triangle_9, triangle_10;

private int hide_1, hide_2, hide_3, hide_4, hide_5, hide_6;

private int hide_7, hide_8, hide_9, hide_10;

private boolean b_hide_7, b_hide_8, b_hide_9, b_hide_10;

private int btn_4, btn_5, btn_6; // 0 - LEFT, 1 - RIGHT;

// Ограничения

private int time_sec;

private int moves;

private int goal;

private List <Triangle> triangles;

private List <MoveButton> moveButtons;


/**

* HARDNESS EASY

* @param levelNum - номер уровня

* @param triangle_1 - значение треугольника

* @param triangle_2 - значение треугольника

* @param triangle_3 - значение треугольника

* @param triangle_4 - значение треугольника

* @param triangle_5 - значение треугольника

* @param triangle_6 - значение треугольника

* @param time_sec - ограничение во времени в секундах

* @param moves - ограничение в движениях

* @param goal - цель (необходимая сумма в главном треугольнике)

* @param btn_1 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_2 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_3 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param game - основной класс core модуля

*/

public Level (int levelNum, int triangle_1, int triangle_2, int triangle_3, int triangle_4,

int triangle_5, int triangle_6, int time_sec, int moves, int goal, int btn_1, int btn_2,

int btn_3, GdxGameCore game) {

this.game = game;


this.levelNum = levelNum;

this.triangle_1 = triangle_1;

this.triangle_2 = triangle_2;

this.triangle_3 = triangle_3;

this.triangle_4 = triangle_4;

this.triangle_5 = triangle_5;

this.triangle_6 = triangle_6;

this.time_sec = time_sec;

this.moves = moves;

this.goal = goal;

this.btn_1 = btn_1;

this.btn_2 = btn_2;

this.btn_3 = btn_3;


Triangle tr1 = new Triangle(triangle_1, false, 1, game);

Triangle tr2 = new Triangle(triangle_2, false, 2, game);

Triangle tr3 = new Triangle(triangle_3, false, 3, game);

Triangle tr4 = new Triangle(triangle_4, false, 4, game);

Triangle tr5 = new Triangle(triangle_5, false, 5, game);

Triangle tr6 = new Triangle(triangle_6, false, 6, game);


MoveButton mb1 = new MoveButton(btn_1, game);

MoveButton mb2 = new MoveButton(btn_2, game);

MoveButton mb3 = new MoveButton(btn_3, game);


triangles = new ArrayList<Triangle>();

triangles.add(tr1);

triangles.add(tr2);

triangles.add(tr3);

triangles.add(tr4);

triangles.add(tr5);

triangles.add(tr6);


moveButtons = new ArrayList<MoveButton>();

moveButtons.add(mb1);

moveButtons.add(mb2);

moveButtons.add(mb3);



}


/**

* HARDNESS MEDIUM

* @param levelNum - номер уровня

* @param triangle_1 - значение треугольника

* @param triangle_2 - значение треугольника

* @param triangle_3 - значение треугольника

* @param triangle_4 - значение треугольника

* @param triangle_5 - значение треугольника

* @param triangle_6 - значение треугольника

* @param hide_1 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_2 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_3 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_4 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_5 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_6 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param time_sec - ограничение во времени в секундах

* @param moves - ограничение в движениях

* @param goal - цель (необходимая сумма в главном треугольнике)

* @param btn_1 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_2 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_3 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param game - - основной класс core модуля

*/

public Level (int levelNum, int triangle_1, int triangle_2, int triangle_3, int triangle_4,

int triangle_5, int triangle_6, int hide_1, int hide_2, int hide_3, int hide_4,

int hide_5, int hide_6, int time_sec, int moves, int goal, int btn_1, int btn_2,

int btn_3, GdxGameCore game) {


this.game = game;


this.levelNum = levelNum;

this.triangle_1 = triangle_1;

this.triangle_2 = triangle_2;

this.triangle_3 = triangle_3;

this.triangle_4 = triangle_4;

this.triangle_5 = triangle_5;

this.triangle_6 = triangle_6;

this.hide_1 = hide_1;

this.hide_2 = hide_2;

this.hide_3 = hide_3;

this.hide_4 = hide_4;

this.hide_5 = hide_5;

this.hide_6 = hide_6;

this.time_sec = time_sec;

this.moves = moves;

this.goal = goal;

this.btn_1 = btn_1;

this.btn_2 = btn_2;

this.btn_3 = btn_3;


checkHidden(6);


Triangle tr1 = new Triangle(triangle_1, b_hide_1, 1, game);

Triangle tr2 = new Triangle(triangle_2, b_hide_2, 2, game);

Triangle tr3 = new Triangle(triangle_3, b_hide_3, 3, game);

Triangle tr4 = new Triangle(triangle_4, b_hide_4, 4, game);

Triangle tr5 = new Triangle(triangle_5, b_hide_5, 5, game);

Triangle tr6 = new Triangle(triangle_6, b_hide_6, 6, game);


MoveButton mb1 = new MoveButton(btn_1, game);

MoveButton mb2 = new MoveButton(btn_2, game);

MoveButton mb3 = new MoveButton(btn_3, game);


triangles = new ArrayList<Triangle>();

triangles.add(tr1);

triangles.add(tr2);

triangles.add(tr3);

triangles.add(tr4);

triangles.add(tr5);

triangles.add(tr6);


moveButtons = new ArrayList<MoveButton>();

moveButtons.add(mb1);

moveButtons.add(mb2);

moveButtons.add(mb3);

}


/**

* HARDNESS HARD

* @param levelNum - номер уровня

* @param triangle_1 - значение треугольника

* @param triangle_2 - значение треугольника

* @param triangle_3 - значение треугольника

* @param triangle_4 - значение треугольника

* @param triangle_5 - значение треугольника

* @param triangle_6 - значение треугольника

* @param triangle_7 - значение треугольника

* @param triangle_8 - значение треугольника

* @param triangle_9 - значение треугольника

* @param triangle_10 - значение треугольника

* @param hide_1 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_2 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_3 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_4 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_5 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_6 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_7 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_8 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_9 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param hide_10 - флаг скрытия треугольника (0 - не скрыт, 1 - скрыт)

* @param time_sec - ограничение во времени в секундах

* @param moves - ограничение в движениях

* @param goal - цель (необходимая сумма в главном треугольнике)

* @param btn_1 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_2 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_3 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_4 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_5 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param btn_6 - флаг кнопки движения (0 - влево, 1 - вправо)

* @param game - основной класс core модуля

*/

public Level (int levelNum, int triangle_1, int triangle_2, int triangle_3, int triangle_4,

int triangle_5, int triangle_6, int triangle_7, int triangle_8, int triangle_9,

int triangle_10, int hide_1, int hide_2, int hide_3, int hide_4, int hide_5,

int hide_6, int hide_7, int hide_8, int hide_9, int hide_10, int time_sec,

int moves, int goal, int btn_1, int btn_2, int btn_3, int btn_4, int btn_5,

int btn_6, GdxGameCore game) {


this.game = game;


this.levelNum = levelNum;

this.triangle_1 = triangle_1;

this.triangle_2 = triangle_2;

this.triangle_3 = triangle_3;

this.triangle_4 = triangle_4;

this.triangle_5 = triangle_5;

this.triangle_6 = triangle_6;

this.triangle_7 = triangle_7;

this.triangle_8 = triangle_8;

this.triangle_9 = triangle_9;

this.triangle_10 = triangle_10;

this.hide_1 = hide_1;

this.hide_2 = hide_2;

this.hide_3 = hide_3;

this.hide_4 = hide_4;

this.hide_5 = hide_5;

this.hide_6 = hide_6;

this.hide_7 = hide_7;

this.hide_8 = hide_8;

this.hide_9 = hide_9;

this.hide_10 = hide_10;

this.time_sec = time_sec;

this.moves = moves;

this.goal = goal;

this.btn_1 = btn_1;

this.btn_2 = btn_2;

this.btn_3 = btn_3;

this.btn_4 = btn_4;

this.btn_5 = btn_5;

this.btn_6 = btn_6;


checkHidden(10);


Triangle tr1 = new Triangle(triangle_1, b_hide_1, 1, game);

Triangle tr2 = new Triangle(triangle_2, b_hide_2, 2, game);

Triangle tr3 = new Triangle(triangle_3, b_hide_3, 3, game);

Triangle tr4 = new Triangle(triangle_4, b_hide_4, 4, game);

Triangle tr5 = new Triangle(triangle_5, b_hide_5, 5, game);

Triangle tr6 = new Triangle(triangle_6, b_hide_6, 6, game);

Triangle tr7 = new Triangle(triangle_7, b_hide_7, 7, game);

Triangle tr8 = new Triangle(triangle_8, b_hide_8, 8, game);

Triangle tr9 = new Triangle(triangle_9, b_hide_9, 9, game);

Triangle tr10 = new Triangle(triangle_10, b_hide_10, 10, game);


MoveButton mb1 = new MoveButton(btn_1, game);

MoveButton mb2 = new MoveButton(btn_2, game);

MoveButton mb3 = new MoveButton(btn_3, game);

MoveButton mb4 = new MoveButton(btn_4, game);

MoveButton mb5 = new MoveButton(btn_5, game);

MoveButton mb6 = new MoveButton(btn_6, game);


triangles = new ArrayList<Triangle>();

triangles.add(tr1);

triangles.add(tr2);

triangles.add(tr3);

triangles.add(tr4);

triangles.add(tr5);

triangles.add(tr6);

triangles.add(tr7);

triangles.add(tr8);

triangles.add(tr9);

triangles.add(tr10);


moveButtons = new ArrayList<MoveButton>();

moveButtons.add(mb1);

moveButtons.add(mb2);

moveButtons.add(mb3);

moveButtons.add(mb4);

moveButtons.add(mb5);

moveButtons.add(mb6);

}


/**

* Переобразование значений 1 & 0 в тип boolean для создания объектов треугольников

* @param triangleQuantity - кол-во треугольников на площадке уровня

*/

public void checkHidden (int triangleQuantity) {

if (triangleQuantity == 6) {

// HARDNESS MEDIUM

if (hide_1 == 0) {

b_hide_1 = false;

} else {

b_hide_1 = true;

}

if (hide_2 == 0) {

b_hide_2 = false;

} else {

b_hide_2 = true;

}

if (hide_3 == 0) {

b_hide_3 = false;

} else {

b_hide_3 = true;

}

if (hide_4 == 0) {

b_hide_4 = false;

} else {

b_hide_4 = true;

}

if (hide_5 == 0) {

b_hide_5 = false;

} else {

b_hide_5 = true;

}

if (hide_6 == 0) {

b_hide_6 = false;

} else {

b_hide_6 = true;

}

} else {

// HARDNESS HARD

if (hide_1 == 0) {

b_hide_1 = false;

} else {

b_hide_1 = true;

}

if (hide_2 == 0) {

b_hide_2 = false;

} else {

b_hide_2 = true;

}

if (hide_3 == 0) {

b_hide_3 = false;

} else {

b_hide_3 = true;

}

if (hide_4 == 0) {

b_hide_4 = false;

} else {

b_hide_4 = true;

}

if (hide_5 == 0) {

b_hide_5 = false;

} else {

b_hide_5 = true;

}

if (hide_6 == 0) {

b_hide_6 = false;

} else {

b_hide_6 = true;

}

if (hide_7 == 0) {

b_hide_7 = false;

} else {

b_hide_7 = true;

}

if (hide_8 == 0) {

b_hide_8 = false;

} else {

b_hide_8 = true;

}

if (hide_9 == 0) {

b_hide_9 = false;

} else {

b_hide_9 = true;

}

if (hide_10 == 0) {

b_hide_10 = false;

} else {

b_hide_10 = true;

}

}

}


public int getLevelNum() {

return levelNum;

}


public int getGoal() {

return goal;

}


public int getMoves() {

return moves;

}


public int getTime_sec() {

return time_sec;

}


public List<Triangle> getTriangles() {

return triangles;

}


public List<MoveButton> getMoveButtons() {

return moveButtons;

}


@Override

public String toString() {

return super.toString();

}

}



В данном методе происходит перемещение треугольников, происходит оно по нажатию на определенную кнопку, которая передает треугольники которые стоят возле неё.

Мы запоминаем координаты треугольников и потом меняем их местами.

После этого они еще меняются местами в массиве, при помощи Коллекций.



public void swapTrianglesLeft(Triangle triangle1, Triangle triangle2, Triangle triangle3){



// sound


game.playMoveSound();



float tr1X, tr1Y, tr2X, tr2Y, tr3X, tr3Y;


tr1X = triangle1.getX();


tr1Y = triangle1.getY();


tr2X = triangle2.getX();


tr2Y = triangle2.getY();


tr3X = triangle3.getX();


tr3Y = triangle3.getY();


triangle1.addAction(Actions.moveTo(tr3X, tr3Y, 0.5f));


triangle2.addAction(Actions.moveTo(tr1X, tr1Y, 0.5f));


triangle3.addAction(Actions.moveTo(tr2X, tr2Y, 0.5f));


}



Надеюсь, эта статья была более конструктивной, чем предыдущая, и интересно дополнила её. Спасибо за внимание, ставьте плюсик, если понравилось и, конечно же, всем добра :)


Ссылка на Play Market: https://play.google.com/store/apps/details?id=com.dailytoys....

Показать полностью

Как мы писали арифметическую головоломку на LibGDX для ведроида.

Trizzler


Предисловие.

После не особо удачного запуска предыдущего проекта (о причинах чуть ниже), который относился к категории Аркады, мы с приятелем решили взяться за разработку нового проекта. И проектом этим стала арифметическая головоломка. Идея игры пришла совершенно случайно, когда от нечего делать на парах я, как истинный хипстер (шутка), рисовал на листике в клетку треугольники, выстраивая из них пирамиду. Потом, по той же причине (скучного провождения времени), пронумеровал треугольники. Таким образом, собственно, и пришла идея сделать из этого игру. Правила игры довольно просты: передвигайте треугольники таким образом, чтобы сумма чисел, изображённых на треугольниках в пунктирной области, была равна заданному числу. При этом необходимо уложиться в лимит времени и движений.

Как мы писали арифметическую головоломку на LibGDX для ведроида. Игры, Google Play, Головоломка, Логика, Треугольник, Длиннопост

Хорошенько (но видимо, не так как хотелось бы) проанализировав причины падения предыдущего проекта, мы взялись за написание нового, и главное задание: не повторять ошибок.

Ошибки предыдущего проекта:


1) Этот проект был учебным. Не могу сказать, что это ошибка, но это главная причина его падения. В момент его разработки мы на недостаточном уровне понимали основные принципы ООП и всё делалось в первый раз.


2) Дизайн игры изначально был разработан не самым лучшим образом, нарушая все возможные каноны проектирования.


3) В силу неглубоких познаний фреймворка LibGDX, в приложении время от времени наблюдались краши.


4) Старт у «раскрутки» после добавления на Google Play был, мягко говоря, плохим. Популярности игра так и не набрала, навсегда пропав из ТОПов.



Шаг первый. Создание концепта и дизайна.



Учитывая тот факт, что во мне умер художник (при чём, не родившись), всё, начиная от концепта и заканчивая текстурами, пришлось делать с помощью PowerPoint. Да-да, того самого инструмента для создания презентаций, это не опечатка. Дело всё в том, что так уж сложилось, что работать с этим инструментом мне доводилось частенько и в PowerPoint чувствую себя как рыба в воде. А если добавить к этому моё отсутствие здравого смысла и немного терпения, то выходит, что PP оказался очень даже неплохим средством для создания текстур. Ну а что? Тени там есть, фигур предостаточно, при желании можно из точек нарисовать собственную фигуру, в итоге, если постараться, выходит довольно-таки адекватный результат. Ни в коем случае не подумайте, что я рекомендую использовать для подобных целей PP – это глупо. Но, тем не менее, это было самым быстрым решением для меня.


Таким образом, появился концепт игры, а затем и текстуры. Что из этого получилось – судить вам.

Как мы писали арифметическую головоломку на LibGDX для ведроида. Игры, Google Play, Головоломка, Логика, Треугольник, Длиннопост

Шаг второй. Написание кода

Мы распределили работу следующим образом: один из нас занимался UI, DB и лвлами, второй – механикой и, собственно, игровыми экранами.


То, что происходило дальше – нельзя назвать командной работой. То есть, работа была как раз-таки командная, но её методы удручали. В силу того, что нам лень было искать и настраивать инструмент для этих целей, все «коммиты» мы делали по средствам Google Drive. То есть, просто загружали туда архив с проектом с последними изменениями. Таким вот «гениальным» способом мы и делились нововведениями и правками. Для мелких правок использовали Pastebin. #VCSненужны


В конечном итоге была разработана система классов, которые показали неплохой результат (учитывая, что это первый, так сказать, «сознательный» проект). Если сравнивать с предыдущим нашим проектом, то код стал чище, логичнее, объектно-ориентирование. Чему мы были рады.

Как мы писали арифметическую головоломку на LibGDX для ведроида. Игры, Google Play, Головоломка, Логика, Треугольник, Длиннопост

Шаг третий. Добавление Google Play Games и ачивок

Какая же игра без ачивок? Было принято решение добавить их по средствам сервиса Google Play Games.


Естественно, без проблем здесь не обошлось. Но туториалы от знающих ребят сделали своё дело, и сервисы были прикреплены.



Шаг четвёртый. Мечты о монетизации


Для монетизации был выбран медиатор Appodeal, который предложил гибкие настройки своего СДК прямо на официальном сайте. Но, выбрав в их мастере фреймворк LibGDX, проследовав их инструкциям по прикручиванию СДК в проект и первой попытке билда, пришлось делать откат всех изменений. А причиной тому стал бесконечный билд. После получасового ожидания, пока проект сбилдится, нервишки сдали, процесс был остановлен и пришлось прикручивать SDK как для нативного проекта. После чего был сделан интерфейс в core модуле, который реализовался в модуле android и подгружал рекламу.



Шаг пятый. Релиз на Google Play


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



Послесловие.


Закончив второй проект, и сделав его ровно так, как планировали, есть смысл двигаться дальше. Стало понятно, что нужен художник и человек, занимающийся пиаром. В общем и целом можно отметить, что данный род деятельности очень и очень перспективен, если не стоять на месте и развиваться. Единственным камнем преткновения является материальная сторона – средства на поднятие проекта с колен в маркете нужно иметь ещё до публикации релиза. Нет, можно, конечно, обратиться к издателям, но это уже совсем другая история.



Всем добра :)


Google Play :  https://play.google.com/store/apps/details?id=com.dailytoys....

Показать полностью 3
Отличная работа, все прочитано!