Как писать игры на андроид на c
Перейти к содержимому

Как писать игры на андроид на c

  • автор:

Туториал: Создание простейшей 2D игры на андроид

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

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

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

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

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

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

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

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

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

Скачиваем архив с картинками и распаковываем его.

Находим папку drawable и копируем туда картинки.

Позже они нам понадобятся.

Шаг 4. Создаём layout

Находим activity_main.xml, открываем вкладку Text и вставляем туда это:

На вкладке Design видно как наш layout будет выглядеть.

Сверху поле в котором будет сама игра, а снизу кнопки управления Left и Right. Про layout можно написать отдельную статью, и не одну. Я не буду на этом подробно останавливаться. Про это можно почитать тут.

Шаг 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 >

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

Шаг 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)

Астероид должен двигаться с определённой скорость вертикально вниз. Поэтому в методе update() прибавляем к координате x скорость.

@Override public void update()

Так же нам нужен будет метод определяющий столкнулся ли астероид с кораблём.

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 игра готова. Компилируем, запускаем и смотрим что получилось!
Если кто-то запутался или что-то не работает можно скачать исходник.

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

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

  • Разработка игр
  • Разработка под Android

Пишем игру для Android c помощью AndEngine. Часть 1

Всем привет.
Сегодня я расскажу вам как с помощью AndEngine написать небольшую игру. Стаья получилась довольно большая и, чтобы не утомлять читателя, пока мы остановимся на первой ее части. Все что нужно от читателя — это знание java, ООП и умение обращаться с Eclipse и Android SDK. Забегая вперед, у нас получится что то похожее на Mirrors Maze либо Laser Logic.
Вторая часть статьи.
Третья часть статьи.

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

Шаг 1: На любителя. Можно скачать исходники AndEngine и подключить к проекту как Android библиотеку. Либо взять из примеров уже готовый .jar. В обоих случаях вам понадобится Mercurial, на нем мы тоже не будем останавливаться.
Шаг 2: Проект создан, все библиотеки подключены. Теперь нам нужны изображения. Сздаем в проекте папку:

Ну или кому как нравится и кидаем туда 2 изображения. Одно фоновое и наш лазер.
Больше никаких изображений не требуется. Пока.
Шаг 3: Ну и раз уж мы начали с изображений то напишем небольшой класс который будем нам их инициализировать.

private Texture mTexture;
private TextureRegion mLaserGunTextureRegion, mBackgroundTextureRegion;

public Textures(final BaseGameActivity activity, final Engine engine) Log.i( "Laser Logic" , "onLoadResources" );
this .mTexture = new Texture(1024, 512,
TextureOptions.BILINEAR_PREMULTIPLYALPHA);
this .mLaserGunTextureRegion = TextureRegionFactory.createFromAsset(
this .mTexture, activity, "gfx/laser_gun.png" , 800, 0);
this .mBackgroundTextureRegion = TextureRegionFactory.createFromAsset(
this .mTexture, activity, "gfx/laser_logic_background.png" , 0, 0);
engine.getTextureManager().loadTexture( this .mTexture);
>

public TextureRegion getBackground() return mBackgroundTextureRegion;
>

public TextureRegion getLaserGun() return mLaserGunTextureRegion;
>

* This source code was highlighted with Source Code Highlighter .

Что вообще происходит в этом коде? Для начала мы создаем mTexture, это будет наш атлас. Очень важно чтоб его размеры были кратны степеням двойки, так как OpenGL не понимает другие размеры текстур. Дальше мы добавляем на наш атлас изображения. И внимательно следим за тем чтобы они не пересекались. Для нашего лазера очень важен прозрачный фон, так что для него в любом случае мы используем PNG. А для background'a не принципиально в каком формате его хранить. Ну и после всех манипуляций вызываем метод loadTexture() после чего мы можем использовать наш атлас.

Шаг 4: Текстуры мы загрузили, теперь посмотрим что у нас получилось.

public class StageActivity extends BaseGameActivity

private static final int CAMERA_WIDTH = 800;
private static final int CAMERA_HEIGHT = 480;
private static final int NUMBER_OF_LAYERS = 2;

private Camera mCamera;
private Textures mTextures;

@Override
public void onLoadComplete() <>

@Override
public Engine onLoadEngine() this .mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
final EngineOptions options = new EngineOptions( true ,
ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(
getScreenResolutionRatio()), this .mCamera);
return new Engine(options);
>

@Override
public void onLoadResources() mTextures = new Textures( this , getEngine());
>

