Как создать игру на Андроид с нуля — осваиваем азы гейм девелопмента. Программы для создания игр Конструктор 2d игр на русском

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

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

Какой движок использовать?

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

Чтобы сберечь ваше время и помочь выбрать подходящую программу, мы собрали лучшие движки для создания 2D игр, в один каталог. Здесь вы можете ознакомиться с подробным описанием, посмотреть скриншоты и видеоуроки. Сделать правильный выбор вам помогут отзывы пользователей и рейтинг материалов. Скачивайте подходящие программы для создания 2D игр, через торрент или файлообменные сервисы (MEGA или Яндекс.Диск).



Этот туториал предназначен в первую очередь для новичков в разработке под андроид, но может быть будет полезен и более опытным разработчикам. Тут рассказано как создать простейшую 2D игру на анроиде без использования каких-либо игровых движков. Для этого я использовал Android Studio, но можно использовать любую другую соответствующее настроенную среду разработки.

Шаг 1. Придумываем идею игры
Для примера возьмём довольно простую идею:

Внизу экрана - космический корабль. Он может двигаться влево и вправо по нажатию соответствующих кнопок. Сверху вертикально вниз движутся астероиды. Они появляются по всей ширине экрана и двигаются с разной скоростью. Корабль должен уворачиваться от метеоритов как можно дольше. Если метеорит попадает в него - игра окончена.


Шаг 2. Создаём проект
В Android Studio в верхнем меню выбираем File > New > New Project.

Тут вводим название приложения, домен и путь. Нажимаем Next.

Тут можно ввести версию андроид. Также можно выбрать андроид часы и телевизор. Но я не уверен что наше приложение на всём этом будет работать. Так что лучше введите всё как на скриншоте. Нажимаем Next.

Тут обязательно выбираем Empty Activity. И жмём Next.

Тут оставляем всё как есть и жмём Finish. Итак проект создан. Переходим ко третьему шагу.

Шаг 3. Добавляем картинки

Шаг 5. Редактируем MainActivity класс

В первую очередь в определение класса добавляем implements View.OnTouchListener. Определение класса теперь будет таким:

Public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
Добавим в класс нужные нам статические переменные (переменные класса):

