![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Gast
Beiträge: n/a
|
Hi, damit man als Benutzer Java-Applets ohne Sicherheitsbedenken ausführen kann, gelten Applets ja als "untrusted" Anwendung, d.h. Dateizugriffe aufs Filesystem werden aus Sicherheitsgründen unterbunden. Das ist auch gut so, dennoch hab ich mal eine Frage dazu : Kann ich externe Daten laden, die sich zum Beispiel innerhalb des JAR-Files befinden, oder ist dies nicht möglich ? Welche Limitierungen gibt es da ? Ich erzähl mal was zu den Hintergründen Ich arbeite zur Zeit an meinem ersten etwas größeren Projekt in Java : ein Remake eines alten Spieles vom Amstrad CPC 464/664/6128 : "Rebel Star" (rundenbasiertes Strategiespiel, Vorgänger von "Laser Squad"). Die Spritedaten sind in 2 externen Binärdateien gespeichert. Eine ".pal"-Datei für die Palette und eine ".img"-Datei für die eigentlichen Daten. Insgesamt sind es 128 Sprites, je 16x16 Pixel groß, 8 Bit/Pixel - bin mir aber noch nicht sicher ob ich mich strikt an die Originalgrafiken halte, dann könnte ich die Daten auf 2 Bit/Pixel reduzieren. Komprimierung verwende ich erstmal keine, aber ich glaube auch nicht, dass es bei einer Datenmenge von 32 K (8 Bit), bzw. 8 K (2 Bit) soo viel ausmacht. Ich programmiere das Ganze zur Zeit als StandAlone-Programm (ein Canvas in einem JFrame) - frage mich aber, ob ich, wenn ich es in ein Applet umbaue, die Möglichkeit habe, Dateien zu laden ? Ich liste mal meine Laderoutine, vielleicht habt ihr ja noch einige Verbesserungsvorschläge. Ich bin, was Java angeht, noch ein Nasenbär, daher bin ich für jeden Senf offen Code: public class Sprites {
Image[] img;
IndexColorModel pal;
// palette data
byte[] red=null;
byte[] green=null;
byte[] blue=null;
// sprite data
char anz=0;
char[] xanz=null;
char[] yanz=null;
int[] sz=null;
byte[][] pixeldata=null;
// byteCombine setzt 2 Bytes zu einem 16-Bit Char zusammen, die Bytes werden
// als unsigned behandelt. Ich hab bis jetzt keine andere Möglichkeit gefunden,
// das zu implementieren. Vielleicht kennt ihr eine bessere Möglichkeit ?
public char byteCombine(byte lo,byte hi)
{
return (char)(
((lo<0)?(256+lo):lo) + ((hi<0)?(256+hi):hi) * 256 );
}
// Dateiformat :
// in den ersten 2 Bytes steht die Sprite-Nummer des letzen Bildes (=Anzahl -1)
// in den nächsten (Anzahl * 2) Bytes stehen die Bildbreiten der einzelnen Sprites
// in den nächsten (Anzahl * 2) Bytes stehen die Bildhöhen der Sprites
// in den nächsten Bytes stehen die Pixeldaten
public boolean load(String filename)
{
int i;
byte[] buffy; // all-purpose buffer
Toolkit tk = Toolkit.getDefaultToolkit();
try {
FileInputStream f=new FileInputStream(filename);
buffy=new byte[2];
f.read(buffy,0,2);
anz=(char)(1+byteCombine(buffy[0],buffy[1]));
xanz=new char[anz];
yanz=new char[anz];
sz=new int[anz];
img=new Image[anz];
pixeldata=new byte[anz][];
buffy=new byte[anz*2];
f.read(buffy,0,2*anz);
for (i=0;i<anz;i++)
xanz[i]=byteCombine(buffy[i*2],buffy[i*2+1]);
f.read(buffy,0,2*anz);
for (i=0;i<anz;i++)
yanz[i]=byteCombine(buffy[i*2],buffy[i*2+1]);
for (i=0;i<anz;i++)
{
sz[i]=(int)xanz[i]*yanz[i];
pixeldata[i]=new byte[sz[i]];
f.read(:pixeldata[i],0,sz[i]);
ImageProducer ip=new
MemoryImageSource(xanz[i],yanz[i],pal,
pixeldata[i],0,xanz[i]);
img[i]=tk.createImage(ip);
}
f.close();
} catch (IOException e)
{
e.printStackTrace();
return false;
}
return true;
}
public boolean loadPalette(String filename)
{
red=new byte[256];
green=new byte[256];
blue=new byte[256];
System.out.println("Loading palette : "+filename);
try {
FileInputStream f=new FileInputStream(filename);
f.read(red,0,256);
f.read(green,0,256);
f.read(blue,0,256);
f.close();
} catch (IOException e)
{
e.printStackTrace();
return false;
}
pal=new IndexColorModel(8,256,red,green,blue);
return true;
}
};
PS: Sicherlich hätte ich das ganze auch einfacher haben können, wenn ich zum Beispiel einfach .gif-Dateien genommen hätte, aber auf 128 GIF-Dateien hatte ich nicht so die Lust An sich funktioniert die Routine aber schonmal, hier ein Screenshot... erinnert sich jemand an diese Grafik ? |
|
| | Nach oben #2 |
| Erfahrener Benutzer Registriert seit: 29.05.2004
Beiträge: 228
|
Laden von Dateien aus dem eigenen Jar sollte eigentlich schon gehen. Ich glaub via den Classloader oder so. MfG Peschmä
__________________ Amazon.de | The Java Trap | Freie Software | Freie Software vs. Open Source | GNU Classpath | GCJ | SableVM "We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil." - Donald Knuth |
| | |
| | Nach oben #3 |
| Gast
Beiträge: n/a
|
Ah, hat sich erledigt. Ich kann zwar nicht ohne weiteres Daten aus dem eigenen Jar laden, aber es funktioniert, wenn ich die Grafiken einfach ins selbe Verzeichnis kopiere wie das Jar-File. Wenn das Applet auf einer Webseite ist, holt sich das Applet die Grafikfiles automatisch vom Webserver. Für mich als Neuling war das garnicht mal so selbstverständlich - aber probieren ging mal wieder über studieren |
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Java Applet soll Daten an ein PHP Script senden | flanger | Allgemeine Java-Programmierung | 5 | 16.05.2007 16:52 |
| applet wird nicht angezeigt | function | Desktop-Applikationen und Grafik | 4 | 31.10.2005 12:48 |
| Policy Datei für Applet konfigurieren | bobcho | Desktop-Applikationen und Grafik | 14 | 28.06.2005 21:59 |
| Applet korrekt einbinden | bicpi | Allgemeine Java-Programmierung | 1 | 15.01.2005 06:13 |
| 2 Applet miteinander kommunizieren | mr.no | Allgemeine Java-Programmierung | 3 | 23.11.2004 20:47 |