@Override
public Scene onLoadScene() Ln.i( "OnLoadScene" );
this .mEngine.registerUpdateHandler( new FPSLogger());

final Scene scene = new Scene(NUMBER_OF_LAYERS);
scene.setBackground( new SpriteBackground( new Sprite(0, 0, mTextures
.getBackground())));
scene.getFirstChild().attachChild( new Sprite(0, 0, mTextures.getLaserGun()));
return scene;
>

private float getScreenResolutionRatio() DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
return (( float ) dm.widthPixels) / (( float ) dm.heightPixels);
>

* This source code was highlighted with Source Code Highlighter .

Это наше главное Activity, надеюсь не нужно объяснять что это, которое мы без промедления должны унаследовать от BaseGameActivity, иначе у нас ничего не выйдет. После этого IDE нам предложит переопределить 4 метода. Вызываются которые в порядке onLoadEngine->onLoadResources->onLoadScene->onLoadComplete. Начнем с начала цепочки здесь мы инициализируем камеру и сам движок. Особое внимание хочу обратить на метод getScreenResolutionRatio(). Благодаря ему получившаяся у нас картинка будет растягиваться на весь экран. При этом пропорции не будут соблюдаться. Либо можем оставить пропорции камеры и тогда наша игра не будет занимать весь экран на некоторых устройствах. Есть конечно и третий вариант — писать инициализацию для всех размеров экранов, но мы этого, естественно, не будем делать сейчас.

Далее, загружаем наши текстуры, которые потом используем в onLoadScene. FPSLogger — будет выводить фреймрейт в логи. А странная конструкция scene.getFirstChild() вернет нам ссылку на верхний слой нашей сцены. Мы конечно можем обойтись и без верхнего слоя добавляя объекты прямо в сцену, но знать на какой слой добавляеш объект все же удобнее.
Теперь мы можем увидеть что у нас получилось.

Для первой части достаточно. Код проекта вы можете найти на SourceForge.
Спасибо за внимание.

Как создать мобильные игры c Unity 3D?

Хочу начать изучать Unity 3D, очень хочется писать игры под Андроид. Если что-то напишу, смогу ли это опубликовать в плэй маркете? Или чтобы вытащить АПК из Unity, то надо платить?

Отслеживать
124k 24 24 золотых знака 131 131 серебряный знак 312 312 бронзовых знаков
задан 27 окт 2017 в 12:02
5,658 5 5 золотых знаков 24 24 серебряных знака 59 59 бронзовых знаков
можно. Всё можно. Но если приложение хорошо пойдёт, то понадобится купить лицензию.
27 окт 2017 в 12:03
До 100к зеленных в год все бесплатно
27 окт 2017 в 12:05
@Xumera_hZ а как же лицензия разработчика за $25 ?)
27 окт 2017 в 12:10
@VadimBugaiov имелось в виду использование бесплатного Unity
27 окт 2017 в 12:31

@elik чтобы писать под Android не обязателен Unity. Есть много других движков. И их реально много ru.stackoverflow.com/a/548513/191482

27 окт 2017 в 12:32

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Можно.Но советую без рекламы и бесплатно-если приложение зайдет, и доходы превысят 100 000$/год, юнити тебя будут сильно пинать или просто прикажут купить платную версию.Иначе удалят приложение из всех магазинов в которых ты выложил это приложение. UPD: Так же нужно скачать Android SDK для создания апк.Он бесплатный вроде

Отслеживать
ответ дан 27 окт 2017 в 13:29
366 1 1 золотой знак 3 3 серебряных знака 15 15 бронзовых знаков

  • android
  • unity3d
  • лицензирование
    Важное на Мете
Связанные
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420

На каких языках программирования пишут игры

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

Евгений Кучерявый

Евгений Кучерявый

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.

Сохранитесь и подпишитесь: наш Telegram-канал «Чекпоинт» — уютное место, где мы рассказываем об играх и о том, как они создаются.

Ориентироваться лучше на то, что хотите реализовать и на какой платформе:

  • Swift — игры на iOS или macOS.
  • PHP и JavaScript — браузерные игры.
  • C# — игры на Unity.
  • С или C++ — большие требовательные игры.

Если создаёте игру впервые, воспользуйтесь каким-нибудь движком:

  • Unreal Engine;
  • Unity;
  • CryEngine.

В чём отличие языков для создания игр

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

