нужна помощь в реализации алгоритма, который будет анализировать определенные текстуры из текстуры в 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++
}
}
}