В последнее время я читал о разных языках и о том, что они могут принести в и без того переполненную таблицу разработчиков программного обеспечения, и мне выделился один язык: 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» на латыни (нет, никто, никто, нет имени). Посмотрим, куда мы пойдем с этим.
Как только проект создан, импортируйте его в свою IDE. Обычно импорт / открытие файла build.gradle
из корневого каталога проекта.
После импорта проекта обновите libGdx. Последний инструмент установки содержит последние версии, но чтобы сделать это вручную, откройте корневой файл build.gradle
котором определены все зависимости, и используйте последнюю версию libGdx. Последние версии можно найти здесь: https://libgdx.badlogicgames.com/versions.html
Измените 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
Должен появиться очень знакомый экран начальной загрузки.
Далее мы рассмотрим некоторые общие задачи в разработке игр и способы их решения с помощью Kotlin.
- Развивающийся проект можно найти здесь: https://github.com/obviam/kotlin-gdx-nemo
Ссылка: | Использование libGDX с Kotlin от нашего партнера JCG Impaler в блоге Against the Grain . |