воскресенье, 15 ноября 2015 г.

Спрайты и работа с ними
Пишем игру под Андроид

Часто в игре нужно создать объект, который не только перемещается по экрану, но и сам видоизменяется, например, шагающий человек или облако взрыва. Как правило, это делается с помощью покадровой анимации. Суть метода в том, что быстро показываются кадры меняющегося объекта, в результате чего наблюдатель не видит отдельные кадры, только иллюзию меняющегося объекта. Изображения мы сохраняем в формате png с прозрачной основой, что позволяет накладывать изображение объекта на фоновую основу, например, олененок (объект) скачет по дороге (фон).
В нашей игре сначала мы создадим иллюзию вращающегося падающего астероида, а потом анимацию взрыва после удара по базе.

понедельник, 26 октября 2015 г.

Пишем игру для Андроид
Часть шестая «Столкновения»

Столкновения в играх -  это событие, которое должно привести к другому событию. Например, в нашем случае, если  астероид упадет на базу, то должен произойти взрыв, раздаться звук взрыва и произойти изменения в самой картинке базы. Если астероид упал мимо базы, можно ограничиться меньшим взрывом и его звуком.
Столкновение внешне выглядит, как правило, в виде касания или перекрытия объектов, таким образом, в коде мы должны будем сравнивать определенные координаты тел, и делать выводы.
Координаты астероида меняются в методе update класса public class GameView.

воскресенье, 4 октября 2015 г.

Все разговоры о том, что игрушка вышла сложная - неправда! Я только что освободил тигра! Главное - научиться летать с ведром, когда словишь бело-синюю пилюлю! Смайлик «smile» Кстати, мы уже 29 в рейтинге!
Animal Zoo

среда, 23 сентября 2015 г.

среда, 19 августа 2015 г.

Пишем игру для Андроид

Статья пятая. Предварительные настройки и создание лунной базы.

   Вообще-то, планировалось отработать столкновение астероида с базой, но тут я вспомнил, что у нас пока нет самой базы. Астероид летает на голубом фоне, и сталкиваться ему пока не с чем.

   Поэтому было решено создать две картинки лунной базы, которые будут являться фоном.


    Теперь у нас есть, что защищать.

понедельник, 17 августа 2015 г.

Пишем игру для Андроид


Статья четвертая. Игровой цикл.

Очень важно, какой тип игры вы создаете. Так как у нас игра динамическая, нам нужно всё время обновлять картинку на устройстве. Это значит сначала создать её, применив новые координаты объектов, а затем вывести на экран. Наше зрение устроено так, что если мы будем делать это меньше, чем за 0,04 с, то нам будет казаться движение объектов непрерывным. Но объекты могут быть разными по сложности прорисовки, а устройства, на которых вы играете – разными по быстродействию. Может так случиться, что на одних планшетах или мобильниках наше приложение будет «летать», так что пользователь не будет успевать играть, а на других – будет тормозить и глючить так, что пользователь, скорей всего, удалит её со своего устройства. Возникает мысль, проходить один игровой цикл за 0,04с (25 кадров (циклов) в секунду) на всех устройствах. Всё было бы хорошо, если бы все устройства могли это сделать. Представьте, что у вас 10 динамических объектов в игре, которые взаимодействуют между собой, порождая новые объекты, например, взрыв при столкновении, но надо не забыть воспроизводить звуки и реагировать на включения пользователя в игру. Я уже не говорю о реалистичной графике окружающего мира. Что же делать, если наше устройство не успевает в какой-то сцене создать игровой цикл? Решений несколько. Советую вам хорошенько проштудировать эту статью

Кому лень читать на английском, смотрите за вторник, 11 августа 2015 г. мой перевод
«Статья об игровом цикле», автор Koen Witters

Создаем игровой цикл

вторник, 11 августа 2015 г.

Статья об игровом цикле 

автор Koen Witters 

http://www.koonsolo.com/news/dewitters-gameloop/

перевод Валерий Старощук

    Игровой цикл – это сердце любой игры, ни одна игра не может обойтись без него. Но, к сожалению, для начинающих программистов нет хороших статей, которые бы раскрыли эту тему на должном уровне. Но не переживайте, вы только что натолкнулись на статью, которая описывает игровой цикл так, как он этого заслуживает. Благодаря моей работе, как программиста игр, я просмотрел большое количество кода маленьких мобильных игр и всегда поражался, как реализован в них игровой цикл. Вы можете спросить себя, как такая простая вещь, как игровой цикл, может быть реализована по-разному. Однако такое возможно, и я буду обсуждать все за и против самых популярных реализаций, что даст вам (на мой взгляд) оптимальное решение реализации игрового цикла.

Игровой цикл

понедельник, 10 августа 2015 г.

Пишем игру для Андроид

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


