Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add more detailed asset credits to the top level Readme #1490

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

AMatutat
Copy link
Contributor

@AMatutat AMatutat commented Apr 13, 2024

Fixes #1484

Im alten Readme gab es nur eine vage Beschreibung der Herkunft der Assets. Für Außenstehende war nicht ersichtlich, welche Assets genau woher kommen.

Dieses PR:

  • verfeinert die Auflistung in der Readme und gibt @dkirshner und @fwatermann expliziter Credits (insbesondere für die "wichigen" Texturen)
  • fügt eine Anmerkung zum Verweis auf externe Ressourcen hinzu, um klarzustellen, um welche Asset-Typen es sich handelt, die wir übernommen haben

Um die Credits überschaubar zu halten, habe ich nicht jede einzelne Textur mit Credits versehen, sondern Asset-Gruppen.
Die Liste "Misc" umfasst daher den ganzen Kleinkram (z. B. den Craftingkessel).

Das macht es am Ende nicht zu 100 % eindeutig.
Alternative wären:
a) externe Assets vollständig entfernen (das betrifft vor allem Monster)
b) Auflistung der Herkunft jeder einzelnen Textur => das wird eine lange, lange Liste.

@AMatutat AMatutat self-assigned this Apr 13, 2024
@AMatutat AMatutat requested a review from cagix as a code owner April 13, 2024 11:45
@AMatutat
Copy link
Contributor Author

@cagix laut Readme steht unser Logo auch unter CC0 1.0. vielleicht sollte man das nicht tun? Nachher macht damit noch irgendwer irgendein schmarn.

Assets unter CC0 find ich richtig und wichtig aber das Logo.....

@AMatutat AMatutat changed the title more detailed credits add more detailed asset credits to the top level Readme Apr 13, 2024
@cagix
Copy link
Member

cagix commented Apr 13, 2024

@cagix laut Readme steht unser Logo auch unter CC0 1.0. vielleicht sollte man das nicht tun? Nachher macht damit noch irgendwer irgendein schmarn.

Assets unter CC0 find ich richtig und wichtig aber das Logo.....

@AMatutat meinst du? hmmm.

man könnte es unter was anderes stellen, cc by-sa oder so, wie die paper. würde das helfen?

@cagix
Copy link
Member

cagix commented Apr 13, 2024

a) externe Assets vollständig entfernen (das betrifft vor allem Monster)

finde ich spannend. aber das würde auch für sounds gelten müssen, damit es insgesamt sinnvoll wird, oder?

ins unreine gesprochen: könnten wir sowas ähnliches wie mit core und contrib auch mit assets und sounds machen, also im asset/-ordner unterordner nach "art" (textur vs sound) und darunter ordner mit herkunft und darin dann die eigentlichen artefakte? dann könnte man nämlich in jeden ordner konkret lizenz und urheber benennen (je ein kleines readme). vermutlich müsste man das asset-handling etwas anpassen, da dann mehrere oberordner über den eigentlichen assets ("blue-knight") zu durchsuchen sind ...

@AMatutat
Copy link
Contributor Author

ins unreine gesprochen: könnten wir sowas ähnliches wie mit core und contrib auch mit assets und sounds machen, also im asset/-ordner unterordner nach "art" (textur vs sound) und darunter ordner mit herkunft und darin dann die eigentlichen artefakte? dann könnte man nämlich in jeden ordner konkret lizenz und urheber benennen (je ein kleines readme). vermutlich müsste man das asset-handling etwas anpassen, da dann mehrere oberordner über den eigentlichen assets ("blue-knight") zu durchsuchen sind ...

find ich gut... ich schau mir das mal an

Thema Logo: cc by-sa klingt gut und könnte sich mit dem konzept von oben auch einsortieren lassen.

@AMatutat AMatutat marked this pull request as draft April 13, 2024 16:43
@AMatutat
Copy link
Contributor Author

AMatutat commented Apr 14, 2024

@cagix bevor ich loslege, sollte wir ne Struktur/Benennung abklären.

