我正在使用 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"))
}
}
}
}
}
}
Dispatchers.Main
不适合用于更新游戏对象。您正在处理非线程安全的内容,并且 libGDX 不使用主线程,因此您正在混合线程。
如果您想在 libGDX 中使用协程,您将需要使用单线程的调度程序并使用 OpenGL 线程(游戏线程)。在 GitHub 上查找 libKtx 库。它有一个协程模块,可以为您设置调度程序和一个游戏 CoroutineScope,以便您可以使用它来启动您的协程。