在 Kotlin 上使用 LibGDX 的协程错误

问题描述 投票:0回答:1

我正在使用 LibGDX 在 Kotlin 上开发一个游戏项目,一切正常,直到我创建了 Game 类(在此之前我正在测试由 ApplicationAdapter() 扩展的单个类)。 这个问题来自于一个协程(我知道与 LibGDX 一起使用它很奇怪),它不断地增加或减少 4 个盒子的大小,以在类运行时获得延迟效果。我没有使用 LibGDX 的经验,并且仍在尝试理解一些基本概念。所以看起来效果有效,但在某些时候它停止工作。一切都运行良好(包括触摸)

我尝试对 dispose() 方法和相机进行更改。

游戏类:

class game : Game(){

    public var batch: SpriteBatch? = null
    public var font_generator : FreeTypeFontGenerator? = null
    public var font_parameter = FreeTypeFontGenerator.FreeTypeFontParameter()
    public var font : BitmapFont? = null
    public var touch : Vector3 = Vector3()
    public var isDisplaying : Boolean = true

    override fun create() {
        batch = SpriteBatch()
        setFontConfig()
        font_generator = FreeTypeFontGenerator(Gdx.files.internal("fonts/indie_flower.ttf"))
        font = font_generator?.generateFont(font_parameter)
        setScreen(escollir_color(this))
    }

    override fun render() {
        super.render()

    }

    override fun dispose() {
        batch!!.dispose()
        font!!.dispose()
    }
    private fun setFontConfig(){
        font_parameter.size=60
        font_parameter.shadowOffsetX=2
        font_parameter.shadowOffsetY=2
        font_parameter.shadowColor = Color(0f, 0f, 0f, 1f)
        font_parameter.color = Color(255f, 255f, 255f, 1f)

    }

}

package com.la_rateta.game

import com.badlogic.gdx.ApplicationAdapter
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Screen
import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.GlyphLayout
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator
import com.badlogic.gdx.math.Rectangle
import com.badlogic.gdx.math.Vector3
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class escollir_color(game: game) :  Screen{

    private lateinit var gameInstance : game
    private var camera : OrthographicCamera = OrthographicCamera()
    private var image: ArrayList<Texture?> = ArrayList()
    private var form : ArrayList<Rectangle> = ArrayList()
    private var enterCoroutine : Boolean = true
    private var enunciats : ArrayList<String> = ArrayList()
    private var random : Int? = null
    private var layout : GlyphLayout? = null

    init {
        gameInstance = game
        camera.setToOrtho(false, 800f, 400f)
        layout = GlyphLayout()
        addColors()
        randomText()
    }

    override fun render(delta : Float) {
        camera.update()
        gameInstance.batch!!.setProjectionMatrix(camera.combined)

        gameInstance.batch!!.begin()
        gameInstance.font!!.draw(gameInstance.batch, enunciats[random!!].toString(), (800-layout!!.width)/2, 370f)
        gameInstance.batch!!.end()
        gameInstance.batch!!.begin()
        for (i in 0 until image.size){
            gameInstance.batch!!.draw(image[i], form[i].x, form[i].y, form[i].width, form[i].height)

        }
        extendSize()
        gameInstance.batch!!.end()

        if (Gdx.input.isTouched()){
            touching()
        }
    }


    private fun addColors(){
        var display : Rectangle = Rectangle()
        image?.add(Texture("yellow_color.jpg"))
        display.x = 100f; display.y = 200f; display.width = 80f; display.height = 80f
        form.add(display)

        display = Rectangle()
        image?.add(Texture("green_color.png"))
        display.x = 210f; display.y = 200f; display.width = 80f; display.height = 80f
        form.add(display)

        display = Rectangle()
        image?.add(Texture("pink_color.jpg"))
        display.x = 100f; display.y = 90f; display.width = 80f; display.height = 80f
        form.add(display)

        display = Rectangle()
        image?.add(Texture("blue_color.jpg"))
        display.x = 210f; display.y = 90f; display.width = 80f; display.height = 80f
        form.add(display)

        display = Rectangle()
        image?.add(Texture("ribbon.png"))
        display.x = 500f; display.y = 90f; display.width = 200f; display.height = 200f
        form.add(display)


    }
    private fun randomText(){
        enunciats.add("El llaç és de color groc")
        enunciats.add("El llaç és de color verd")
        enunciats.add("El llaç és de color rosa")
        enunciats.add("El llaç és de color blau")

        random = (0..3).random()
        layout!!.setText(gameInstance.font, enunciats[random!!].toString())
    }

    private fun extendSize(){
            GlobalScope.launch(Dispatchers.Main){
                while(gameInstance.isDisplaying){
                    for (i in 0 until form.size-1){
                        form[i].width = 80f; form[i].height = 80f
                    }
                    for (i in 0 until 15){
                        for (i in 0 until form.size-1){
                            form[i].width += 1f; form[i].height += 1f
                            Gdx.app.log("1", "Coroutine 1a part");
                        }
                        delay(100)
                    }
                    for (j in 0 until 15){
                        for (j in 0 until form.size-1){
                            form[j].width -= 1f; form[j].height -= 1f
                            Gdx.app.log("1", "Coroutine 2a part");
                        }
                        delay(100)
                    }
                }
            }
    }
    override fun dispose() {
        gameInstance.batch!!.dispose()
        gameInstance.font_generator!!.dispose()
    }

    private fun touching(){
        gameInstance.touch.set(Gdx.input.getX().toFloat(), Gdx.input.getY().toFloat(), 0f)
        camera.unproject(gameInstance.touch)

        for(i in 0 until form.size){
            if (form[i].contains(gameInstance.touch.x, gameInstance.touch.y)){
                when (i){
                    0 -> {
                        image?.removeAt(4)
                        image?.add(4, Texture("yellow_ribbon.png"))

                    }
                    1 -> {
                        image?.removeAt(4)
                        image?.add(4, Texture("green_ribbon.png"))
                    }
                    2 ->{
                        image?.removeAt(4)
                        image?.add(4, Texture("pink_ribbon.png"))
                    }
                    3 -> {
                        image?.removeAt(4)
                        image?.add(4, Texture("blue_ribbon.png"))
                    }

                }
            }
        }
    }
  


}

java kotlin libgdx kotlin-coroutines
1个回答
0
投票

Dispatchers.Main
不适合用于更新游戏对象。您正在处理非线程安全的内容,并且 libGDX 不使用主线程,因此您正在混合线程。

如果您想在 libGDX 中使用协程,您将需要使用单线程的调度程序并使用 OpenGL 线程(游戏线程)。在 GitHub 上查找 libKtx 库。它有一个协程模块,可以为您设置调度程序和一个游戏 CoroutineScope,以便您可以使用它来启动您的协程。

© www.soinside.com 2019 - 2024. All rights reserved.