Ich hätte jetzt sowas wie

assets/
    textures/
        self/
            CREDIT.MD (hinweis auf alle von uns, die was beigesteuert haben)
            LICENSE
            sub1/
            sub2/
            ...
        external/
            ${name_quelle1}/
                CREDIT.MD (hinweis + link auf die herkunft)
                LICENSE
                sub1/
                sub2/
                ...
            ${name_quelle2}/
                CREDIT.MD (hinweis + link auf die herkunft)
                LICENSE
                sub1/
                sub2/
                ...

im Kopf.

(Für Musik o.ä entsprechend analog)

@cagix
Copy link
Member

cagix commented Apr 14, 2024

ich würde die ebene "external" weglassen - das ist unnötig und würde das tooling verkomplizieren ... und "license" sollte auch die endung ".md" haben. aber sonst ist das das bild, was ich im kopf hatte 👌

das "subN" ist dann unsere alte struktur, also beispielsweise "character/monster/" oder "objects/mailbox/", richtig?

und diese neue struktur gibt es in jedem subproject, wo wir assets haben?

und vermutlich müsste man das auch in den jeweiligen test-assets so handhaben. (eigentlich könnte/sollte man jetzt auch nochmal drüber nachdenken, ob wir wirklich spezielle assets für die tests brauchen oder dort die normalen assets nutzen könnten. die umsetzung wäre für mich aber ein separater pr, bevorzugt vor diesen änderungen hier.)

am besten wäre es, wenn man im nutzenden code nichts weiter ändern müsste, also weiterhin einfach "character/blue-knight/" laden könnte.

edit: wenn sich der kram unter "self" so aufteilen ließe, dann könnte man statt "self" auch direkt ordner mit den namen der beitragenden machen (analog zu den externen assets). dann wäre das uniform. aber auch recht kleinteilig (wenn es denn überhaupt geht).

@AMatutat
Copy link
Contributor Author

AMatutat commented Apr 14, 2024

ich würde die ebene "external" weglassen - das ist unnötig und würde das tooling verkomplizieren ... und "license" sollte auch die endung ".md" haben. aber sonst ist das das bild, was ich im kopf hatte 👌

passt.

das "subN" ist dann unsere alte struktur, also beispielsweise "character/monster/" oder "objects/mailbox/", richtig?

exakt

und diese neue struktur gibt es in jedem subproject, wo wir assets haben?

ja

und vermutlich müsste man das auch in den jeweiligen test-assets so handhaben. (eigentlich könnte/sollte man jetzt auch nochmal drüber nachdenken, ob wir wirklich spezielle assets für die tests brauchen oder dort die normalen assets nutzen könnten. die umsetzung wäre für mich aber ein separater pr, bevorzugt vor diesen änderungen hier.)

Gedanke damals: Wenn ich Test-Assets habe, dann sind die Testfälle unabhängig von Änderungen an Assets im eigentlichen Code.

Wir haben Testfälle, die benötigen Texturen (z.B. für das DrawSystem). Dem ist eigentlich recht Wurst, welche Texturen das sind, hauptsache sie sind da. Diese müssen aber per Pfad übergeben werden. Wenn der Testfall jetzt mit den Wizard Texturen arbeitet (einfach damit er irgendwas im Speicher hat) und du die Wizard Texturen aber löschst/bewegst/umbenennst, dann platzt der Testfall und du müsstest nochmal extra da ran gehen und neue Dummy-Assets hinterlegen (du schiebst das Problem dann zum nächsten).

Für manche Tests müssen auch gewisse Szenarien simuliert werden (z.B. was ist, wenn eine Textur fehlt). Im Testasset-Ordner kannst du dir das einfach so basteln, im Live-Code wird das eher schwierig.

Das war ein mickriger Versuch die Lage zu erklären. Hoffentlich war das halbwegs verständlich.

am besten wäre es, wenn man im nutzenden code nichts weiter ändern müsste, also weiterhin einfach "character/blue-knight/" laden könnte.

