LibGDX: Котлин против Java - PullRequest
       8

LibGDX: Котлин против Java

0 голосов
/ 02 декабря 2018

В настоящее время я работаю с примерами из книги "Разработка Java-игр с LibGDX" Ли Стемкоски.Я хотел попробовать Kotlin и преобразовал код из главы 2 в Kotlin.

Я спрашиваю, является ли следующий код наилучшей практикой, поскольку кажется, что код Kotlin гораздо более громоздок (и не настолько хорош)) в качестве аналога Java.

package chapter2

import com.badlogic.gdx.Game
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Input
import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.math.Rectangle

class StarfishCollectorAlpha : Game() {
    private lateinit var batch: SpriteBatch

    private var turtleTexture: Texture? = null
    private var turtleX: Float? = null
    private var turtleY: Float? = null
    private lateinit var turtleRectangle: Rectangle

    private var starfishTexture: Texture? = null
    private var starfishX: Float? = null
    private var starfishY: Float? = null
    private lateinit var starfishRectangle: Rectangle

    private var oceanTexture: Texture? = null
    private var winMessageTexture: Texture? = null

    private var win: Boolean? = null

    override fun create() {
        batch = SpriteBatch()

        turtleTexture = Texture(Gdx.files.internal("assets/turtle-1.png"))
        turtleX = 20f
        turtleY = 20f
        turtleRectangle = Rectangle(
            turtleX!!,
            turtleY!!,
            turtleTexture!!.width.toFloat(),
            turtleTexture!!.height.toFloat()
        )

        starfishTexture = Texture(Gdx.files.internal("assets/starfish.png"))
        starfishX = 380f
        starfishY = 380f
        starfishRectangle = Rectangle(
            starfishX!!,
            starfishY!!,
            starfishTexture!!.width.toFloat(),
            starfishTexture!!.height.toFloat()
        )

        oceanTexture = Texture(Gdx.files.internal("assets/water.jpg"))
        winMessageTexture = Texture(Gdx.files.internal("assets/you-win.png"))

        win = false
    }

    override fun render() {
        // check user input
        if (Gdx.input.isKeyPressed(Input.Keys.LEFT))
            turtleX = turtleX!! - 1
        if(Gdx.input.isKeyPressed(Input.Keys.RIGHT))
            turtleX = turtleX!! + 1
        if(Gdx.input.isKeyPressed(Input.Keys.UP))
            turtleY = turtleY!! + 1
        if(Gdx.input.isKeyPressed(Input.Keys.DOWN))
            turtleY = turtleY!! - 1

        // update turtle rectangle location
        turtleRectangle.setPosition(turtleX!!, turtleY!!)

        // checks win condition: Turtle must be overlapping starfish
        if (turtleRectangle.overlaps(starfishRectangle))
            win = true

        // clear screen
        Gdx.gl.glClearColor(0f, 0f, 0f, 1f)
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)

        // draw graphics
        batch.begin()
        batch.draw(oceanTexture, 0f, 0f)
        if (!win!!)
            batch.draw(starfishTexture, starfishX!!, starfishY!!)
        batch.draw(turtleTexture, turtleX!!, turtleY!!)
        if (win!!)
            batch.draw(winMessageTexture, 180f, 180f)
        batch.end()
    }
}

Во-первых: версия Java определяет переменные, допускающие значения NULL, только в трех словах:

private Texture turtleTexture;

Во-вторых: вы должны явно преобразовать целые числа в числа с плавающей запятой с помощью Kotlin,Когда Java управляет этим для вас.

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

Я хочу использовать Kotlin для разработки игр (LibGDX), но мне кажется (с моими ограниченными знаниями, возможно), что Java - лучший язык.

Пожалуйста, скажите мне, что мой код Kotlin - мусор, и что есть лучший способ изменить мой беспорядок.

1 Ответ

0 голосов
/ 22 мая 2019

Для libgdx обычным случаем является то, что либо все ваши переменные должны быть нулевыми, либо все ваши переменные должны быть инициализированы, и ничего между ними.Из-за этого вы можете использовать одну переменную Nullable в вашем классе Game для делегирования контекстному классу, который не имеет свойств NULL.

Это избавляет от большей части назойливой проверки нуля.

Что касается необходимости явного преобразования между типами чисел - для меня это особенность: D.Я вижу, как это может раздражать.Хотя я бы попробовал и посмотрел, растет ли он на вас.

Вот тот, который я только что взбил для своих собственных целей:

class GolGui : ApplicationAdapter() {
  companion object {
      private val SCREEN_HEIGHT = 480
      private val SCREEN_WIDTH = 800
      private val SCREEN_CENTER_X = SCREEN_WIDTH / 2
      private val SCREEN_CENTER_Y = SCREEN_HEIGHT / 2
  }

  private class Context : Disposable {
      val batch = SpriteBatch();
      val img = Texture("badlogic.jpg")
      val gameSession = GameSession(GameBoard(12, 12))
      val camera = OrthographicCamera(SCREEN_WIDTH.toFloat(), SCREEN_HEIGHT.toFloat())
      val shapeRenderer = ShapeRenderer()
      init {
          shapeRenderer.projectionMatrix = camera.combined
      }

      fun render() {
          Gdx.gl.glClearColor(0.2f, 0f, 0f, 1f)
          Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
          shapeRenderer.apply {
              begin(ShapeRenderer.ShapeType.Filled)
              rect(200f, 200f, 200f, 200f)
              end()
          }
      }

      override fun dispose() {
          batch.dispose()
          img.dispose()
          shapeRenderer.dispose()
      }
  }

  private var context: Context? = null

  override fun create() {
      context = Context()
  }

  override fun render() {
      context!!.render()
  }

  override fun dispose() {
      context!!.dispose()
  }
}
...