Ошибка чтения изображения из scala playn

Я изучил и изучил игровой фреймворк PlayN, и он мне очень понравился. Я программирую на Scala и на самом деле не знаю Java, но обычно это не проблема, так как они отлично работают вместе.

Я создал базовый проект в eclipse и импортировал все библиотеки и зависимости. Я даже перевел базовый код проекта maven. Вот два файла:

Дух времени.скала

package iris.zeit.core

import playn.core.PlayN._

import playn.core.Game
import playn.core.Image
import playn.core.ImageLayer

class Zeitgeist extends Game {

  override def init (){
    var bgImage: Image = assets().getImage("images/bg.png")
    var bgLayer: ImageLayer = graphics().createImageLayer(bgImage)
    graphics().rootLayer().add(bgLayer)
  }

  override def paint (alpha: Float){
    //painting stuffs
  }

  override def update(delta: Float){

  }

  override def updateRate(): Int = {
    25
  }

}

Главная.скала

package iris.zeit.desktop

import playn.core.PlayN
import playn.java.JavaPlatform
import iris.zeit.core.Zeitgeist

object Main {
    def main(args: Array[String]){
        var platform: JavaPlatform = JavaPlatform.register()
        platform.assets().setPathPrefix("resources")
        PlayN.run(new Zeitgeist())
    }
}

Самое крутое, что это работает! Отлично встает окно. Единственная проблема в том, что я не могу загрузить изображения. С приведенной выше строкой "assets().getImage("images/bg.png")" она выскакивает

Could not load image: resources/images/bg.png [error=java.io.FileNotFoundException: resources/images/bg.png]

Я играл с расположением моего файла ресурсов безрезультатно. Я даже сам смог найти bg.png с помощью java.io.File. Я делаю что-то не так? Я что-то забыл?


person G1i1ch    schedule 20.01.2013    source источник


Ответы (2)


Глядя на код JavaAssetsManager, похоже, он пытается загрузить ресурс, а не файл. Поэтому вы должны убедиться, что ваши изображения действительно находятся в пути к классам и по указанному вами пути ("resources/images/bp.png").

Кроме того, вы можете использовать getRemoteImage и передать URL-адрес файла. Поскольку вам удалось использовать java.io.File, вы можете просто получить URL-адрес с помощью метода toUri файла (toUrl устарел).

person Didier Dupont    schedule 20.01.2013

Это почти наверняка не работает, потому что вы делаете это:

platform.assets().setPathPrefix("resources")

Это означает, что вы говорите, что ваша исходная папка выглядит так:

src/main/resources/resources/images/bg.png
src/main/resources/resources/images/pea.png
src/main/resources/resources/images

Я думаю, что это на самом деле выглядит примерно так:

src/main/resources/assets/images/bg.png  <-- 'assets' the default prefix
src/main/resources/assets/images/pea.png
src/main/resources/assets/images

or:

src/main/resources/images/bg.png  <-- You have failed to put a subfolder prefix in
src/main/resources/images/pea.png
src/main/resources/images

Вы можете сделать это, если у вас нет префикса:

plat.assets().setPathPrefix("")

Или просто поместите свои файлы в подпапку assets внутри папки resources.

Стоит отметить, что текущая реализация вызывает:

getClass().getClassLoader().getResource(...)

Нет:

getClass().getResource(...)

Разница описана в другом месте, но tldr заключается в том, что plat.assets.getImage("images/pea.png") будет работать, а plat.assets.getImage("/images/pea.png") — нет.

person Doug    schedule 03.11.2018