Ja, das wäre tatsächlich am besten. Man könnte Versuchen, beim Einlesen der Texturen über den Pfad im Code (character/blue-knight/) (eigentlich in ersteller/character/blue-knight/) den Top-Level Ordner (also hier ersteller/) automatisch vervollständigen zu lassen.
Ins unreine gesprochen: aus einem load(path) wird ein load(*/path). Das platzt dir natürlich an der stelle, an der es in zwei Top-Level Ordner ein character/blue-knight/ gibt.

Edit: libGDX schein das laden mit * nicht zu supporten (oder ich bin zu doof), aber eine einfache Util-Function "findFullPath(relPath)" könnte ausreichend sein. Dann gehe ich einfach selber greedy durch alle Ordner und suche den übergeben Pfad und finde so den top level ordner.

edit: wenn sich der kram unter "self" so aufteilen ließe, dann könnte man statt "self" auch direkt ordner mit den namen der beitragenden machen (analog zu den externen assets). dann wäre das uniform. aber auch recht kleinteilig (wenn es denn überhaupt geht).

ja, wäre konsequenter. Dann muss man nur einmal Aufdröseln wer was gemacht hat, aber das krieg ich hin.

@cagix
Copy link
Member

cagix commented Apr 14, 2024

und vermutlich müsste man das auch in den jeweiligen test-assets so handhaben. (eigentlich könnte/sollte man jetzt auch nochmal drüber nachdenken, ob wir wirklich spezielle assets für die tests brauchen oder dort die normalen assets nutzen könnten. die umsetzung wäre für mich aber ein separater pr, bevorzugt vor diesen änderungen hier.)

Gedanke damals: Wenn ich Test-Assets habe, dann sind die Testfälle unabhängig von Änderungen an Assets im eigentlichen Code.

Wir haben Testfälle, die benötigen Texturen (z.B. für das DrawSystem). Dem ist eigentlich recht Wurst, welche Texturen das sind, hauptsache sie sind da. Diese müssen aber per Pfad übergeben werden. Wenn der Testfall jetzt mit den Wizard Texturen arbeitet (einfach damit er irgendwas im Speicher hat) und du die Wizard Texturen aber löschst/bewegst/umbenennst, dann platzt der Testfall und du müsstest nochmal extra da ran gehen und neue Dummy-Assets hinterlegen (du schiebst das Problem dann zum nächsten).

Für manche Tests müssen auch gewisse Szenarien simuliert werden (z.B. was ist, wenn eine Textur fehlt). Im Testasset-Ordner kannst du dir das einfach so basteln, im Live-Code wird das eher schwierig.

bin ich bei dir, das sehe ich im prinzip auch alles so. und normalerweise würde ich das auch exakt so empfehlen/machen :)

aber mir scheint, dass wir bei den vorliegenden testfällen das eigentlich (noch) gar nicht so brauchen. wenn man eine im test verwendete textur löschen würde, dann würde halt auch der test kaputt gehen - analog zu falschen änderungen im code. (ok, das stimmt hier nicht ganz.) und den fall "nicht vorhandene textur" könnte man evtl. simulieren, indem es die verwendete textur einfach nicht gibt?

eigentlich rede ich grad mist und will wider besseres wissen/erfahrung hier ne vereinfachung einbauen ;)

aber im ernst: wir müssten auch in den test-assets immer ganz genau angeben, was von wo und wem. den aufwand könnte man sich erstmal sparen, wenn man im test die "normalen" texturen nutzen würde. zumal das im moment eh afaik kopien sind...

am besten wäre es, wenn man im nutzenden code nichts weiter ändern müsste, also weiterhin einfach "character/blue-knight/" laden könnte.

Ja, das wäre tatsächlich am besten. Man könnte Versuchen, beim Einlesen der Texturen über den Pfad im Code (character/blue-knight/) (eigentlich in ersteller/character/blue-knight/) den Top-Level Ordner (also hier ersteller/) automatisch vervollständigen zu lassen.

ja.

kann leider beliebig lustig werden, da du jetzt vom asset-ordner an rekursiv suchen musst und teilpfade matchen musst.