Мы отказались от стандартных кнопок Андроида, поэтому нужно иметь собственные изображения кнопки в нерабочем и нажатом состоянии. Я выбрал ненавязчивые кнопки, которые, как мне кажется, будут гармонировать с лунным пейзажем.


 Теперь нужно решить проблему расположения кнопки. Она в том, что на разных экранах наша кнопка должна располагаться примерно в одном и том же месте относительно заднего фона. Я воспользовался методом разметки TableLayout. Фактически мы разобьем экран на 9 прозрачных ячеек (3 строки и 3 столбца). В 8 ячейку вставим изображение светлой кнопки.

Пишем игру для Андроид

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

Мы отказались от стандартных кнопок Андроида, поэтому нужно иметь собственные изображения кнопки в нерабочем и нажатом состоянии. Я выбрал ненавязчивые кнопки, которые, как мне кажется, будут гармонировать с лунным пейзажем.


 Теперь нужно решить проблему расположения кнопки. Она в том, что на разных экранах наша кнопка должна располагаться примерно в одном и том же месте относительно заднего фона. Я воспользовался методом разметки TableLayout. Фактически мы разобьем экран на 9 прозрачных ячеек (3 строки и 3 столбца). В 8 ячейку вставим изображение светлой кнопки.
Но прежде, давайте создадим второе активити, на которое будем переходить при нажатии кнопки. Для этого наведите мышку на папку java, кликните правой кнопкой.

суббота, 8 августа 2015 г.

Пишем игру для Андроид

Часть вторая. Установка оригинальных иконок и заднего фона.

Добавим в наше приложение оригинальные иконки.

Иконки, которые автоматически вставила Андроид Студио, находятся в папке нашего проекта res/mipmap.


 В папке находится 4 файла ic_launcher, в которых располагаются иконки разного размера в пикселях. Например, открыв файл ic_launcher(mdpi), увидим изображение андроида размером 48х48 dpi (Dots per inch (количество точек на дюйм) применяется для указания разрешения изображения). Наша задача заменить иконки на оригинальные. Копируем нашу иконку нужного разрешения и вставляем в эту же папку под тем же именем ic_launcher. (Если вы скачаете мои иконки, то не забудьте в конце убрать цифры, показывающие разрешение иконки).

четверг, 6 августа 2015 г.

Пишем игру для Андроид


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

Закончим статью реальной простенькой игрушкой, которую никто никогда не купит. 

Наша игра будет называться «Moon Base».
Сценарий:
На лунную базу падают астероиды. Базу нужно спасать специальным щитом, передвигая его пальцем по экрану. Если 5 астероидов упадут на базу, то игра будет проиграна, а если выдержите атаку из 30 астероидов, то вы победитель. Никаких переходов на новый уровень в нашей игре не будет. Всё это вы потом можете с легкостью сделать сами, внимательно почитав материал.

суббота, 20 июня 2015 г.

Yра!!!
Появилось наше ПЕРВОЕ ПЛАТНОЕ приложение Dolphin Relax!
Нас скачивают США и Арабские Эмираты!
Стало легко отблагодарить меня, купив версию приложения. :)
Видео к игре пока оставили старое. Дельфинчик уже 3D, без умолку разговаривает, 8 музыкальных треков (7 моих), игра имеет 7 уровней.
Буду благодарен Вам, если рука не дрогнет и сделает репост!
https://play.google.com/store/apps/details?id=com.alf..

воскресенье, 29 марта 2015 г.

Запрет на изменение ориентации экрана 

при повороте планшета или телефона

(нашел в И-нете у разных авторов и оно работает :)) Если Вы автор, дайте знать.


public class LockOrientation
{
Activity act;
public LockOrientation(Activity act)
{
    this.act = act;
}
@SuppressLint("InlinedApi")
public void lock()
{
    switch (act.getResources().getConfiguration().orientation)
    {
        case Configuration.ORIENTATION_PORTRAIT:
            if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO)
            {                    act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            else
            {
                int rotation = act.getWindowManager().getDefaultDisplay().getRotation();
                if (rotation == android.view.Surface.ROTATION_90 || rotation == android.view.Surface.ROTATION_180)
                {
                    act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
                }
                else
                {
                    act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                }
            }
        break;
        case Configuration.ORIENTATION_LANDSCAPE:
            if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO)
            {
                act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
            else
            {
                int rotation = act.getWindowManager().getDefaultDisplay().getRotation();
                if (rotation == android.view.Surface.ROTATION_0 || rotation == android.view.Surface.ROTATION_90)
                {
                    act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                }
                else
                {
                    act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
                }
            }
        break;
    }
}
}
Далее в нужном месте вызываем (например в onCreate()):
protected void onCreate(Bundle savedInstanceState)
{
   super.onCreate(savedInstanceState);

   new LockOrientation(this).lock();
}
Чтобы снять запрет на смену ориентации делаем так:
context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

