BlommanMedlem sedan aug. 200263 inlägg Hej alla!
Har gjort min första Applet och lagt upp den på en webserver.
Har klasser som läser in bilderna(jpg) och har prövat allt men får det inte att funka.
Jag har prövat med abslouta sökvägar till bilderna och nu har jag testat getCodeBase metoder mm.
Men får det ändå inte att funka.
for (int i = 0; i < 91; i++)
{
//image[i] = this.getImage(this.getDocumentBase(), "Bild" + i + ".jpg");
image[i] = getImage(getCodeBase(),"Bild" + i + ".jpg");
mt.addImage(image[i], 0);
}
Får detta felmess:
java.lang.NullPointerException
at java.applet.Applet.getCodeBase(Unknown Source)
at gameP.PreLoadingJpgs.<init>(PreLoadingJpgs.java:55)
at gameP.GameArea.<init>(GameArea.java:60)
at gameP.StartApplet.init(StartApplet.java:23)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Bilderna ligger i samma mapp som class filerna, jag har även prövat att ha dom i samma som html-filen det är en mapp "upp".
Här ligger appleten:
http://havsjo.port22.se/web/Ex_Jobb_code/go.html
Tacksam för hjälp!
LimeMedlem sedan sep. 2001961 inlägg Klassiker...
Eftersom det är en applet så gäller lite andra säkerhetsregler. Alltså måste man göra en omväg. Jag använder den här oavesett om det är applet eller inte för den funkar även när man har bilderna i jar-filer.
Nått sånt här.
public Image loadImage(String filename)
{
Image image = null;
try {
URL fileurl = ClassLoader.getSystemResource(filename);
image = this.getToolkit().getImage(fileurl);
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image, 0);
tracker.waitForID(0);
}
catch(Exception e) {}
return image;
}
Borde funka...
/Lime
ViktorMedlem sedan aug. 20021 752 inlägg Vad finns på rad 55 i PreLoadingJpgs.java?
/Viktor
BlommanMedlem sedan aug. 200263 inlägg Ja jag misstänkte att det var något med säkerhet men IOM att jag aldrig lagt upp någon förut så var man lite nollställd.
Har ju bara kört lokalt annars. ;)
Läste lite om ClassLoader men visste inte riktigt hur jag skulle sätta "tänderna" i den, testar lite med den.
Rad 55 ::: image[i] = getImage(getCodeBase(),"Bild" + i + ".jpg");
Tack!
BlommanMedlem sedan aug. 200263 inlägg Hej!
Hur gör man då med ljudfiler?
for(int i=0; i<12; i++)
{
try
{
URL fileurl = ClassLoader.getSystemResource("Ljud" + i + ".wav");
Sound[i] = this.getAudioClip(fileurl);
}
catch(Exception e) {}
//Sound[i] = this.getAudioClip(this.getCodeBase(), "Ljud" + i + ".wav");
}
Detta funkar inte.
BlommanMedlem sedan aug. 200263 inlägg Jo Lime en fråga angående JAR filer om man lägger bilder mm i en JAR fil så laddas dom snabbare va?
Har för mig att jag läste detta någonstans..;)
LimeMedlem sedan sep. 2001961 inlägg Blomman, det beror på implementering av JVM:en och hur CLASSPATHen ser ut.
Den JVM som jag skrev gjorde så att den indexerade klasserna i de JAR-filer som fanns med i CLASSPATHen men sökte på vanligt sätt i exploderade filstrukturer som var inkluderade i CLASSPATH. Alltså blev det något snabbare att hitta till filen om den låg i en JAR.
Så svaret på frågan är "hur stor är en liten sten". ;-)
/Lime
LimeMedlem sedan sep. 2001961 inlägg
Blomman skrev:
Hej!
Hur gör man då med ljudfiler?
for(int i=0; i<12; i++)
{
try
{
URL fileurl = ClassLoader.getSystemResource("Ljud" + i + ".wav");
Sound[i] = this.getAudioClip(fileurl);
}
catch(Exception e) {}
//Sound[i] = this.getAudioClip(this.getCodeBase(), "Ljud" + i + ".wav");
}
Detta funkar inte.
Hmm... om this är Appleten så ska det funka. Men Appet.getAudioClip(fileurl) returnerar en java.applet.AudioClip och inte en Sound... fast jag vet inte vad Sound-arrayen är för typ.
Kod-konventionen säger också att ett attribut som t.ex. Sound[] skall ha liten bokstav först.
Kolla http://java.sun.com/j2se/1.4.2/docs/api/java/applet/Applet.html#getAudioClip(java.net.URL)
/Lime
BlommanMedlem sedan aug. 200263 inlägg Hmm ok intressant det där med JAR filerna, dock så kan det ju se lite snyggare ut med att packa ihop allt i en JAR..,)
Var mycket svårare än jag trodde detta med att få en Applet att fungera som en Applet..;)
Dvs. att få den att funka på en server för lokalt funkar den kanon, visst de e några buggar men detta e det första jag gör i Java.
Men vill ju få den att funka på webben så ni kan få spela. :birp
Nu verkar varje fall bilderna ladda in som dom ska, men nu får jag detta fel:
java.lang.NullPointerException
at gameP.PreLoadingSounds.loopSound(PreLoadingSounds.java:63)
at gameP.GameArea.paint(GameArea.java:637)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Här kommer hela min klass som behandlar Ljud, sen e det några följd fel i en paint metod som ni ser.
package gameP;
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.*;
/**
* @author Blomman
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class PreLoadingSounds extends Applet
{
private AudioClip sound[] = new AudioClip[12];
private int temp = 0, testFlag = 0;
public PreLoadingSounds()
{
for(int i=0; i<12; i++)
{
try
{
URL fileurl = ClassLoader.getSystemResource("Ljud" + i + ".wav");
sound[i] = this.getAudioClip(fileurl);
}
catch(Exception e) {}
}
}
//Spela vilket ljud? Hur många gånger?
public void playXSound(int wSound_, int xSound_)
{
int wSound = wSound_;
int xSound = xSound_;
while(temp < xSound_ && testFlag == 0)
{
sound[wSound].play();
testFlag = 1;
}
temp++;
testFlag = 0;
}
//Spela ljudet
public void playSound(int wSound_)
{
int wSound = wSound_;
sound[wSound].play();
}
//Stoppa ljudet
public void stopSound(int wSound_)
{
int wSound = wSound_;
sound[wSound].stop();
}
//Loopa ljudet
public void loopSound(int wSound_)
{
int wSound = wSound_;
**Rad 63** sound[wSound].loop();
}
}
Ok Lime jag såg att jag döpt sound arrayen med stor bokstav och det vet jag att man inte ska*smiskar till mig själv*, sorry var nog lite trött..;)
http://havsjo.port22.se/web/Ex_Jobb_code/go.html
LimeMedlem sedan sep. 2001961 inlägg //Loopa ljudet
public void loopSound(int wSound_)
{
int wSound = wSound_;
**Rad 63** sound[wSound].loop();
}
Tjing!
För det första: Konstruktionen att tilldela variabler som kommer i metodanropet till en lokal variabel är fullständigt onödig. Förvirrar bara tycker jag.
För det andra: Testa att sound[wSound] verkligen finns innan du försöker spela den... Anta att du har laddat 10 ljud i din array och den som anropar gör det med loopSound(11)... Då går det åt helvete.
Sedan är det bra att använda mediatracker när du laddar ljud och bilder. Det kan vara så att du inte har fått upp hela bilden eller ljudet innan du försöker använda det.
Detta kan med fördel kombineras med en statusbar.
Testa med att skriva ut URL fileurl så du ser vad det är den försöker ladda.
Sedan är det en bra idé att göra en egen metod som heter initSound och initImages som sköter hämtandet av bilder och ljud.
Det kan nämeligen vara så att när du skapar objektet så bråkar java-maskinen med dig.
Test att göra:
PreLoadingSounds pls = new PreLoadingSounds();
pls.initSounds();
Detta ska jämföras med Applet-klassens init();
/Lime
BlommanMedlem sedan aug. 200263 inlägg Oki jag vill tacka Lime som tar sig sån stor tid att hjälpa en nybörjare.
Tack!
Jag ska sätta mig ner och försöka att lösa det hela med hjälp av dina tips.
Är nog busenkelt när jag ser felet, återkommer.
LimeMedlem sedan sep. 2001961 inlägg Been there, done that. Vet hur frustrerande det är att göra rätt men ändå fel.
/Lime