Ins unreine gesprochen: aus einem load(path) wird ein load(*/path). Das platzt dir natürlich an der stelle, an der es in zwei Top-Level Ordner ein character/blue-knight/ gibt.

first come first serve. das ist dann ein user-problem ;) ... man kann ja in dem fall eine warning loggen.

Edit: libGDX schein das laden mit * nicht zu supporten (oder ich bin zu doof), aber eine einfache Util-Function "findFullPath(relPath)" könnte ausreichend sein. Dann gehe ich einfach selber greedy durch alle Ordner und suche den übergeben Pfad und finde so den top level ordner.

ja, das wirst du selbst bauen müssen.

ich bin im moment noch nicht klar, aber hier eine erste grobe idee: man könnte die menge aller pfade mit start beim asset-ordner auflisten (Set<Path>). Das kannst Du mit Files.walk machen, am besten einmalig beim Start (static). IIRC können Path-objekte Teilpfade matchen - damit könntest du in einem stream aus dem statischen set nach den "character/blue-king" filtern und dann mit findFirst den ersten passenden pfad auflösen und dann von libgdx laden lassen.

das müsste auch aus dem jar heraus klappen - hier solltest du dir vermutlich ein FileSystem für das jar anlegen, danach geht es normal weiter...

edit: wenn sich der kram unter "self" so aufteilen ließe, dann könnte man statt "self" auch direkt ordner mit den namen der beitragenden machen (analog zu den externen assets). dann wäre das uniform. aber auch recht kleinteilig (wenn es denn überhaupt geht).

ja, wäre konsequenter. Dann muss man nur einmal Aufdröseln wer was gemacht hat, aber das krieg ich hin.

find ich gut 👍

@tgrothe
Copy link
Contributor

tgrothe commented Apr 14, 2024

weil es jetzt gerade u. a. um das auffinden von assets geht ... ggf. kann man dafür auch einen teil aus #1366 brauchen, weil ich da eine art path-prefix-/postfix-matching auch schon dabei hatte:

final String dirName = "recipes/";
// Walk through the 'recipes' directory and load all recipes.
final Map<String, List<Path>> subdirectoryMap =
ResourceWalker.walk(new SimpleIPath(dirName), (p) -> p.getFileName().endsWith(".recipe"));

die herausforderung war ... das mit den assets files im normalen file system und im jar file.

@cagix
Copy link
Member

cagix commented Apr 14, 2024

ja, siehe auch #1437. alles anfänge, aber nirgendwo "fertig".

@cagix
Copy link
Member

cagix commented Apr 14, 2024

weil es jetzt gerade u. a. um das auffinden von assets geht ... ggf. kann man dafür auch einen teil aus #1366 brauchen, weil ich da eine art path-prefix-/postfix-matching auch schon dabei hatte:

final String dirName = "recipes/";
// Walk through the 'recipes' directory and load all recipes.
final Map<String, List<Path>> subdirectoryMap =
ResourceWalker.walk(new SimpleIPath(dirName), (p) -> p.getFileName().endsWith(".recipe"));

die herausforderung war ... das mit den assets files im normalen file system und im jar file.

wobei ich definitiv keine Map<String, List<Path>> hier sehe. eine einfache Set<Path> sollte den job erledigen.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cagix @tgrothe ich hatte heute Nachmittag mal "wild drauf rum probiert" (das beschreibt es tatsächlich am besten) und bin hier angekommen.

Für core Funktioniert das aktuell auch (also da kann ich felißig rumschieben) für contrib noch nicht, da muss ich nochmal gucken.

Ich bin mit dem Ansatz aber eh nicht 100% zufrieden,

  1. Läuft der vom Working-Dir los (das kann halt alles sein)
  2. Guckt der sich Rekursiv ALLES an, was vom aktuellen Workingdir erreichbar ist...

Ich mag an den Ansatz, dass er er einfach (zu verstehen/zu lesen) ist. DIe oben genannten Punkte sind natürlich ein KO-Kriterium.

Ich hab mir eure Vorschläge noch nicht angeschaut (mach ich noch), wollte nur diesen Hirnausfluss auch bekannt machen.

Copy link
Member

@cagix cagix Apr 14, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ich würde eher nicht vom workingdir suchen, sondern von den assets.

der asset-ordner wird durch gradle konfiguriert und passend zusammen gestellt im build-ordner, d.h. das klappt dann auch mit den assets aus mehreren subprojekten (die werden quasi summiert/vereinigt). und von java-seite das ist dass dann wunderbar transparent...

alternativ: assets werden ja per default immer zu einer klasse gesucht im asset-ordner. d.h. wenn die klasse foo.bar.Wuppie was laden will, würde per default in <assets>/foo/bar/ gesucht. das könnte man sich zunutze machen - irgendwie haben wir darüber nur nie nachgedacht. das könnte einigen ärger ersparen!

edit: hmmm, das stimmt so nicht ganz. es wird relativ zur klasse im src-ordner gesucht oder irgendwo im asset-ordner. aber vielleicht kann die idee trotzdem nützlich sein, dann könnte man sich das extra "character/" sparen.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

grafik

wtf?! 🤣

Copy link
Member

@cagix cagix Apr 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ich glaube, @AMatutat hat seine workingcopy nicht aktualisiert 😱

edit: nö. es sind einfach nur ziemlich viele texturen, die verschoben werden 🤣

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dat sind Bilder.

@@ -46,7 +46,7 @@ public void setup() throws IOException {
Game.add(velocitySystem);
velocityComponent = new VelocityComponent(xVelocity, yVelocity);
positionComponent = new PositionComponent(new Point(startXPosition, startYPosition));
animationComponent = new DrawComponent(new SimpleIPath("textures/test_hero"));
animationComponent = new DrawComponent(new SimpleIPath("textures/dkirshner/test_hero"));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AMatutat hmmm, das ist eigentlich genau das, was ich vermeiden möchte, also die extra angabe von "textures/dkirshner/"... aber das ist vermutlich nur zum probieren gier drin?

Copy link
Contributor Author

@AMatutat AMatutat Apr 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep. Beim Auto-Refactoring passiert nehm ich an.

@AMatutat
Copy link
Contributor Author

AMatutat commented Apr 15, 2024

Hmpf, ich hatte jetzt die Hoffnung, ich könnte mit einem angepassten Gradle-File

tasks.withType(JavaExec).configureEach {
        dependsOn classes
        standardInput = System.in
        ignoreExitValue true
        systemProperty 'BASELOGDIR', project.baseLogDir
        systemProperty 'RDP', sourceSets.main.resources.srcDirs[0].toString()
    }

Note: Nicht vom [0].toString() verwirren lassen, das Array ist irgendwie immer nur 1-Lang

das asset-dir dynamisch als System-Property hinterlegen und mit System.getProperty("RDP") in Java darauf zugreifen könnte. Dann hätte man einen dynamischen Ansatz und muss nirgends irgendwelche Skripte anpassen, wenn man mal was erweitert + der eigentliche Code bleibt übersichtlich (best of both worlds).

Klappt für das core Projekt auch, für das dungeon Projekt nicht mehr, da die Property immer abhängig vom build.gradle gesetzt wird.

Bedeutet für game/build.gradle ist es game/src/assets und für dungeon/build.gradle ist es dungeon/src/assets, und dann sind im Dungeon-Projekt die Assets aus Game nicht mehr verfügbar.

Aus dungeon/build.gradle:

processResources {
    from new File(project(':game').projectDir, '/assets')
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

das scheint für Gradle-Projekt-Konfiguration zu funktionieren. Ich bräuchte jetzt quasi eine analoge Variante für die System-Properties.

Meine Gradle-Know-how-Grenzen habe ich schon lange hinter mir gelassen, also vielleicht ist das jetzt auch absoluter Schmarrn.

Edit: Ach männo, in der Jar explodiert es dann sowieso...... Nächstes mal Textadventure

@cagix
Copy link
Member

cagix commented Apr 15, 2024

@AMatutat Hmmm, erzähl doch mal bitte, was Du vorhast? Beim Logging war es notwendig, einen Ordner in Gradle zu definieren.

Aber die Assets werden doch durch Gradle (mehr oder weniger) automatisch bedient - beim Kompilieren werden alle Assets zusammengepackt in <subproject>/build/resources/main/ (und <subproject>/build/resources/test/), und ein Wuppie.class.getResourceAsStream() oder Thread.currentThread().getContextClassLoader().getResource(resource) lösen dort auf. Das klappt analog auch mit dem Starten im Jar - hier werden die Ressourcen ja mit reingepackt. Siehe auch #1437 ...

Das einzige Problem war, dass Gradle die Assets der genutzten Projekte nicht selbstständig kopiert (Bug? Feature?). Deshalb mussten wir im Dungeon-Subprojekt den Schnipsel

processResources {
    from new File(project(':game').projectDir, '/assets')
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

in die build.gradle einbauen, um alle Artefakte aus dem genutzten Game-Subprojekt auch zu haben.

Danach ist das aber transparent in Java.

@AMatutat
Copy link
Contributor Author

AMatutat commented Apr 15, 2024

Hmmm, erzähl doch mal bitte, was Du vorhast?

Problem: Ich habe einen Teilpfad wie character/knight.png und muss dazu den vollständigen Pfad (relativ vom asset dir ausgehend) textures/dkirshner/character/knight.png finden, um das Asset mit libGDX einladen zu können.

Lösungs-Idee: Vollständiges Asset-Verzeichnis rekursiv nach dem übergebenen Teilpfad durchsuchen und somit den vollständigen Pfad finden (damit kann libGDX es einlesen).

  • Problem für die Lösung: Ich muss wissen wo das Asset-Verzeichnis liegt.

Das Asset-Verzeichnis ist in Gradle konfiguriert, darauf kann ich scheinbar direkt zugreifen (das wusste ich nicht). Ich würde gerne zusätzliche Konfigurationen vermeiden (one Source of Truth).

Aber die Assets werden doch durch Gradle (mehr oder weniger) automatisch bedient - beim Kompilieren werden alle Assets zusammengepackt in /build/resources/main/ (und /build/resources/test/), und ein Wuppie.class.getResourceAsStream() oder Thread.currentThread().getContextClassLoader().getResource(resource) lösen dort auf.

Nach groben Überblick scheint das nur mit dem vollständigen Pfad zu funktionieren. Wuppie.class.getResourceAsStream() gibts nur mit der Geschmacksrichtung Wuppie.class.getResourceAsStream(path)

@cagix
Copy link
Member

cagix commented Apr 15, 2024

Hmmm, erzähl doch mal bitte, was Du vorhast?

Problem: Ich habe einen Teilpfad wie character/knight.png und muss dazu den vollständigen Pfad (relativ vom asset dir ausgehend) textures/dkirshner/character/knight.png finden, um das Asset mit libGDX einladen zu können.

Lösungs-Idee: Vollständiges Asset-Verzeichnis rekursiv nach dem übergebenen Teilpfad durchsuchen und somit den vollständigen Pfad finden (damit kann libGDX es einlesen).

  • Problem für die Lösung: Ich muss wissen wo das Asset-Verzeichnis liegt.

Das Asset-Verzeichnis ist in Gradle konfiguriert, darauf kann ich scheinbar direkt zugreifen (das wusste ich nicht). Ich würde gerne zusätzliche Konfigurationen vermeiden (one Source of Truth).

Aber die Assets werden doch durch Gradle (mehr oder weniger) automatisch bedient - beim Kompilieren werden alle Assets zusammengepackt in /build/resources/main/ (und /build/resources/test/), und ein Wuppie.class.getResourceAsStream() oder Thread.currentThread().getContextClassLoader().getResource(resource) lösen dort auf.

Nach groben Überblick scheint das nur mit dem vollständigen Pfad zu funktionieren. Wuppie.class.getResourceAsStream() gibts nur mit der Geschmacksrichtung Wuppie.class.getResourceAsStream(path)

was passiert, wenn du bei letzterem einen "." übergibst und dann in dem stream die verzeichnisse anschaust? bzw. in Wuppie.class.getResource(), da kriegst du was zurück, was du mit File.walk traversieren kannst?

@tgrothe
Copy link
Contributor

tgrothe commented Apr 15, 2024

so, nun möchte ich mal herein grätschen ...

character/autor/entityname/<...> funktioniert doch nur solange, wie die animationen eines entitys nur von einem autor:in erstellt wurden (werkelten mehrere autoren an einem entity oder hätte ein autor mehrere entities kreiert, beißt sich das doch) ... wäre es nicht sinnvoller, einen autoren-postfix an jeden dateinamen (ohne dateiendung) zu hängen? dann braucht man die funktion für das einlesen/traversieren der assets doch eigentlich nicht ändern. ... nur ein vorschlag.

@cagix
Copy link
Member

cagix commented Apr 16, 2024

so, nun möchte ich mal herein grätschen ...

character/autor/entityname/<...> funktioniert doch nur solange, wie die animationen eines entitys nur von einem autor:in erstellt wurden (werkelten mehrere autoren an einem entity oder hätte ein autor mehrere entities kreiert, beißt sich das doch) ... wäre es nicht sinnvoller, einen autoren-postfix an jeden dateinamen (ohne dateiendung) zu hängen? dann braucht man die funktion für das einlesen/traversieren der assets doch eigentlich nicht ändern. ... nur ein vorschlag.

@tgrothe danke für die wortmeldung. bitte lies noch einmal den verlauf der diskussion (ja, wiedermal im pr, mein fehler).

es geht hier nicht um code (entitäten o.ä.), sondern um assets (texturen und/oder sounds). jeder code-beitrag ist automatisch "mit", und die quellen sind per git-commit identifizierbar - und letztlich ist bisher alles von mitarbeitern im auftrag erstellt worden und da müsste keiner benannt werden (ist nochmal was anderes als von außen als echter contributor, rechtlich bin ich quasi der auftraggeber).

nur bei den assets haben wir abweichende lizenzen und teilweise fremde quellen, und hier brechen wir uns aktuell im readme einen ab. für diesen fall (und nur für diesen fall) brauchen wir eine praktische lösung. da hier die lizenz i.d.r. von der fremden quelle abhängt, kam die idee nach ordnern mit dem namen der quelle als gruppierenden namespaces auf.

der gedanke war eigentlich, das als <subproj>/assets/texture/author/character/monster/... (also nicht in der von dir genannten reihenfolge) zu haben. damit bildet der autor quasi einen namespace für alle von ihm/ihr erstellten texturen, und man kann darunter dann einmal die lizenzinfo etc. ablegen. wenn wer mehrere texturen gemacht hat, würde das wunderbar passen.

ein problem hätte dieser ansatz in der tat, wenn mehrere leute eine textur gemeinsam erstellt hätten. der gedanke kam mir irgendwie nicht praxisrelevant vor - aber möglicherweise gibt es das doch? @AMatutat? aber die lösung wäre dann einfach, statt der "namen" einen identifikator zu nutzen ("intern", "0x72", "opengameart", "flamtky"). es gibt ja in den ordnern eine lizenz-datei sowie eine datei mit ausführlicher benennung des/der autors/autoren.

einen präfix an jede einzelne datei dran zu pappen, würde aber imho nichts an der situation ändern und zusätzlich die suche nach dateien nur noch unschöner machen.

@cagix
Copy link
Member

cagix commented Apr 16, 2024

<subproj>/assets/texture/author/character/monster/...

@AMatutat sag mal, müssen wir nach sound vs texture unterscheiden? würde nicht <subproj>/assets/IDENTIFICATOR/character/monster/... auch reichen? (mit IDENTIFICATOR als name oder bezeichner des autors)

@tgrothe
Copy link
Contributor

tgrothe commented Apr 16, 2024

@tgrothe danke für die wortmeldung. bitte lies noch einmal den verlauf der diskussion (ja, wiedermal im pr, mein fehler).

my fault, ich hatte nicht die ganze diskussion gelesen. danke.

@AMatutat
Copy link
Contributor Author

AMatutat commented Apr 16, 2024

ein problem hätte dieser ansatz in der tat, wenn mehrere leute eine textur gemeinsam erstellt hätten. der gedanke kam mir irgendwie nicht praxisrelevant vor - aber möglicherweise gibt es das doch? @AMatutat? aber die lösung wäre dann einfach, statt der "namen" einen identifikator zu nutzen ("intern", "0x72", "opengameart", "flamtky"). es gibt ja in den ordnern eine lizenz-datei sowie eine datei mit ausführlicher benennung des/der autors/autoren.

Ich hätte jetzt gesagt, du verwendest eine Namenskombination. Dann gibt es <subproj>/assets/texture/carsten/character/monster/... und vielleicht auch <subproj>/assets/texture/andre_carsten/...
Du gemeinst genau das, oder? Bin mir nur zu 95% sicher.

@AMatutat sag mal, müssen wir nach sound vs texture unterscheiden? würde nicht /assets/IDENTIFICATOR/character/monster/... auch reichen? (mit IDENTIFICATOR als name oder bezeichner des autors)

Ja, müsste. Macht das manuelle Navigieren in den Asset-Foldern evtl. etwas unübersichtlicher.

Technisch versuch ich einen Ansatz zu fahren, dem alles vor (und inklusive) des IDENTIFICATOR/ egal ist.

@AMatutat
Copy link
Contributor Author

AMatutat commented Apr 16, 2024

Thread.currentThread().getContextClassLoader().getResource("."); schmeißt dich im game/build/classes/java/main raus, dh auch nur .class Dateien im Reichweite.
Ich hab dann mal. versucht mit Thread.currentThread().getContextClassLoader().getResource("../../../resources"); manuell in den build-asset ordner zu navigieren, aber dann krieg ich ein null zurück. Das ergibt für mich gar keinen Sinn, weshalb ich einen tieferen Denkfehler vermute.

Wuppie.class.getResource(".") ist auch ein null

Code zum selber testen:
      try {
        URL url = Thread.currentThread().getContextClassLoader().getResource(".");
        if (url == null) {
          System.err.println("Resource not found");
        }
        Path p = Paths.get(url.toURI());

        // Use Files.walk to traverse the directory
        Files.walk(p)
            .forEach(System.out::println); // You can replace this with your desired action
      } catch (URISyntaxException | IOException e) {
        e.printStackTrace();
      }
Output
/Users/andre/Desktop/Dungeon/game/build/classes/java/main
/Users/andre/Desktop/Dungeon/game/build/classes/java/main/core
/Users/andre/Desktop/Dungeon/game/build/classes/java/main/core/configuration
/Users/andre/Desktop/Dungeon/game/build/classes/java/main/core/configuration/KeyboardConfig.class
/Users/andre/Desktop/Dungeon/game/build/classes/java/main/core/configuration/values
/Users/andre/Desktop/Dungeon/game/build/classes/java/main/core/configuration/values/ConfigValue.class
...

Edit: Irgendwie glaube ich, einfach einen Knoten im Kopf zu haben. Das kann und wird ja nicht so schwer sein über den konfigurierten Resource Ordner zu iterieren.

@AMatutat
Copy link
Contributor Author

AMatutat commented May 3, 2024

Fyi: Ich hab das noch auf dem Schirm, grade aber keine aktive zeit dafür.

@cagix
Copy link
Member

cagix commented May 3, 2024

Fyi: Ich hab das noch auf dem Schirm, grade aber keine aktive zeit dafür.

Kein Stress. Das Problem rennt ja nicht weg, und so richtig wahnsinnig zeitkritisch ist es erstmal auch nicht.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Credits: Herkunft der Assets präziser beschreiben
3 participants