Статьи

Использование libGDX с Kotlin

В последнее время я читал о разных языках и о том, что они могут принести в и без того переполненную таблицу разработчиков программного обеспечения, и мне выделился один язык: Kotlin. ( https://kotlinlang.org/ )

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

  • Работает на JVM и имеет полную совместимость с Java
  • Это не чистый OO и не функциональный язык, он естественно сочетает в себе оба стиля.
  • Поддерживает процедурное программирование с использованием функций
  • Он имеет вывод типов и поддерживает как типы данных, допускающие обнуляемый, так и ненулевой тип.
  • Его синтаксис прекрасен, особенно объявления переменных в стиле Pascal (типы данных идут после переменных)
  • Это очень кратко, и я нашел код, написанный на Kotlin, очень читабельным

Настройка проекта

Я буду использовать стандартную настройку libGdx, как рекомендовано и описано в вики ( https://github.com/libgdx/libgdx/wiki/Project-Setup-Gradle ), с Gradle в качестве инструмента для сборки и IntelliJ в качестве моей IDE.

Я назову мой проект Nemo , потому что у него нет названия, и это то, что «nemo» на латыни (нет, никто, никто, нет имени). Посмотрим, куда мы пойдем с этим.

Screen-Shot-2016-01-19-в-13.49.30

Как только проект создан, импортируйте его в свою IDE. Обычно импорт / открытие файла build.gradle из корневого каталога проекта.

Screen-Shot-2016-01-19-в-13.53.02

После импорта проекта обновите libGdx. Последний инструмент установки содержит последние версии, но чтобы сделать это вручную, откройте корневой файл build.gradle котором определены все зависимости, и используйте последнюю версию libGdx. Последние версии можно найти здесь: https://libgdx.badlogicgames.com/versions.html

Screen-Shot-2016-01-19-в-13.52.28

Измените gdxVersion на последний, в настоящее время это 1.8.0.

Также убедитесь, что ваша IDE готова для Kotlin.

Чтобы настроить IntelliJ, следуйте инструкциям здесь: https://kotlinlang.org/docs/tutorials/getting-started.html

Примечание. Чтобы обновить плагин до более поздней версии Kotlin, единственный способ, которым мне удалось это сделать, — это удалить плагин и повторно добавить его.

Для пользователей затмения инструкции здесь: https://kotlinlang.org/docs/tutorials/getting-started-eclipse.html

Поскольку мы используем Gradle в качестве нашего инструмента для сборки, нам нужно настроить его для использования плагина kotlin для сборки проекта. Для этого kotlin-gradle зависимость плагина kotlin-gradle в метод buildscript находящийся в основном файле build.gralde .

Добавьте строку

1
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-beta-4584'

зависимости buildscript в основном файле build.gradle .

Корневой файл build.gradle должен содержать что-то вроде этого

01
02
03
04
05
06
07
08
09
10
11
buildscript {
   repositories {
       mavenCentral()
   }
   dependencies {
       classpath 'com.android.tools.build:gradle:1.2.3'
       classpath 'org.robovm:robovm-gradle-plugin:1.12.0'
       classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-beta-4584'
   }
}

Номер версии можно получить в хранилище Kotlin в Maven Central. http://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-gradle-plugin

Дополнительную информацию о том, как использовать Kotlin с Gradle, можно найти здесь: https://kotlinlang.org/docs/reference/using-gradle.html.

Для нацеливания на JVM необходимо применить плагин Kotlin.

добавлять

1
apply plugin: "kotlin"

в « основной » проект, потому что мы будем использовать Kotlin только в « основной ». Стандартная библиотека Kotlin также должна быть добавлена ​​к основным зависимостям.

1
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"

Примечание: kotlinVersion определяется на уровне проекта в allProjects.ext .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
allprojects {
   apply plugin: "eclipse"
   apply plugin: "idea"
 
   version = '1.0'
   ext {
       appName = "nemo"
       gdxVersion = '1.8.0'
       roboVMVersion = '1.12.0'
       box2DLightsVersion = '1.4'
       ashleyVersion = '1.7.0'
       aiVersion = '1.7.0'
       kotlinVersion = '1.0.0-beta-4584'
   }
 
   repositories {
       mavenCentral()
   }
}

Для получения последней версии, пожалуйста, обратитесь на сайт Kotlin.

Настройка основного проекта должна выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
project(":core") {
   apply plugin: "java"
   apply plugin: "kotlin"
 
 
   dependencies {
       compile "com.badlogicgames.gdx:gdx:$gdxVersion"
       compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
       compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
       compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
   }
}

Примечание: выделенные строки содержат изменения.

Kotlin можно смешивать с Java, и поскольку планируется использовать только Kotlin, мы не будем извлекать источники Kotlin в разные каталоги, а будем постепенно преобразовывать текущие Java-источники в Kotlin. К счастью, у нас есть только один класс для преобразования. Мы можем сделать это несколькими способами. Если вы используете IntelliJ, самый простой способ — выбрать класс в меню « Сервис» и выбрать « Преобразовать файл Java в файл Kotlin» .

Есть и другие способы, например, создать пустой файл с расширением .kt , скопировать содержимое файла Java и вставить его в новый файл .kt . IntelliJ предложит вам преобразовать его.

Конечно, все это возможно, только если плагин Kotlin установлен и включен.

Давайте рассмотрим файл класса Nemo , который генерируется приложением настройки gdx:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package net.obviam.nemo;
 
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 
public class Nemo extends ApplicationAdapter {
  SpriteBatch batch;
  Texture img;
  
  @Override
  public void create () {
     batch = new SpriteBatch();
     img = new Texture("badlogic.jpg");
  }
 
  @Override
  public void render () {
     Gdx.gl.glClearColor(1, 0, 0, 1);
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
     batch.begin();
     batch.draw(img, 0, 0);
     batch.end();
  }
}

и сгенерированный файл Kotlin:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package net.obviam.nemo
 
import com.badlogic.gdx.ApplicationAdapter
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch
 
class Nemo : ApplicationAdapter() {
   internal var batch: SpriteBatch
   internal var img: Texture
 
   override fun create() {
       batch = SpriteBatch()
       img = Texture("badlogic.jpg")
   }
 
   override fun render() {
       Gdx.gl.glClearColor(1f, 0f, 0f, 1f)
       Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
       batch.begin()
       batch.draw(img, 0f, 0f)
       batch.end()
   }
}

Автоматическое преобразование не идеально, и если мы скомпилируем класс, мы получим две ошибки:

Error:(9, 4) Gradle: Property must be initialized or be abstract
Error:(10, 4) Gradle: Property must be initialized or be abstract

Ошибки относятся к 2 неинициализированным свойствам класса в выделенных строках (10 и 11).

1
2
internal var batch: SpriteBatch
internal var img: Texture

В Kotlin объявленные non null свойства должны быть инициализированы в конструкторе или методе init класса. Но при этом мы не будем использовать методы жизненного цикла libGdx, поэтому мы можем применить одну особенность Kotlin: Late Initialized Properties . Это достигается с помощью модификатора lateinit .

1
2
internal lateinit var batch: SpriteBatch
internal lateinit var img: Texture

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

Вот и все, у нас есть проект Kotlin libGdx. Мы можем построить его и запустить его обычным способом.

Самый простой способ — запустить его из командной строки с помощью оболочки Gradle. В корне проекта выполните следующую команду (linux, OSX): ./gradlew desktop: run или на рабочем столе Windows gradlew.bat: run

или следуя инструкциям, найденным в вики: https://github.com/libgdx/libgdx/wiki/Project-Setup-Gradle

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

Screen-Shot-2016-01-19-в-16.37.50

Далее мы рассмотрим некоторые общие задачи в разработке игр и способы их решения с помощью Kotlin.

Ссылка: Использование libGDX с Kotlin от нашего партнера JCG Impaler в блоге Against the Grain .