нужна помощь в реализации алгоритма, который будет анализировать определенные текстуры из текстуры в libgdx

      import com.badlogic.gdx.Gdx
import com.badlogic.gdx.files.FileHandle
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion
import java.lang.Exception
import kotlin.math.floor

lateinit var AssetMap: MutableMap<String, Texture>
lateinit var SheetAssets: MutableMap<String, MutableMap<String, TextureRegion>?>
object Assets {
    lateinit var fileHandle: FileHandle
    fun loadAssets()
    {
        loadAssets(DefaultAssetDirectory)
    }
    fun loadAssets(directory: String)
    {
        AssetMap = mapOf<String, Texture>().toMutableMap()// Current implementation resets the map at load
        fileHandle = Gdx.files.local(directory)
        var fileList = fileHandle.list()
        for(file in fileList)
        {
            if(file.extension() == "png")
                try
                {
                    AssetMap[file.nameWithoutExtension()] = Texture(directory+file.name())
                }
                catch(e: Exception) {

                }
        }
    }

    /**
     * for very basic sprite sheets.
     * Since you won't input a name List in this function, they will be named by their index.
     * The function will probably start scanning from top left 0,0
     * @param directoryToSheet local directory to sheet
     * @param spaceBetweenX only the space between textures, doesnt work forspace between the texture and the border
     * @param spaceBetweenY only the space between textures, doesnt work forspace between the texture and the border
     */
    fun loadSheetAtlas(directoryToSheet: String, width: Int, height: Int, spaceBetweenX: Int, spaceBetweenY: Int, spritesX: Int, spritesY: Int)
    {
        loadSheetAtlas(directoryToSheet, null, width, height, spaceBetweenX, spaceBetweenY, spritesX, spritesY)
    }

    /**
     * for very basic sprite sheets.
     * Since you won't input a name List in this function, they will be named by their index.
     * @param directoryToSheet local directory to sheet
     * @param names if this is null, they will be named by their index
     * @param spaceBetweenX only the space between textures, doesnt work forspace between the texture and the border
     * @param spaceBetweenY only the space between textures, doesnt work forspace between the texture and the border
     */
    fun loadSheetAtlas(directoryToSheet: String, names: List<String?>?, width: Int, height: Int, spaceBetweenX: Int, spaceBetweenY: Int, spritesX: Int, spritesY: Int)
    {
        SheetAssets = mutableMapOf<String, MutableMap<String,TextureRegion>?>()
        var nameToConvert = Gdx.files.local(directoryToSheet).nameWithoutExtension()
        nameToConvert = nameToConvert.replace(' ', '-').toLowerCase()
        var sheet = Texture(directoryToSheet)
        var nameIndex = 0
        if(!SheetAssets.keys.contains(nameToConvert)) // to see if we have parsed it already
        {
            SheetAssets[nameToConvert] = mutableMapOf<String, TextureRegion>()
            for(x in 0 until spritesX)
            {
                for(y in 0 until spritesY) // when i put a -1 to spritesX/Y the keycount becomes 121 for 12,12?
                {   // I check for if names is null every single loop, can be optimised to check for once but that'd be premature optimisation
                    var keyToAdd = if((names != null) && (names[nameIndex] != null) ) names[nameIndex]!! else nameIndex.toString()
                    if(x == spritesX - 1)
                    {
                        var textureToAdd = TextureRegion(sheet,
                            ((spritesX+spaceBetweenX))-spaceBetweenX,
                            ((spritesY+spaceBetweenY))-spaceBetweenY,
                            width,height)
                        SheetAssets[nameToConvert]!![keyToAdd] = textureToAdd
                    }
                    else // these will work if textures use bottom left origin point
                    {
                        var textureToAdd = TextureRegion(sheet,  // these dont work, continue from here
                            ((spritesX+spaceBetweenX)*spritesX),
                            ((spritesY+spaceBetweenY)*spritesY),
                            width,height)
                        SheetAssets[nameToConvert]!![keyToAdd] = textureToAdd
                    }
                    nameIndex++
                }
            }
        }

    }
}

так что это код, который я написал, он по какой-то причине возвращает только определенную текстуру из определенной области во всей текстуре, однако ширина и высота правильные.

Теперь, чтобы объяснить эту проблему, ее можно в основном решить как xPos = texture.width / texture size% texture size something. но проблема здесь в том, что есть смещения. смещения между текстурами и АБСОЛЮТНО не между текстурами и границами. вы можете увидеть мой код выше, я попытался добавить смещение, вычесть смещение и т. д., но, похоже, он не работает ... любая помощь?

edit: также с текущей реализацией, единственное, что у изменяемого есть внутри, это textureRegion, найденный в 144,144, width: 16, height:16 originpoint:topleft таблицы спрайтов

код иллюстрации

1 ответ

Это лучшее, что я могу сделать из вашего объяснения. Я думаю, вы слишком усложняете определение регионов. Это соответствует вашему описанию. Нет причин относиться к последней строке иначе, чем к остальным.

Вы также должны сделать SheetAssets а val вместо того lateinit varчто вы переопределяете каждый раз, когда вызывается эта функция. Это приводит к утечке всех ваших старых текстур и делает их недоступными.

И я использовал оператор if с ранним возвратом, чтобы уменьшить вложенный код. И я использовал getOrPut а также ?: чтобы исключить некоторые из ваших избыточных нулевых утверждений.

      val SheetAssets = mutableMapOf<String, MutableMap<String,TextureRegion>>()

//...

fun loadSheetAtlas(directoryToSheet: String, names: List<String?>?, width: Int, height: Int, spaceBetweenX: Int, spaceBetweenY: Int, spritesX: Int, spritesY: Int)
{
    val nameToConvert = Gdx.files.local(directoryToSheet).nameWithoutExtension()
        .replace(' ', '-').toLowerCase()
    if (nameToConvert in SheetAssets.keys) {
        return
    }
    val sheet = Texture(directoryToSheet)
    var nameIndex = 0
    for(x in 0 until spritesX)
    {
        for(y in 0 until spritesY)
        {   
            val keyToAdd = names?.get(nameIndex) ?: nameIndex.toString()            
            val outMap = SheetAssets.getOrPut(nameToConvert) { mutableMapOf() }
            outMap[keyToAdd] = TextureRegion(
                sheet,
                x * (spaceBetweenX + width),
                y * (spaceBetweenY + height),
                width,
                height
            )
            nameIndex++
        }
    }

}
Другие вопросы по тегам