Использование libgdx и Clojure

Clojure – диалект языка программирования Lisp с функциональным программированием, написанный для JVM. Clojure поставляется с Java совместимостью, делая его способным использовать существующие мощные библиотеки в Java экосистеме. Существует несколько источников для разработки игр на Clojure языке, используя libGDX.

Этот статья предполагает, что у вас установлен Leiningen наряду со среднем уровнем знаний Clojure, или Lisp. Есть много хороших видео у ClojureTV на YouTube, в частности Clojure for Java Programmers (Part 2).

project.clj

Так как по умолчанию Leiningen Maven репозитории не содержат libGDX, нужно добавить его самостоятельно из Sonatype репозитория.

(defproject cljdx "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :license {:name "Apache License, Version 2.0"
          :url "http://www.apache.org/licenses/LICENSE-2.0.html"
          :distribution :repo
          :comments "Same as LibGDX"}
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [com.badlogicgames.gdx/gdx "0.9.9-SNAPSHOT"]
                 [com.badlogicgames.gdx/gdx-backend-lwjgl "0.9.9-SNAPSHOT"]
                 [com.badlogicgames.gdx/gdx-platform "0.9.9-SNAPSHOT"
                  :classifier "natives-desktop"]]
  :repositories [["sonatype"
                  "https://oss.sonatype.org/content/repositories/snapshots/"]]
  :source-paths ["src/clojure"]
  :java-source-paths ["src/java"]
  :aot [cljdx.desktop-launcher]
  :main cljdx.desktop-launcher)

Код может быть переведен довольно простым способом:

здесь есть эквивалент Main.java, который мы назвали cljdx.desktop-launcher

(ns cljdx.desktop-launcher
  (:require [cljdx.core])
  (:import [com.badlogic.gdx.backends.lwjgl LwjglApplication])
  (:gen-class))

(defn -main
  []
  (LwjglApplication. (cljdx.core.Game.) "cljdx" 800 600 true))

здесь реализация Screen интерфейса (представлена как cljdx.core)

(ns cljdx.core
  (:import [com.badlogic.gdx Game Gdx Graphics Screen]
           [com.badlogic.gdx.graphics Color GL20]
           [com.badlogic.gdx.graphics.g2d BitmapFont]
           [com.badlogic.gdx.scenes.scene2d Stage]
           [com.badlogic.gdx.scenes.scene2d.ui Label Label$LabelStyle]))

(gen-class
  :name cljdx.core.Game
  :extends com.badlogic.gdx.Game)

(def main-screen
  (let [stage (atom nil)]
    (proxy [Screen] []
      (show []
        (reset! stage (Stage.))
        (let [style (Label$LabelStyle. (BitmapFont.) (Color. 1 1 1 1))
              label (Label. "Hello world!" style)]
          (.addActor @stage label)))
      (render [delta]
        (.glClearColor (Gdx/gl) 0 0 0 0)
        (.glClear (Gdx/gl) GL20/GL_COLOR_BUFFER_BIT)
        (doto @stage
          (.act delta)
          (.draw)))
      (dispose[])
      (hide [])
      (pause [])
      (resize [w h])
      (resume []))))

(defn -create [^Game this]
  (.setScreen this main-screen))

и вот весь необходимый код! Команда lein uberjar сгенерирует необходимый работоспособный jar файл.

Игры, написанные на Clojure с использованием libGDX