0

JApplet として実行されている単純なゲームがあります。Eclipse でテストすると、問題なく動作します。しかし、アプレットとしてエクスポートしてブラウザでテストしようとすると、画像が見つかりません。jar ファイル内のフォルダー構造は次のとおりです。

index.html (page that displays the applet)  
shipyard.jar  
_shipyard  
__Shipyard.class (main applet class)  
_img  
__All of my images, saved as .png files  

アプレットの表示に使用される HTML コードは次のとおりです。

<object width="1280" height="720" data="shipyard.jar" type="application/x-java-applet">
    <param name="archive" value="shipyard.jar">
    <param name="code" value="shipyard.Shipyard">
    <param name="align" value="middle">
</object>

私の init() および run() メソッドは、プリロード キューを設定し、それを繰り返し処理して画像を取得および準備します。

@Override
public void init(){ 
    markImageForPreload("background");
    markImageForPreload("shipyard_interior");
    markImageForPreload("tooltip");
    markImageForPreload("button");
    for(String s : ShipyardExterior.tilePages) markImageForPreload("tiles/" + s);
    for(ShipSystem sys : ShipSystem.allSystems){
        markImageForPreload("system/interior/" + sys.imgName);
        if(sys.getForceExterior()) markImageForPreload("system/exterior/" + sys.imgName);
    }   
    for(ShipWeapon wep : ShipWeapon.allWeapons){
        markImageForPreload("weapon/" + wep.imgname);
    }

    currentScreen = new LoadingScreen();

    addMouseListener(this);
    addKeyListener(this);
}

@Override
public void run() {

    preloadCount = 0;       
    preloadTotal = preloadQueue.size();

    for(String s : preloadQueue){
        this.prepareImage(getOrLoadImage(s), this);
        preloadCount++;
        repaint();
    }              

    currentScreen = new ShipyardInterior();

    while(true){
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        try {
            if(this.getMousePosition() != null){
                mouseX = this.getMousePosition().x / 2;
                mouseY = this.getMousePosition().y / 2;
            }
        } catch (NullPointerException e){}
        currentScreen.onUpdate();
        repaint();
        try {
            Thread.sleep(1000 / 60);
        } catch(InterruptedException e) {}

        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    }
}

画像をロードして取得する JApplet クラスのメソッド:

public static Image getOrLoadImage(String s){
    Image img = instance.loadedImages.get(s);
    if(img == null){
        System.out.println("Loading " + s + ".png.");
        try {
            img = ImageIO.read(new URL(instance.getCodeBase(), "../img/" + s + ".png"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(img == null) System.out.println("Image does not exist.");
        else instance.loadedImages.put(s, img);
    }
    return img;
}

「loadedImages」は、画像を URL で保存する静的な HashMap です。メソッドが呼び出されると、まずイメージがロードされているかどうかがチェックされます。もしそうなら、それは画像を返します。ロードされていない場合はロードされ、Image インスタンスが loadedImages に追加されます。

ページを開くと、アプレットは実行されますが、画像が表示されません。drawString()、drawRect() などの基本的なレンダリング メソッドは機能しますが、画像は機能しません。

私はインターネット全体を探し回りましたが、この件に関して役立つものを見つけることができませんでした. 1 つのスレッドから、アプレット jar に自己署名するように言われました。私はそれを実行しましたが、うまくいかなかったようです。画像を取得するさまざまな方法(getClass()。getClassLoader()。getRescource()を含む)、コードベースの設定などを試しましたが、役に立ちませんでした。助言がありますか?

4

1 に答える 1