Hi,
ich muss für die Uni ein Programm in scheiß Java schreiben und hab jetzt 'ne ganz normale Java Application mit einer public static main-void. Das Programm lädt Bilder aus einem Ordner, der sich im gleichen Verzeichnis befindet.
Wie kann ich daraus jetzt ein Applet machen und muss ich dafür irgendwas stark umstrukturieren oder klatscht man den main-Code dann einfach nochmal in die Applet-main-void?
Und wie kann ich von dem Applet auf die Bilder zugreifen?
Hmm sollte man das nicht in der Uni gelernt haben?
Du musst einfach nur bei der Hauptklasse die Superklasse Applet ableiten.
Und dann noch 5? Methoden implementieren (init(), start, stop, paint, und destroy)
Und dann musste dein Programm in einem HTML File einbinden.
<applet code="main.class"></applet>
Naja, was heißt "gelernt haben"? Man muss es schon "studieren" (sich bilden/bemühen) und ich hatte halt keinen Bock, mich mit Java zu beschäftigen *hust*
Jo, aber diese neuen Methoden init, start, etc. was genau soll da rein? Einfach nochmal der main-Code?
Und wie greift man auf externe Dateien zu? Ich krieg hier nämlich Exceptions..
Jaja ist mir schon klar, aber normalerweise habt ihr es dan doch schon in der Uni durchgemacht wenn eine Aufgabe dazu bekommst.
Und wie soll man helfen wenn man nicht weis wie dein Code aussieht oder deine Fehlermeldungen?
init() wird halt beim ersten mal geladen und auch nur einmal, also ka kannst gui setup machen.
start() wird immer aufgerufen sobald .... zB auf aktualisieren drückst.
die anderen kannst eigentlich ohne Rumpf lassen.
Bilder laden:
tracker = new MediaTracker(this);
Image image = getImage(getCodeBase(),"blubbb"); // Bild ist im gleichen Verzeichnis wie das Applet
tracker.addImage(image, 0);
tracker.waitForAll();
Mediatracker wird halt verwendet damit man sich sicher sein kan das das bild geladen wurde.
Ansonsten kann es sein das das applet lädt aber das bild nicht.
@tnd0: Ich habe halt keine Ambitionen, mich weiter mit Java zu beschäftigen und mich da erstmal in Applets einzulesen, deswegen frage ich nach einer Idiotenlösung, um meinen bisherigen Code einfach und ohne viel Aufwand zu portieren.
@D3adlySil3nc3:
Ich lade Bilder über ImageIO.read(new File("data/sprites/tentacle_porn.png")); und wenn ich das in einem Applet versuche, crasht es. Muss ich jetzt also die ganze Scheiße als Ressourcen hinzufügen, um die dann über .getClass().getResource() zu laden? Oder kann ich irgendwie weiter normale Dateien in Ordnern verwenden?
@D3adlySil3nc3:
Ich lade Bilder über ImageIO.read(new File("data/sprites/tentacle_porn.png")); und wenn ich das in einem Applet versuche, crasht es. Muss ich jetzt also die ganze Scheiße als Ressourcen hinzufügen, um die dann über .getClass().getResource() zu laden? Oder kann ich irgendwie weiter normale Dateien in Ordnern verwenden?
Interessant zu wissen.....
Ein bisschen Eigeninitiative wäre wohl nicht schlecht, ich habe doch schon oben geschrieben wie Bilder einbindest oder was fürn Problem hast noch??
Eine Aufgabe von 3min:
PHP Code:
public class NewApplet extends Applet {
Image hintergrund;
private MediaTracker tracker;
public void init()
{
try {
tracker = new MediaTracker(this);
hintergrund=this.getImage(this.getCodeBase(), "daf2.jpg");
tracker.addImage(hintergrund, 0);
deswegen frage ich nach einer Idiotenlösung, um meinen bisherigen Code einfach und ohne viel Aufwand zu portieren.
Orientiere dich an dem Beispiel über mir. Bei einem Java-Applet gibt es keine static void main() mehr. Die wird durch die void init() ersetzt. Du siehst, die init ist nicht static, sprich du hast direkten zugriff auf deine Attribute und Methoden. Sonst bleibt grob alles gleich, außer halt noch von der Applet-Klasse erben und ggbf. die restliche Applet-Methoden überschreiben. Aber bitte nicht die override annotation vergessen.
Sorry, ich bin ein wenig begriffsstutzig, hier noch einmal genauer, was ich habe und was ich gerne wissen würde:
Also ich habe zZ eine main-Methode, die gekürzt so aussieht:
Code:
public static void main(String[] args) throws InterruptedException
{
game = new Game();
while (game.running)
{
game.Update();
game.Render();
// und ein bisschen die FPS anpassen mit Thread.sleep
}
}
Meine Game-Klasse erbt von Canvas und erstellt im Konstruktor ein JFrame mit einem Panel, zu welchem sie sich selbst hinzufügt.
1. Kann die Game-Klasse weiterhin ein Fenster erzeugen?
Oder muss ich den ganzen Kram umschreiben, sodass Game immernoch von Canvas erbt, aber nicht mehr selbst das Fenster erzeugt, sondern dass es nur von main erzeugt wird, aber halt nicht von init im Falle eines Applets?
2. Kann ich den main-Loop jetzt einfach in init hauen oder muss die Game-Klasse auch noch Runnable implementieren, sodass ich sowohl in main als auch in init dann nur einen neuen Thread starte oder kommt beides auf's Gleiche hinaus, nur das mit dem Thread wäre schöner, da ich so nicht 2x den gleichen Code hätte?
3. Ich habe über fast alle Klassen Dateizugriffe verteilt, in Map werden Bilder geladen, in Player, in Menu, in Sounds werden Sounds geladen, etc. Wie bau ich da jetzt if-Abfragen ein, sodass dynamisch entschieden wird, ob ich IO-Methoden benutzen kann oder solch einen MediaTracker benutzen muss, also ob es sich um eine Applikation oder ein Applet handelt, um das komplette Projekt nicht zweimal haben zu müssen?
PS:
"Jaja ist mir schon klar, aber normalerweise habt ihr es dan doch schon in der Uni durchgemacht wenn eine Aufgabe dazu bekommst."
Naja, im ersten Semester ging es halt um den Programmiereinstieg anhand von Java, wo es nur um kleine Konsolenapplikationen ging.
Und jetzt im zweiten geht's um C im Selbststudium und da hatte ich eigentlich gehofft, dass ich Java nie wieder benutzen müsste, allerdings haben wir in einer anderen Vorlesung die Aufgabe, in Gruppen ein Spiel zu programmieren und dafür sollen wir dann Fenster und Applets und anderen Kram schreiben, der vorher noch nie angesprochen wurde.
Ist es dir wichtig, dass das Spiel sowohl als Applet als auch als "normale" Anwendung läuft? Scheinbar ist das der Fall, deswegen beziehen sich alle meine Antworten jetzt auf den Fall: Ein Projekt -> sowohl Applet als auch "normale" Anwendung:
Quote:
1. Kann die Game-Klasse weiterhin ein Fenster erzeugen?
Oder muss ich den ganzen Kram umschreiben, sodass Game immernoch von Canvas erbt, aber nicht mehr selbst das Fenster erzeugt, sondern dass es nur von main erzeugt wird, aber halt nicht von init im Falle eines Applets?
Ich würde die Game-Klasse nicht von Canvas oder Applet erben lassen. In der Game-Klasse würde ich grob nur mit Initialisierungs-Methoden für das Spiel, eine Update-Methode, die von außen Aufgerufen wird, und eine Input-Methode, die Eingaben verarbeitet und auch von außen aufgerufen wird, versehen.
Dann würde ich zwei getrennte Klassen erstellen. Einmal eine GameApplet, die von Applet erbt, und einmal eine GameCanvas, die von Canvas erbt (Namen sind grade spontan erdacht...). Beide Klassen mit einer Referenz auf ein Game-Objekt versehen. Du musst in beiden Klassen dann nur dafür sorgen, dass die Update-Funktionen in regelmäßigen Zeitabständen aufgerufen werden und, falls eine Eingabe getätigt wurde, diese an die Input-Methode der Game-Klasse weitergeleitet wird.
In den beiden Klassen hast du auch die Möglichkeit Frage 3 auszubügeln. Du erstellst eine abstrakte Oberklasse FileHandler (Namen sind spontan...) mit abstrakten Methoden zum Laden von Bildern, etc. und zwei Unterklassen AppletFileHandler und AndererFileHandler. Beide Klassen überschreiben jetzt die Methoden passend für ein Applet oder für eine normale Anwendung.
Schließlich braucht jede Klasse, die Zugriff auf Dateien haben soll, ein Referenzobjekt FileHandler, das du dem c-tor übergibst. Nun kannst du in der GameApplet jeweils ein AppletFileHandler Objekt übergeben und in der GameCanvas übergibst du ein AndererFileHandler Objekt.
Damit solltest du die if-Abfragen umgehen können.
Quote:
2. Kann ich den main-Loop jetzt einfach in init hauen oder muss die Game-Klasse auch noch Runnable implementieren, sodass ich sowohl in main als auch in init dann nur einen neuen Thread starte oder kommt beides auf's Gleiche hinaus, nur das mit dem Thread wäre schöner, da ich so nicht 2x den gleichen Code hätte?
Ich bin mir unsicher, ob man in der init ne Endlosschleife implementieren sollte. Habe das noch nie getestet, vllt. kommt es zu Problemen. Ich würde dazu noch eine Extra ThreadKlasse erstellen. Die kann dann in regelmäßigen Abständen die Update-Methode der Game-Klasse aufrufen und Keyboard-Events an die Input-Methode der Game weitergeben.
Hab' mir das grade spontan ausgedacht, also kann Fehler enthalten. Wenn ich was falsch verstanden habe und dir das nicht hilft, ignoriere diesen Post.
Danke für deinen Ratschlag.
Das Ding ist nur, dass das Spiel mehr oder weniger schon fertig ist, aber halt nicht als Applet gestartet werden kann.
Deswegen würde ich ungern die halbe Klassenhierarchie ändern.
Ich weiß zwar immer noch nicht wirklich, wie Applets funktionieren, aber anscheinend funktioniert das, was ich jetzt habe:
Da ich mal einen Src von einem Applet gesehen habe, das eine Game-Klasse hat, die von Canvas erbt, habe ich das jetzt so gelassen und den main-Loop in die Game-Klasse ausgelagert und das Fenster statt in der Game-Klasse in public static void main erstellt, sodass die Application ein Fenster erstellt und diesem das Game-Canvas hinzufügt, während das Applet lediglich das Game-Canvas zu sich selbst hinzufügt.
Die Game-Klasse implementiert jetzt Runnable, sodass der das Spiel startende Code nur aus einer Zeile besteht und sowohl in void start als auch in static void main eingefügt werden kann. Der Update-/Render-Loop ist jetzt wie geschrieben statt in main in der run-Routine.
Das Laden der Bilder habe ich jetzt so umgesetzt:
Code:
public class Image
{
public static BufferedImage read(String path)
{
BufferedImage img = null;
try
{
if (Game.isApplication)
{
img = ImageIO.read(new File(path));
}
else
{
img = ImageIO.read(new URL(Game.appletDir + path));
}
}
catch (IOException e)
{
System.out.println("An Exception occurred when trying to read \"" + path + "\" as an " + (Game.isApplication ? "Application" : "Applet") + ".");
}
return img;
}
}
isApplication wird einfach nur in static void main bzw. in void init gesetzt.
appletDir ist gleich "file:../", da Eclipse eine Applikation im Projektordner startet, ein Applet allerdings in Projektordner/bin.
Soweit scheint alles zu funzen, nur schaff ich es irgendwie nicht, das Applet manuell in eine Webseite zu integrieren..
Ich benutze <applet code="TentaclePorn.game.GameApplet.class" archive="tentacleporn.jar" width="800" height="600"></applet>,
aber das Applet-Fenster bleibt einfach weiß.
Falls jemand weiß, woran das liegt, immer raus damit, ansonsten scheiß ich drauf, immerhin funzt es in Eclipse ;)
Ich habe Applets jetzt auch noch nie im Browser eingebunden sondern immer über Eclipse gestartet.. Sprich nichso die Erfahrung. Aber evtl. könnte es an deiner paint() liegen. Rufst du da als erstes super.paint() auf? Wenn nicht, füge es auf jeden Fall hinzu. Und teste nochmal.
Ich überschreibe paint allerdings nicht, also muss ich es auch nicht über super.paint aufrufen, oder?
Über game.start wird ein Thread gestartet, der den Main-Loop enthält.
Der Konstruktor von Game ist leer, dafür gibt es eine Init-Funktion (s. weiter unten).
So sieht GameApplet.java aus:
Code:
public class GameApplet extends Applet
{
private static final long serialVersionUID = 1L;
private Game game;
public void init()
{
Game.setApplet(this);
game = new Game();
setLayout(new BorderLayout());
add(game, "Center");
}
public void start()
{
game.start();
}
public void stop()
{
game.stop();
}
}
Und so wird in Game.java gemalt (Init ist der pseudo-Konstruktor, der vor dem Main-Loop ausgeführt wird):
Edit:
Kann es sein, dass es daran liegt, dass Exceptions geworfen werden?
Falls ja, wie kann man sich die anzeigen lassen? Bei mir funktioniert der Rechtsklick nicht und von sich aus wird da auch nichts angezeigt.
Eclipse erstellt doch so eine java.policy.applet-Datei, muss man die irgendwie einbinden o.Ä.?
Ich greife nämlich über ImageIO.read(new URL("file:../data/blablubb.png")) auf externe Bilder zu, vllt. liegt es daran.
Ich habe mir jetzt den ganzen restlichen Thread nicht durchgelesen...
Aber soweit ich weis kann man bei Applets mit ImageIO keine Bilder einbinden, habe es immer nur mit getImage gemacht und war gut damit beraten.
Alternativ kannste dir ja mal das JavaDoc anschauen...
Es wäre halt mal wirklich von Vorteil zu sagen welcher Exception geworfen wird.
Und zu Nopex erklärung schau dir ansonsten nochmal MVC an
Wenn du nicht extra eine Methode zum Bildereinbinden schreiben willst, und bereits eine Superclass hast, dann musst du in dieser ja nur eine Abfrage erzeugen welche Klasse du hast und dann die Bilder entsprechend einbinden. (Stichwort: instanceOf, isAsignable)
Übrigends wird das Spiel immer neu gestartet wenn man die Site aktualisiert.
Wenn du das nicht willst könnstest ja auch in den Rumpf vom Konstruktor von Game deine start() Methode schreiben.
Beim Applet Viewer werden dem Applet alle Rechte gegeben, darunter auch File-Permissions.
Normal im Browser ist das nicht so und man bekommt nur über spezielle Methoden Zugriff auf z.B. Bilder und Sounds (außer man benutzt ein Exploit wie das Applet im Anhang).
Nur wenn ich nicht explizit auf Dateien zugreifen kann, wie soll ich dann z.B. die Highscores speichern?
Btw. getDocumentBase funktioniert nicht wie in der Dokumentation beschrieben und gibt verschiedene Resultate abhängig davon, ob sich die Dateien auf einem Server oder lokal auf'm PC befinden (Java ist scheiße).
PS: Da arbeite ich einmal mit Java und schon lädt mir irgendein Applet 'nen Trojaner auf den PC, lololollo.. ja, Java ist schon toll.
Muss in ein paar Stunden abgeben und jetzt kann ich erst mal schauen, welcher Schaden angerichtet wurde.
Switching Applet 11/21/2011 - Minecraft - 1 Replies Also , wenn ich auf der Homepage spielen will und das laden lasse kommt nur ein Schwarzer Bildschirm und sehr kurz ' Switching Applet ' eingeblendet und dann bleibt der Bildschirm schwarz ..
Was kann ich machen? hilft mir bitte ..
Java Applet auf FTP Server 01/22/2011 - Tutorials - 0 Replies Ich zeig hier NICHT wie man ein Applet mit Java erstellt, vielleicht mach ich das später noch aber vorerst belass ich es, wie man auf die Applet zugreifen kann.
Also gehen wir einmal davon aus, wir hätten jetzt ein Java Applet erstellt mit dem Namen: "TestApplet", mit der Klasse: "Test" und der jar Datei: "Test"
Ihr ladet den Ordner auf einen FTP Server: ftp://beispielftp.de
Der Ordner ist jetzt also auf: ftp://beispielftp.de/TestApplet
Ihr erstellt nun eine HTM bzw HTML Datei, indem...
Logitech G13 Guild Wars Applet 01/25/2010 - GW Bots - 1 Replies Abend Pvpers,
Ich hab mal ne kleine Frage.
Ich hab mir letztens ein Logitech G13 Gamepad gekauft, und auf der Homepage von logitech mal nach einem Guild Wars GamePanel gesucht.
(Gamepanel = Anzeige von Spielstaten usw. auf den Displays der G13-19 Produkten)
Allerdings ist dort keiner verzeichnet, benutz jmd zufälligerweise auch eine G13 und besitz so ein Applet?
Danke
need applet for g15 keyborard of sro 07/25/2008 - Silkroad Online - 8 Replies im searching for this
http://sig.highjet.de/screen1.gif
but all links that i found arent work, i only have this page but i dont know how make whit this, can anyone helpme please?????
Java Applet Chatmodul hinzugefügt 06/02/2005 - Main - 4 Replies Wer kein mirc installiert hat kann nun über das neue Java Applet welches in der Forum Header Leiste zu finden ist unserem channel joinen.
Kam noch nicht dazu die Farben vom Applet anzupassen, funzt aber trotzdem ganz gut.
Achja, eine bitte an die neuen vom Board, stellt eure Fragen bitte im Forum, der Chat ist nicht für den Live-Support gedacht (ausser es wurde so zwischen den personen abgemacht).
Regeln befinden sich in der Welcome Msg des Channels (oder im Topic).
Ansonsten viel...