Чтобы выбрать, какой язык подойдёт вам, давайте разберемся в нескольких моментах. А для совсем новичков мы предлагаем курс «Профессия Разработчик игр на Unreal Engine 4».

Браузерные игры

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

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

Тут уже можно подключить JavaScript — он позволяет хранить в переменных данные персонажа, а графику обрабатывать с помощью Canvas. Если прикрутить PHP, получится создать базу данных, построить защиту и реализовать многопользовательский режим. А это уже полноценная браузерная игра.

Многие из таких игр создаются на Flash, который работает на языке ActionScript. Мы не рекомендуем изучать эту технологию, потому что скоро её поддержка будет прекращена, а на HTML5 появится ещё больше возможностей, чтобы полностью её заменить.

Примеры браузерных приложений

Игры для мобильных устройств

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

Это компенсируется простотой разработки. Можно скачать популярный движок и за несколько недель выпустить готовое приложение — это программы, которые предоставляют готовые решения для работы с графикой и физикой. Разработчику остается только добавить спрайты или модели, а потом прописать несколько скриптов на одном из предложенных языков. Можно даже не заморачиваться из-за всех ресурсов — они скачиваются или покупаются в интернете.

Unity, один из самых популярных движков, даёт возможность писать на C# и JavaScript. Подключаете скачанные файлы, пишете несколько команд — и простенькая игра готова.

Примеры мобильных игр

Компьютерные и консольные игры

Тут настоящий размах. Реалистичная графика, VR, большой игровой мир, поддержка огромного количества игроков онлайн и так далее. Можно создавать проекты вроде Limbo или Super Meat Boy в одиночку, а можно в команде разрабатывать новый Fortnite.

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

  • механика;
  • графика;
  • анимация;
  • физика;
  • музыка;
  • озвучка;
  • скрипты;
  • сюжет.

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

Без движков тоже можно обойтись: World of WarCraft был написан на C++, а MineCraft создан одним человеком на Java, после чего игру купила компания Microsoft за 2,5 миллиарда долларов.

Даже Super Mario написали на ассемблере, когда о движках никто и не задумывался.

Примеры компьютерных игр

Какую роль в гейм-разработке
играют языки

Если постараться, то сделаете крутую игру без написания кода — есть специальные движки и заготовки. Но чтобы понять, как всё работает, выясните, какую роль играет программирование.

Представьте, что у вас есть 3D-модель персонажа. Пока от неё нет толка. Если хотите, чтобы она двигалась, нужен код. Этот скрипт должен отлавливать действия игрока, а потом передавать команду модели персонажа.

Например, вы ловите все нажатия, а потом определяете, что это была за кнопка. Если это стрелочка влево — персонаж должен идти налево. Рассмотрим на примере JavaScript.

function playerMove(direction) //Функция движения if(direction == “right”) //Проверяем направление player.x++; //Меняем координаты > else < player.x--; >playerAnimate(player.x); //Вызываем функцию анимации > function controlChar(e) //Создаем функцию, которая будет обрабатывать все нажатия switch(e.keyCode)< //Проверяем, какую кнопку нажал пользователь case 38: //У каждой кнопки есть свой код. 38 — стрелочка влево playerMove(“left”); //Вызываем функцию движения break; case 39: //Стрелочка вправо playerMove(“right”); //Вызываем функцию движения break; > > document.getElementById(“game”).onkeydown = controlChar; //При нажатии вызываем функцию 

Если пользователь нажмёт нужную кнопку, то его персонаж передвинется на другие координаты, а потом будет вызвана функция анимации. На JavaScript в основном работают с 2D или псевдо-3D, поэтому останавливаться на моделях мы не будем.

Программный код также запускает музыку в нужный момент:

If(eventHappend == true) < //Если событие произошло audio.play(); //Запустить аудио >

Или даёт толчок развитию событий. Например, если пользователь нажмёт клавишу E, указав мышью на NPC, то откроется диалоговое окно, в котором можно поторговать или узнать слухи.

В играх почти всё завязано на скриптах:

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

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

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

Какой язык выбрать для разработки игры

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

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

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

Курс

Профессия Разработчик игр на Unreal Engine 4

Научитесь создавать игры с нуля на Blueprints и C++, разберётесь в командной разработке, ведении документации и добавите 4 игры в портфолио.

Узнать про курс

Профессии с трудоустройством

  • 3D-дженералист
  • Разработчик игр на Unity
  • Геймдизайнер
  • Разработчик игр на Unreal Engine
  • Концепт-художник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *