Portieren auf Java Desktop Anwendung

  • 7 Antworten
  • Letztes Antwortdatum
Railwanderer

Railwanderer

Ambitioniertes Mitglied
11
Hallo zusammen,
ich möchte ein simples Android Game Framework für Java Porten.

wer das ganze Framework sehen möchte bitte in der Signatur auf ForumProjekt klicken und bei Github die 2 Repesitories einsehen.

Wie bewerkstellige ich folgendes unter Java? :




________INTERFACE______

public interface FileIO {

// Load assets from apk package
InputStream readAsset(String fileName) throws IOException;

// Load files from storage (SD)
InputStream readFile(String fileName) throws IOException;
OutputStream writeFile(String fileName) throws IOException;

}

_______ANDROID IMPLEMENTATION_______

public class AndroidFileIO implements FileIO {

Context context;
AssetManager assets;
String externalStoragePath;


// Constructor
public AndroidFileIO(Context context) {

this.context = context;
this.assets = context.getAssets();
this.externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;

}

@override
public InputStream readAsset(String fileName) throws IOException {

return assets.open(fileName);
}

@override
public InputStream readFile(String fileName) throws IOException {
return new FileInputStream(externalStoragePath + fileName);
}


@override
public OutputStream writeFile(String fileName) throws IOException {
return new FileOutputStream(externalStoragePath + fileName);
}


}
 
Hier meine bisherige Methode unter Java etwas zu laden:

public void load(String filename){
BufferedReader in = null;
File file1 = new File("/Users/jesjjes/AndroidStudioProjects/MapWindowTest/app/src/main/assets/"+filename+".text");
try {
in = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));

} catch (IOException e) {
// :( It's ok we have defaults
} catch (NumberFormatException e) {
// :/ It's ok, defaults save our day
}
finally {

try {
if (in != null)
in.close();
}
catch (IOException e) {
}
}
}

Wie kann ich das auf einen Nenner bringen?
 
Ich glaub den Assetmanager muss man in Java selbst Implementieren. Man könnte dazu vlt eine Klasse erstellen die eine Hashmap besitzt die dann die Referenzen auf die Assets speichert. Um verschiedene Assets zu unterstützenwäre vlt auch der Einsatz von Generics sinvoll. Dan bräuchte man nicht verschiedene Klassen für verschiedene Datentypen).
 
Ja der AssetsManager wird im Android Framework auch in der Android Implementation der Interfaces Graphics und Audio verwendet.

Kann ich nicht einfach das Android Framework umschreiben dass es eben Dateien nicht über den AssetsManager lädt sondern eben auch per
InputStream direkt über einen vorgegeben Pfad abruft, wie bei java? Dann wär die Sache doch schnell erledigt, mit dem einzigen Nachteil dass
wahrscheinlich die AssetsManager Variante schneller lädt und somit für meine eine splashscreen am Anfang vom spiel notwendig wäre um alles vorzuladen,
was für mich aber als vernachlässigbar gilt, da es ein simples Framework werden soll, für "simple" games
 
Du kannst denn Code auch unter Android ausführen. Nur du muss beachten, ob du die Berechtigung hast, die Daten zu lesen und schreiben. Und da liegt das Problem, denn auf den verschieden Devices können sich die Pfade unterscheiden.

Java Desktop und Android sind zwei verschiedene Paar Schuhe. Google hat die Java-Klassen für Android angepasst, weshalb du ja auch ein spezielles SDK für Android brauchst. D.h. auch, dass es nicht alle Java-Klassen für Desktop-Applikationen auch unter Android vorhanden sind. Man sollte schon relativ viel Manpower haben, wenn man so etwas versucht.

Wenn Du ein Spiel für verschiedene Plattformen entwickeln möchtest, solltest du vielleicht besser ein Framework für Spielprogrammierung benutzen (z.B Unity, Unreal Development Kit usw).
 
Ja dass ich unterschiedliche libraries benutze ist mir schon bewusst ;)
Ich möchte nur eine Schnittstelle finden ab der es nicht mehr auf das darunterlegende Betriebssystem ankommt.
zb könnte das input interface des frameworks auch die Methode getFile() vorgeben, und ich implementiere diese
methode des frameworks unterschiedlich für die jeweilige version. Das spätere spiel ( die Klassen) rufen jedoch höchstens die getFile()
Funktion des frameworks auf, und können dann mit dem Bild oder was auch immer arbeiten. Somit muss ich nicht den ganzen game code anpassen sondern nur die Schnittpunkte zwischen spiel-framework-environment
[doublepost=1460503460,1460503105][/doublepost]es soll quasi an hand von snake so funktionieren, dass wenn ich die späteren snake game klassen - die nur die interfaces nutzen bzw die
Klassen benutzen die das Interface implementieren - in das android framework kopiere das game für android läuft, und wenn ich sie in das
java framework kopiere, das game als java Anwendung läuft. Dabei braucht der gamecode nur die Methoden aus den Interfaces, die ich natürlich je nach version anders implementiere. und da stecke ich und weiss nicht wie ich den assetsmanager auf java umgehe bzw die Methoden des interfaces ( Rückgabewert inputstream des assetsmanager) in einen Rückgabewert änder der auch unter einer Desktop Anwendung sinn macht.
 
anders gefragt, wie formuliere ich ein interface dass eine Methode zum laden eines Bildes hat,

unter android wäre das als bitmap nutzbar, also sollte die Methode des interface zb ein bitmap liefern.
Aber macht das auch unter java sinn? ist das die selbe bitmap klasse?
oder wie kann ich da was finden das für beides klappt, sonst nur den filepath als string nutzen? man so schwer kann doch meine frage
gar nicht sein
[doublepost=1460536175,1460535995][/doublepost]anderes Beispiel:
würde ich unter android ein Fenster öffnen nutze ich surfaceview, unter java JFrame.
Wie sähe ein interface aus mit der Methode openFenster(), die ich unter android so und unter java so implementiere ?
Ohne Rückgabewert? und sie öffnet einfach das entsprechende Drumrum? mit rückgabewert - also vielleicht einer selbst
geschriebenen Klasse GameFenster da je nach um JFrame oder surfaceview erweitert wird??

ich will keinen code von euch einfach nur einer Erläuterung der Herangehensweise .
[doublepost=1460539678][/doublepost]ok ich habe die Antwort nun auf stackoverflow bekommen, InputStream ist Plattform übergreifend kompatibel,
dh ich kann ab diesem Punkt abgreifen und den gamecode in der Sache unabhängig von der platform machen, wenn
ich das Framework entsprechend implementiere.

Wer weiter daran interessiert ist wie es um die anderen Interfaces ( graphic audio etc ) steht , der kann in meiner Signatur auf
das Formprojekt klicken. Dort werde ich mich jetzt an die Implementierung wie vorgeschlagen machen und wenn es funktioniert die
Änderungen und den Stand posten sowie auf GitHub aktualisieren, Nachfolgend die Fragen und Antworten auf stackoverflow:

Interface for java and android implementation

Porting Android Input to Java Desktop Application
 
Zurück
Oben Unten