PS:
С другой стороны, если вам нужен только портретный вариант (как мне), просто пропишите в манифест файле для данного активити строчку
 <activity
            android:screenOrientation="portrait"
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
          


понедельник, 23 марта 2015 г.

Создание покадровой анимации
Суть покадровой анимации прекрасно показана в этой гифке, которую я нашел в И-нете.

Сформулируем задачу.
       На фоне какого-либо изображения, должна происходить покадровая анимация объекта. Я выбрал фоном песок пустыни, а объектом - тарантула, который шевелит ножками.

Приступим...
Этап 1
    Создайте в Android Studio обычный проект, где а экране появится «Hello world!».
Нажимаем Start a new Android Studio project.



Я назвал свой проект
Application name: FrameAnimation.


   В графе Company Domain можете ввести свою почту, но тогда не забудьте исправить имя пакета, если просто будете копировать и вставлять файлы приложения.
Потом установим минимальный SDK.


    В моем случае это API 16: Android 4.1. Студия подсказывает нам, что почти 83% пользователей в мире смогут смотреть наше приложение.
Жмем Next и выбираем по умолчанию Blank Activity.



Осталось немного. :)
Выбираем имя макета (Layout name): main.



Андроид Студио делает сборку приложения по умолчанию.
На экране у меня появилось следующее:



Над картинкой телефона вы видите его марку и версию Андроид. Для быстрой загрузки эмулятора я выбрал вместо телефона планшет (Tablet) и API19: Android 4.4.2.


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

Этап второй. Создаем приложение.
2.1 Сначала нужно загрузить в папку drawable фоновую картинку pesok.png и три файла тарантула, на которых у него разное положение лапок tarantula01.png, tarantula02.png и tarantula03.png. Картинок для анимации может быть сколько угодно, но нужно помнить, что при проигрывании приложение их загружает все в память и при больших объемах картинок, могут возникнуть проблемы. Как всегда, нужно искать компромисс между красотой анимации и быстродействием приложения.
2.2 В той же папке drawable создаем файл tarantula.xml



В поле пустого файла размещаем такой код.



tarantula.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/tarantula01" android:duration="1000"/>
    <item android:drawable="@drawable/tarantula02" android:duration="500"/>
    <item android:drawable="@drawable/tarantula03" android:duration="700"/>
</animation-list>

Как вы видите, это список наших картинок для проигрывания.
Если android:oneshot="false", то анимация будет проигрываться бесконечно. Если "false" заменить на “true”, то один раз.
Устанавливается также время показа картинки в миллисекундах, например:
duration="1000" означает, что картинка будет показываться 1 с.

2.3 Меняем содержимое файла main.xml
main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".MainActivity">

    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/imageView"
        android:layout_centerVertical="true"
        android:scaleType="fitXY"
        android:src="@drawable/pesok"
        android:contentDescription="image_pesok" />
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView1"
            android:layout_gravity="center"
            android:src="@drawable/tarantula"
            android:contentDescription="anim_tarantula"
             />
    </FrameLayout>

</FrameLayout>
На первом FrameLayout выводим через метод ImageView фоновое изображение (android:src="@drawable/pesok"), которое растягиваем на весь экран (android:scaleType="fitXY").
На втором слое размещаем анимацию (android:src="@drawable/tarantula").

2.4. В завершении рассмотрим содержимое файла MainActivity.java
В нем мы изменили класс наследования для  MainActivity, чтобы убрать полоску бара сверху экрана, на котором выводится имя приложения.

MainActivity.java
package com.adc2017gmail.frameanimation;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
2.5 Запускаем в работу приложение, нажав зеленый треугольник вверху меню.
Студия предлагает выбрать эмулятор.

Жмем Ок и ждем пару минут.
В итоге появляется окно с замком.


Тянем замок, зажав левую кнопку мыши, вправо.
Нажимаем иконку нашего приложения (смотри видео) и наблюдаем тарантула, который дергает лапками. 


Вот и сказочке конец.
Буду рад, если найдете в моей статье ошибки, так как сам только начинаю в этом деле разбираться. А, не ошибается, известно кто. :)

PS: При попытке запустить приложение на реальном планшете, наблюдается следующее: анимация не работает. Будем разбираться...

Решение проблемы:
В MainActivity.java допишите код

public class MainActivity extends Activity {

    /*Объявляем метод*/
    AnimationDrawable mAnim;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        /*Запускаем метод ImageView для image, который нашли в R.java*/
        ImageView image1 = (ImageView)findViewById(R.id.imageView1);
       
/* Находим по идентификатору в папке drawable файл tarantula.xml и прикрепляем его, как ресурс к области  image */
        image1.setBackgroundResource(R.drawable.tarantula);
      
    /*В переменную mAnim записываем картинку из ресурса*/
        mAnim = (AnimationDrawable)image1.getBackground();
       
        mAnim.start();
}