Public static boolean isLeftPressed = false; // нажата левая кнопка public static boolean isRightPressed = false; // нажата правая кнопка
В процедуру protected void onCreate(Bundle savedInstanceState) {
добавляем строки:

GameView gameView = new GameView(this); // создаём gameView LinearLayout gameLayout = (LinearLayout) findViewById(R.id.gameLayout); // находим gameLayout gameLayout.addView(gameView); // и добавляем в него gameView Button leftButton = (Button) findViewById(R.id.leftButton); // находим кнопки Button rightButton = (Button) findViewById(R.id.rightButton); leftButton.setOnTouchListener(this); // и добавляем этот класс как слушателя (при нажатии сработает onTouch) rightButton.setOnTouchListener(this);
Классы LinearLayout, Button и т.д. подсвечены красным потому что ещё не добавлены в Import.
Чтобы добавить в Import и убрать красную подсветку нужно для каждого нажать Alt+Enter.
GameView будет подсвечено красным потому-что этого класса ещё нет. Мы создадим его позже.

Теперь добавляем процедуру:

Public boolean onTouch(View button, MotionEvent motion) { switch(button.getId()) { // определяем какая кнопка case R.id.leftButton: switch (motion.getAction()) { // определяем нажата или отпущена case MotionEvent.ACTION_DOWN: isLeftPressed = true; break; case MotionEvent.ACTION_UP: isLeftPressed = false; break; } break; case R.id.rightButton: switch (motion.getAction()) { // определяем нажата или отпущена case MotionEvent.ACTION_DOWN: isRightPressed = true; break; case MotionEvent.ACTION_UP: isRightPressed = false; break; } break; } return true; }
Если кто-то запутался? вот так в результате должен выглядеть MainActivity класс:

Package com.spaceavoider.spaceavoider; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity implements View.OnTouchListener { public static boolean isLeftPressed = false; // нажата левая кнопка public static boolean isRightPressed = false; // нажата правая кнопка @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GameView gameView = new GameView(this); // создаём gameView LinearLayout gameLayout = (LinearLayout) findViewById(R.id.gameLayout); // находим gameLayout gameLayout.addView(gameView); // и добавляем в него gameView Button leftButton = (Button) findViewById(R.id.leftButton); // находим кнопки Button rightButton = (Button) findViewById(R.id.rightButton); leftButton.setOnTouchListener(this); // и добавляем этот класс как слушателя (при нажатии сработает onTouch) rightButton.setOnTouchListener(this); } public boolean onTouch(View button, MotionEvent motion) { switch(button.getId()) { // определяем какая кнопка case R.id.leftButton: switch (motion.getAction()) { // определяем нажата или отпущена case MotionEvent.ACTION_DOWN: isLeftPressed = true; break; case MotionEvent.ACTION_UP: isLeftPressed = false; break; } break; case R.id.rightButton: switch (motion.getAction()) { // определяем нажата или отпущена case MotionEvent.ACTION_DOWN: isRightPressed = true; break; case MotionEvent.ACTION_UP: isRightPressed = false; break; } break; } return true; } }
Итак, класс MainActivity готов! В нём инициирован ещё не созданный класс GameView. И когда нажата левая кнопка - статическая переменная isLeftPressed = true, а когда правая - isRightPressed = true. Это в общем то и всё что он делает.

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

Шаг 6. Создаём класс GameView

Теперь наконец-то создадим тот самый недостающий класс GameView. Итак приступим. В определение класса добавим extends SurfaceView implements Runnable. Мобильные устройства имею разные разрешения экрана. Это может быть старенький маленький телефон с разрешением 480x800, или большой планшет 1800x2560. Для того чтобы игра выглядела на всех устройствах одинаково я поделил экран на 20 частей по горизонтали и 28 по вертикали. Полученную единицу измерения я назвал юнит. Можно выбрать и другие числа. Главное чтобы отношение между ними примерно сохранялось, иначе изображение будет вытянутым или сжатым.

Public static int maxX = 20; // размер по горизонтали public static int maxY = 28; // размер по вертикали public static float unitW = 0; // пикселей в юните по горизонтали public static float unitH = 0; // пикселей в юните по вертикали
unitW и unitW мы вычислим позже. Также нам понадобятся и другие переменные:

Private boolean firstTime = true; private boolean gameRunning = true; private Ship ship; private Thread gameThread = null; private Paint paint; private Canvas canvas; private SurfaceHolder surfaceHolder;
Конструктор будет таким:

Public GameView(Context context) { super(context); //инициализируем обьекты для рисования surfaceHolder = getHolder(); paint = new Paint(); // инициализируем поток gameThread = new Thread(this); gameThread.start(); }
Метод run() будет содержать бесконечный цикл. В начале цикла выполняется метод update()
который будет вычислять новые координаты корабля. Потом метод draw() рисует корабль на экране. И в конце метод control() сделает паузу на 17 миллисекунд. Через 17 миллисекунд run() запустится снова. И так до пока переменная gameRunning == true. Вот эти методы:

@Override public void run() { while (gameRunning) { update(); draw(); control(); } } private void update() { if(!firstTime) { ship.update(); } } private void draw() { if (surfaceHolder.getSurface().isValid()) { //проверяем валидный ли surface if(firstTime){ // инициализация при первом запуске firstTime = false; unitW = surfaceHolder.getSurfaceFrame().width()/maxX; // вычисляем число пикселей в юните unitH = surfaceHolder.getSurfaceFrame().height()/maxY; ship = new Ship(getContext()); // добавляем корабль } canvas = surfaceHolder.lockCanvas(); // закрываем canvas canvas.drawColor(Color.BLACK); // заполняем фон чёрным ship.drow(paint, canvas); // рисуем корабль surfaceHolder.unlockCanvasAndPost(canvas); // открываем canvas } } private void control() { // пауза на 17 миллисекунд try { gameThread.sleep(17); } catch (InterruptedException e) { e.printStackTrace(); } }
Обратите внимание на инициализацию при первом запуске. Там мы вычисляем количество пикселей в юните и добавляем корабль. Корабль мы ещё не создали. Но прежде мы создадим его родительский класс.

Шаг 7. Создаём класс SpaceBody

Он будет родительским для класса Ship (космический корабль) и Asteroid (астероид). В нём будут содержаться все переменные и методы общие для этих двух классов. Добавляем переменные:

Protected float x; // координаты protected float y; protected float size; // размер protected float speed; // скорость protected int bitmapId; // id картинки protected Bitmap bitmap; // картинка
и методы

Void init(Context context) { // сжимаем картинку до нужных размеров Bitmap cBitmap = BitmapFactory.decodeResource(context.getResources(), bitmapId); bitmap = Bitmap.createScaledBitmap(cBitmap, (int)(size * GameView.unitW), (int)(size * GameView.unitH), false); cBitmap.recycle(); } void update(){ // тут будут вычисляться новые координаты } void drow(Paint paint, Canvas canvas){ // рисуем картинку canvas.drawBitmap(bitmap, x*GameView.unitW, y*GameView.unitH, paint); }
Шаг 8. Создаём класс Ship

Теперь создадим класс Ship (космический корабль). Он наследует класс SpaceBody поэтому в определение класа добавим extends SpaceBody.

Напишем конструктор:

Public Ship(Context context) { bitmapId = R.drawable.ship; // определяем начальные параметры size = 5; x=7; y=GameView.maxY - size - 1; speed = (float) 0.2; init(context); // инициализируем корабль }
и переопределим метод update()

@Override public void update() { // перемещаем корабль в зависимости от нажатой кнопки if(MainActivity.isLeftPressed && x >= 0){ x -= speed; } if(MainActivity.isRightPressed && x <= GameView.maxX - 5){ x += speed; } }
На этом космический корабль готов! Всё компилируем и запускаем. На экране должен появиться космический корабль. При нажатии на кнопки он должен двигаться вправо и влево. Теперь добавляем сыплющиеся сверху астероиды. При столкновении с кораблём игра заканчивается.

Шаг 9. Создаём класс Asteroid

Добавим класс Asteroid (астероид). Он тоже наследует класс SpaceBody поэтому в определение класса добавим extends SpaceBody.

Добавим нужные нам переменные:

Private int radius = 2; // радиус private float minSpeed = (float) 0.1; // минимальная скорость private float maxSpeed = (float) 0.5; // максимальная скорость
Астероид должен появляться в случайной точке вверху экрана и лететь вниз с случайной скоростью. Для этого x и speed задаются при помощи генератора случайных чисел в его конструкторе.

Public Asteroid(Context context) { Random random = new Random(); bitmapId = R.drawable.asteroid; y=0; x = random.nextInt(GameView.maxX) - radius; size = radius*2; speed = minSpeed + (maxSpeed - minSpeed) * random.nextFloat(); init(context); }
Астероид должен двигаться с определённой скорость вертикально вниз. Поэтому в методе update() прибавляем к координате x скорость.

@Override public void update() { y += speed; }
Так же нам нужен будет метод определяющий столкнулся ли астероид с кораблём.

Public boolean isCollision(float shipX, float shipY, float shipSize) { return !(((x+size) < shipX)||(x > (shipX+shipSize))||((y+size) < shipY)||(y > (shipY+shipSize))); }
Рассмотрим его поподробнее. Для простоты считаем корабль и астероид квадратами. Тут я пошёл от противного. То есть определяю когда квадраты НЕ пересекаются.

((x+size) < shipX) - корабль слева от астероида.
(x > (shipX+shipSize)) - корабль справа от астероида.
((y+size) < shipY) - корабль сверху астероида.
(y > (shipY+shipSize)) - корабль снизу астероида.

Между этими четырьмя выражениями стоит || (или). То есть если хоть одно выражение правдиво (а это значит что квадраты НЕ пересекаются) - результирующие тоже правдиво.

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

Про определение пересечения более сложных фигур можно почитать .

Шаг 10. Добавляем астероиды в GameView

В GameView добавляем переменные:

Private ArrayList asteroids = new ArrayList<>(); // тут будут харанится астероиды private final int ASTEROID_INTERVAL = 50; // время через которое появляются астероиды (в итерациях) private int currentTime = 0;
также добавляем 2 метода:

Private void checkCollision(){ // перебираем все астероиды и проверяем не касается ли один из них корабля for (Asteroid asteroid: asteroids) { if(asteroid.isCollision(ship.x, ship.y, ship.size)){ // игрок проиграл gameRunning = false; // останавливаем игру // TODO добавить анимацию взрыва } } } private void checkIfNewAsteroid(){ // каждые 50 итераций добавляем новый астероид if(currentTime >= ASTEROID_INTERVAL){ Asteroid asteroid = new Asteroid(getContext()); asteroids.add(asteroid); currentTime = 0; }else{ currentTime ++; } }
И в методе run() добавляем вызовы этих методов перед вызовоом control().

@Override public void run() { while (gameRunning) { update(); draw(); checkCollision(); checkIfNewAsteroid(); control(); } }
Далее в методе update() добавляем цикл который перебирает все астероиды и вызывает у них метод update().

Private void update() { if(!firstTime) { ship.update(); for (Asteroid asteroid: asteroids) { asteroid.update(); } } }
Такой же цикл добавляем и в метод draw().

Private void draw() { if (surfaceHolder.getSurface().isValid()) { //проверяем валидный ли surface if(firstTime){ // инициализация при первом запуске firstTime = false; unitW = surfaceHolder.getSurfaceFrame().width()/maxX; // вычисляем число пикселей в юните unitH = surfaceHolder.getSurfaceFrame().height()/maxY; ship = new Ship(getContext()); // добавляем корабль } canvas = surfaceHolder.lockCanvas(); // закрываем canvas canvas.drawColor(Color.BLACK); // заполняем фон чёрным ship.drow(paint, canvas); // рисуем корабль for(Asteroid asteroid: asteroids){ // рисуем астероиды asteroid.drow(paint, canvas); } surfaceHolder.unlockCanvasAndPost(canvas); // открываем canvas } }
Вот и всё! Простейшая 2D игра готова. Компилируем, запускаем и смотрим что получилось!
Если кто-то запутался или что-то не работает можно скачать исходник .

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

На этом всё. Пишите отзывы, вопросы, интересующие вас темы для продолжения.

Воплощайте свои идеи в жизнь всего за пару часов или дней вместо долгих недель и месяцев. Создание игр в Construct 2 очень легкое и увлекательное: просто перетаскивайте объекты, добавляйте к ним поведения и оживляйте всё это с помощью событий!

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

Редактор уровня полностью визуальный и построен по принципу WYSIWYG, что позволяет легко строить уровни и сразу видеть результат. Вы можете перетаскивать, вращать и масштабировать объекты, визуализировать эффекты и быстро менять их настройки на панели свойств. Объекты можно располагать на отдельных слоях, что позволяет создавать параллакс и смешивающие эффекты. Также в программе есть встроенный редактор изображений для быстрого редактирования графики в игре.

Мощная система событий

Сделайте свою игру такой, какой хотите видеть, используя простую и достаточно мощную визуальную систему событий. Больше не нужно изучать сложные и непонятные языки программирования. С событиями создание логики становится интуитивно понятным даже для новичка.

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

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

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

Продвинутая логика событий - условия OR/Else, под-события, локальные переменные и рекурсивные функции - позволяют создавать сложные системы без изучения более трудного языка программирования.

Гибкие поведения


Поведения работают как заранее предустановленные функции, которые вы можете назначать объектам и использовать их повторно, где это необходимо. Их добавление к объекту происходит мгновенно, что заметно ускоряет разработку игры и повышает вашу производительность.

Поведения включают в себя движения, такие как 8 направлений, платформер, машина, пуля; расширенные функции типа физики и нахождения объектом пути; и разные полезные утилиты, например, затухание, вспышка, обертывание, прикрепление и перетаскивание мышью.

Большинство поведений могут быть воспроизведены с помощью событий, однако их создание с нуля займет гораздо больше времени. Вот почему поведения могут сэкономить много времени, при этом не ограничивая вас в дальнейшей разработке.

Например, добавив поведение Platform (Платформер) к спрайту, он сразу сможет бегать и прыгать по платформам, имеющим свойство Solid (Твердый). Если необходимо, вы можете настраивать скорость, высоту прыжка, гравитацию и т.д. до тех пор, пока не получите желанный результат.

Благодаря простоте использования, поведения прекрасно подходят для новичков, которые могут применить их и получить мгновенный результат. Однако для опытных пользователей они также делают разработку намного проще. Хотите, например, чтобы объект двигался и вращался вместе с другим объектом? Просто добавьте поведение Pin (Прикрепить)! Это в буквальном смысле занимает всего несколько секунд и не вызывает никаких сложностей.

Мгновенный предпросмотр


В Construct 2 вы в любое время можете делать мгновенный предпросмотр ваших игр. Не нужно ждать компиляции или других трудоемких процессов. Нажатием всего одной кнопки игра сразу же запускается в окне браузера и готова для тестирования.

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

Еще одна удобная функция - это предпросмотр через Wifi. Она позволяет любым смартфонам, планшетам, ноутбукам и даже другим ПК подсоединяться к вам посредством LAN/Wifi. Это делает Construct 2 чрезвычайно удобным для тестирования игр на разных устройствах, таких как планшеты и телефоны!

Нет никаких ограничений на количество устройств, используемых для предпросмотра через LAN/Wifi - вы можете иметь несколько устройств одновременно и обновлять их в одно и то же время, что позволяет быстро тестировать игру сразу на многих платформах. Эта функция также неоценима, если необходимо быстро проверить, работают ли события прикосновения на устройствах с сенсорными экранами.

Красивые спецэффекты


Используйте различные режимы наложения, эффекты и системы частиц, чтобы ваши игры выглядели не просто хорошо, а потрясающе!

Программа имеет более 70 эффектов WebGL, среди которых деформация, искажение, смешивание, размытие, изменение цвета и т.д. Эффекты можно добавлять к объектам, слоям и уровням, а также совмещать их для достижения классных результатов. Более того, вы можете видеть всё, что применяете, прямо в редакторе в реальном времени.

Construct 2 также дает возможность настроить альтернативный вариант, если эффекты где-то не поддерживаются, чтобы у игрока не испортилось впечатление от вашей игры. Например, WebGL эффект Screen (Экран) можно заменить режимом наложения Additive (Добавление), когда компьютер игрока не поддерживает его, что позволяет предоставить игрокам наилучший опыт при самых разных аппаратных и системных конфигурациях.

Другая удобная функция - это плагин Particles (Частицы). Он работает путем создания и перемещения большого количества мелких изображений, легко генерируя брызги, искры, дым, воду, мусор и всё, что вы только сможете придумать. Это действительно универсальный объект, способный создавать много различных видов визуальных эффектов.

Мультиплатформенный экспорт

Публикуйте свои игры на самых разных платформах, используя всего один проект. Нет необходимости поддерживать несколько кодовых баз. Используя основанный на HTML5 движок Construct 2, вы можете экспортировать свои игры на большинство крупных платформ.

Выкладывайте игры в интернете на своем собственном сайте, Chrome Web Store, Facebook, Kongregate, NewGrounds, Firefox Marketplace или используйте Scirra Arcade, чтобы делиться своими творениями. Экспортируйте как приложение на PC, Mac или Linux, используя Node-Webkit. Кроме того, есть возможность сделать проект для Windows 8 Store или выпустить его как оригинальное Windows Phone 8 приложение.

Также вы легко можете делать экспорт на такие популярные платформы как iOS и Android, используя сервисы CocoonJS, appMobi и PhoneGap - все три имеют встроенную поддержку, так что выбирайте какой больше нравится.

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

Легкая расширяемость

Construct 2 поставляется с 30 встроенными плагинами, 25 поведениями и 70 визуальными эффектами. Они затрагивают как отображение текста и спрайтов, звуки, воспроизведение музыки, так и ввод, обработку и хранение данных, эффекты частиц, готовые движения, Photoshop-подобные эффекты и многое другое.

Если вы опытный пользователь и нуждаетесь в дополнительной функциональности, Construct 2 позволяет создавать свои собственные плагины и поведения с помощью Javascript SDK, к которому имеется полная документация. Вы также можете создавать свои собственные визуальные эффекты с помощью GLSL языка шейдеров.

Энтузиасты сообщества Construct 2 написали уже более 150 своих плагинов и поведений. Это действительно легко, нет необходимости в каких-либо специальных инструментах! Всё, что вам нужно, это текстовый редактор и немного знаний JavaScript или GLSL. Это также отличное начало пути в мир реального программирования для ваших игр.

  • Разработка под Android ,
  • Unity
  • Введение

    Прежде всего, хочу сразу отметить, что я не являюсь профессиональным разработчиком. В этой статье я постараюсь изложить свой опыт создания игры «Feel Speed Racing». Данный материал, скорее всего не будет интересен тем, кто уже имеет большой опыт в разработке игр, но начинающим разработчикам, которые хоть немного работали с Unity думаю, будет интересно.

    Дизайн

    Концепция игры заключается в том, что автомобиль должен пройти, как можно большее расстояние при этом на дороге динамически появляются препятствия их надо объезжать мимо иначе «игра окончена» еще нужно следить за шкалой топлива и собирать на дороге топливные баки, по истечению которой игра тоже останавливается.

    Разработка

    Игра состоит из 2-х сцен: главное меню и сама игровая сцена:

    Где «menu» это главное меню а «1» это игровая сцена.

    Главное меню


    Для создания столь незамысловатого меню нам потребуется элемент управления GUI, который является стандартным в Unity.

    В качестве фона я использовал спрайт с именем «background» заполненный серым цветом. Вы же можете выбрать что угодно.

    Содержимое скрипта:

    Using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization.Formatters.Binary; using System.IO; public class menu: MonoBehaviour { public GUIStyle mystyle; //объявляется для того чтобы изменять начертание GUI компонентов(шрифт, размер и.т.п.) string score; //переменная для хранения пройденной дистанции void Start () { StreamReader scoredata = new StreamReader (Application.persistentDataPath + "/score.gd"); //создание файловой переменной score = scoredata.ReadLine (); //чтение строки scoredata.Close (); //закрытие файловой переменной } void Update () { } void OnGUI(){ GUI.Box (new Rect (Screen.width*0.15f, Screen.height*0.8f, Screen.width*0.7f, Screen.height*0.1f), "MAX DISTANCE:"+score,mystyle); //создаем небольшое окошко для показа пройденного расстояния if (GUI.Button (new Rect (Screen.width*0.15f, Screen.height*0.25f, Screen.width*0.7f, Screen.height*0.1f), "Start game",mystyle)) //создаем кнопку для запуска игровой сцены { Application.LoadLevel(1);//Загрузка игровой сцены } if (GUI.Button (new Rect (Screen.width*0.15f, Screen.height*0.4f, Screen.width*0.7f, Screen.height*0.1f), "Exit",mystyle)) //создаем кнопку для выхода из игры { Application.Quit();//Выход из игры } } }
    В результате должно получиться примерно вот так:

    Шрифт, цвет и размер GUI элементов вы можете изменить с помощью MyStyle.

    Создание игровой сцены

    Основными на этой сцене элементами является дорога, автомобиль и шкала топлива.

    1. Дорога:

    Ввиду того что гонка является бесконечной и останавливается только когда машина попадет в препятствие или закончится бензин, дорога является двигающейся. То есть автомобиль может перемещаться влево или вправо, а иллюзию движения по прямой создает дорога.

    Кидаем спрайт с дорогой на игровую сцену и подгоняем по размерам камеры.

    Затем добавляем как дочерние объекты внутрь дороги 4 блока с препятствиями, топливный бак и не забываем добавить к ним Box Collider 2D.Еще надо отметить Is Triger для пересечения с автомобилем.

    Теперь создаем скрипт moveroad.cs и вешаем его на нашу дорогу.

    Добавляем в него следующий код:

    Using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization.Formatters.Binary; using System.IO; public class moveroad: MonoBehaviour { public GUIStyle mystyle;//создание стиля int f,fuelst; float score=0,speed=-0.2f,data,fuelpos;// переменные для хранения расстояния, скорости и рекорда public GameObject block;// игровой объект для размещения блока public GameObject block1; public GameObject block2; public GameObject block3; public GameObject fuel; bool turbotriger=false; void Start () { StreamReader scoredata = new StreamReader (Application.persistentDataPath + "/score.gd"); data = float.Parse(scoredata.ReadLine ());//чтение с файла информации о рекорде scoredata.Close (); } void Update () { transform.Translate (new Vector3 (0f,speed,0f));//движение дороги с заданной выше скоростью score = score + (speed*-10);// подсчет расстояния if (transform.position.y < -19f) // если дорога уходит за пределы камеры то она "теле портируется" вверх { transform.position=new Vector3(0f,33.4f,0f);//новая позиция дороги block.transform.position=new Vector3(10.15f,block.transform.position.y,block.transform.position.z); block1.transform.position=new Vector3(8.42f,block1.transform.position.y,block1.transform.position.z); block2.transform.position=new Vector3(6.62f,block2.transform.position.y,block2.transform.position.z); block3.transform.position=new Vector3(4.95f,block3.transform.position.y,block3.transform.position.z); fuel.transform.position=new Vector3(11.86f,fuel.transform.position.y,fuel.transform.position.z); //скрытие за пределы камеры всех препятствий(блоков) f = Random.Range (0, 5);//случайное появление на дороге 1-го из 4-х блоков или канистры с бензином switch (f) { case 0:block.transform.position=new Vector3(2.40f,block.transform.position.y,block.transform.position.z); break; case 1:block1.transform.position=new Vector3(0.90f,block1.transform.position.y,block1.transform.position.z); break; case 2:block2.transform.position=new Vector3(-0.80f,block2.transform.position.y,block2.transform.position.z); break; case 3:block3.transform.position=new Vector3(-2.35f,block3.transform.position.y,block3.transform.position.z); break; case 4: fuelst=Random.Range(0,4); if(fuelst==0){fuelpos=2.40f;} if(fuelst==1){fuelpos=0.90f;} if(fuelst==2){fuelpos=-0.80f;} if(fuelst==3){fuelpos=-2.35f;} fuel.transform.position=new Vector3(fuelpos,fuel.transform.position.y,fuel.transform.position.z); break; } if (score>data)// если текущее пройденное расстояние превышает то что записано в файле рекорда то идет обновление данных { StreamWriter scoredata=new StreamWriter(Application.persistentDataPath + "/score.gd");//создаем файловую переменную для хранения пройденного расстояния scoredata.WriteLine(score);//записываем новое значение в файл scoredata.Close();//закрываем файловую переменную } } } void OnGUI(){ GUI.Box (new Rect (0, 0, Screen.width, Screen.height*0.05f), "Distance(m): " + score,mystyle);//создаем окно для подсчета расстояния } }

    Должно получиться примерно вот так. Если все так оставить то после того как дорога пройдет до конца то будет оставаться пустое пространство и так будет по кругу, дорога будет исчезать.

    Что бы решить эту проблему надо создать дубликат уже готовой дороги и немного изменить скрипт.

    Должно получиться вот так.

    2. Автомобиль:

    Кидаем спрайт автомобиля на сцену и устанавливаем его в любое место на дороге. Затем создаем скрипт carcontroller.cs и вешаем его на автомобиль.

    Содержимое carcontroller.cs:

    Using UnityEngine; using System.Collections; using UnityStandardAssets.CrossPlatformInput; public class carconroller: MonoBehaviour { void Start () { } public void Update () { if (transform.rotation.z !=0) //проверка столкновения коллайдера автомобиля и препятствия, при столкновении происходит загрузка меню { Application.LoadLevel (0); } } } public void OnGUI() { if (GUI.RepeatButton (new Rect (Screen.width*0.1f, Screen.height*0.9f, Screen.width*0.2f, Screen.height*0.08f), "L")) //создаем кнопку для движения влево { if (transform.position.x > -2.4f) { transform.Translate (new Vector3 (-0.05f, 0f, 0f)); } } if (GUI.RepeatButton (new Rect (Screen.width*0.7f, Screen.height*0.9f, Screen.width*0.2f, Screen.height*0.08f), "R")) //создаем кнопку для движения вправо { if (transform.position.x < 2.4f) { transform.Translate (new Vector3 (0.05f, 0f, 0f)); } } } }
    Теперь автомобиль может перемещаться.

    3.Шкала топлива:

    Для создания шкалы потребовалось 2 спрайта одинаковых размеров, но разных цветов (красный, зеленый). И сделать один из них дочерним (зеленый).

    Using UnityEngine; using System.Collections; public class fuelscript: MonoBehaviour { public GameObject fuelall; float mytimer=100f;// задание плавающего числа // Use this for initialization void Start () { } void Update () { mytimer = 100f; mytimer -= Time.deltaTime;//изменения числа с течением времени if (mytimer/mytimer==1f) //проверка на период времени в 1 секунду { fuelall.transform.position=new Vector3(fuelall.transform.position.x-0.0011f,fuelall.transform.position.y,fuelall.transform.position.z); fuelall.transform.localScale = new Vector3(fuelall.transform.localScale.x-0.001f, 1, 1); //выше идет сдвижение влево и уменьшение по ширине зеленой полосы для имитации шкалы } if (fuelall.transform.localScale.x < 0) //если шкала исчезла то загрузка идет загрузка главного меню { Application.LoadLevel(0); } } }

    Дорога у меня это road183 и ее дубликат road183(1). В ее дочерний объект fueltrack нужно добавить скрипт для обнаружения пересечения с автомобилем и восполнения топлива.

    Создаем скрипт triger.cs и вешаем его на fueltrack в обеих дорогах и отмечаем как Is Triger. Код:

    Using UnityEngine; using System.Collections; public class triger: MonoBehaviour { public GameObject fuel;//добавляем сюда greenfuel // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnTriggerEnter2D(Collider2D col) { if (col.gameObject.name == "playercar") //проверка пересечения автомобиля и объекта fuel { fuel.transform.position=new Vector3(0,fuel.transform.position.y,fuel.transform.position.z); fuel.transform.localScale = new Vector3(1, 1, 1); //восстановление у объекта fuel стандартных значений } } }

    Итог

    В момент выпуска игры на Google Play я особо не занимался ее продвижением ну и само собой закачек не набралось.

    В отсутствие профессионального художника, с иконкой пришлось работать самостоятельно:

    Здравствуйте.

    Игры… Это одни из самых популярных программ, ради которых многие пользователи и покупают компьютеры и ноутбуки. Наверное, ПК не стали бы так популярны, если бы на них не было игр.

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

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

    1. Программы для создания 2D игр

    Под 2D - понимают двумерные игры. Например: тетрис, кот-рыболов, пинбол, разные карточные игры и пр.

    Пример-2D игры. Карточная игра: Солитер

    1) Game Maker

    Сайт разработчика: http://yoyogames.com/studio

    Процесс создания игры в Game Maker…

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

    Обычно в этом редакторе делают игры с видом сверху и платформеры (вид с боку). Для более опытных пользователей (те, которые немного разбираются в программирование) есть специальные возможности по вставке скриптов и кода.

    Нельзя не отметить большое разнообразие эффектов и действий, которые можно задавать различным объектам (будущим персонажам) в этом редакторе: количество просто поражает - более нескольких сотен!

    2) Construct 2

    Сайт: http://c2community.ru/

    Современный игровой конструктор (в прямом смысле этого слова), позволяющий даже начинающим пользователям ПК делать современные игры. Причем, хочу подчеркнуть, при помощи этой программы игры можно изготавливать для разных платформ: IOS, Android, Linux, Windows 7/8, Mac Desktop, Web (HTML 5) и пр.

    Этот конструктор очень похож на Game Maker - здесь так же нужно добавлять объекты, затем прописать им поведение (правила) и создать различные события. Редактор построен по принципу WYSIWYG - т.е. вы сразу же будете видеть результат по мере создания игры.

    Программа платная, хотя для начала будет предостаточно и бесплатной версии. Отличие различных версий описаны на сайте разработчика.

    2. Программы для создания 3D игр

    (3D - трехмерные игры)

    1) 3D RAD

    Сайт: http://www.3drad.com/

    Один из самых дешевых конструкторов в формате 3D (многим пользователям, кстати, хватит и бесплатной версии, у которой ограничение на обновление сроком на 3 месяца).

    3D RAD наиболее легкий конструктор в освоении, программировать здесь практически не нужно, разве что за исключением прописывания координат объектов при различных взаимодействиях.

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

    2) Unity 3D

    Сайт разработчика: http://unity3d.com/

    Серьезный и комплексный инструмент для создания серьезных игр (извиняюсь за тавтологию). Рекомендовал бы переходить к нему после изучения других движков и конструкторов, т.е. с набитой рукой.

    В пакет Unity 3D входит движок, который полностью позволяет задействовать возможности DirectX и OpenGL. Так же в арсенале программы возможность работы с 3D моделями, работа с шейдерами, тенями, музыкой и звуками, огромная библиотека скриптов под стандартные задачи.

    Пожалуй, единственный недостаток у этого пакета - это необходимость знания программирования на C# или Java - часть кода при компиляции придется дописывать в «ручном режиме».

    3) NeoAxis Game Engine SDK

    Сайт разработчика: http://www.neoaxis.com/

    Бесплатная среда разработки практически любых игр в формате 3D! При помощи данного комплекса можно делать и гонки, и стрелялки, и аркады с приключениями…

    Для движка Game Engine SDK в сети имеется немало дополнений и расширений под множество задач: например, физика автомобиля или самолета. При помощи расширяемых библиотек вам даже не понадобиться серьезное знание языков программирования!

    Благодаря специальному плееру, встроенному в движок, игры созданные в нем могут воспроизводиться во множестве популярных браузерах: Google Chrome, FireFox, Internet Explorer, Opera и Safari.

    Game Engine SDK распространяется как бесплатный движок для некоммерческих разработок.

    3. Как создать 2D игру в редакторе Game Maker - пошагово

    Game Maker. Добавление объекта.

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

    Чтобы добавить событие, щелкните кнопку с одноименным названием - затем справа в столбике выберите действие для события. Например, перемещение по горизонтали и вертикали, при нажатии клавиш стрелок .

    Добавление событий к объектам.

    Game Maker. Для объекта Соник добавлены 5 событий: перемещение персонажа в различных направлениях при нажатии клавиш-стрелок; плюс задано условие при пересечении границы игровой зоны.

    Кстати, событий может быть очень много: здесь Game Maker не мелочиться, программа предложит вам много всего:

    Задание перемещение персонажа: скорость перемещения, прыжки, сила прыжка и пр.;

    Накладывание произведения музыки при различных действиях;

    Появление и удаление персонажа (объекта) и т.д.

    Важно! Для каждого объекта в игре нужно прописать свои события. Чем больше событий для каждого объекта вы пропишете - тем разностороннее и с большими возможностями получиться игра. В принципе, даже не зная что конкретно сделает то или иное событие, можно тренироваться добавляя их и смотреть как поведет себя игра после этого. В общем-то, огромное поле для экспериментов!

    6) Последнее и одно из важных действий - создание комнаты. Комната - это своего рода этап игры, уровень, на котором и будут взаимодействовать ваши объекты. Чтобы создать такую комнату, нажмите кнопку со следующим значком: .

    Добавление комнаты (этапа игры).

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

    Запуск полученной игры.

    Game Maker откроет перед вами окно с игрой. Фактически, вы можете смотреть, что у вас получилось, экспериментировать, играть. В моем случае Соник может перемещаться в зависимости от нажатия клавиш на клавиатуре. Своего рода мини-игра (эх, а были времена, когда белая точка, бегающая по черному экрану, вызывала дикое удивление и интерес у народа… ).

    Полученная игра…

    Да, конечно, полученная игра примитивная и очень проста, зато пример ее создания очень показателен. Далее экспериментируя и работая с объектами, спрайтами, звуками, фонами и комнатами - можно создать очень даже не плохую 2D игру. Чтобы создавать подобные игры лет 10-15 назад необходимо было обладать специальными знаниями, сейчас - достаточно уметь вращать мышку. Прогресс!

    С наилучшими! Всем удачного игро-строя…