0

作成しようとしているゲームを実行するはずの jar ファイルに問題があります。これは基本的に、Jar と Netbeans の環境で動作するようにイメージをロードする際の大きな問題です。

私は現在使用しています

imgIcon = new ImageIcon(Core.classLoader.getResource("Images/Boss1.png"));
img = imgIcon.getImage();

これはうまく機能します 4 すべての敵、レベルの背景、およびさまざまなオブジェクトが発射するショット。しかし、自分のプレーヤー クラスで使用しようとすると、JARファイルはunexecutablemになりますが、NetBeans ではまだ完全に機能します。画像がこの特定のコードでロードされているように見え、それがプレーヤーにもある場合にのみjarが使用できないため、私はプレーヤーまたは他の場所で失敗しました。

ここで見られるプレーヤークラス(私が何度も見落としていたのはここで問題になっていると思います):

package Entity;

import Shots.PlayerShot;
import bullethellreloaded.Core;
import bullethellreloaded.Screen;
import java.awt.Image;
import java.awt.Rectangle;
import java.util.ArrayList;
import javax.swing.ImageIcon;



public class Player extends Entity{
public int x,y; // public used to make an easy mouse controll;
int xDirection, yDirection;
int health;
private Image img;
private ImageIcon imgIcon;
private Rectangle hitbox;
public static ArrayList shots;

public Player(){
    x = 250;
    y = 400;
    shots = new ArrayList();
    health = 5;
    imgIcon = new ImageIcon(Core.classLoader.getResource("Images/spaceship           (Redshrike,Stephen Challener).png"));
    img = imgIcon.getImage();
}



@Override
public void move(){

    x += xDirection;
    y += yDirection;
    // Wallcollision detection, needs to be ajusted for the size of the object.
    if(x <= 0)
        x = 0;
    if(x >= Screen.getScreenWidth())
        x = Screen.getScreenWidth();
    if(y <= 0)
        y = 0;
    if(y >= Screen.getScreenHeight())
        y = Screen.getScreenHeight();

}

public void setXDirection(int xdir){
    xDirection = xdir;
}
public void setYDirection(int ydir){
    yDirection = ydir;
}


@Override
public Image getImage(){
    return img;
}

@Override
public ImageIcon getImageIcon(){
    return imgIcon;
}

@Override
public int getX(){
    return x;
}

@Override
public int getY(){
    return y;
}

@Override
public Rectangle getHitbox(){
    return hitbox;
}

public static ArrayList getShots(){
    return shots;
}

public void fire(){
    PlayerShot shot = new PlayerShot(getX(), getY()-getImageIcon().getIconHeight()/2, 0, 1, 1,Core.classLoader.getResource("Images/PlayerShot.png"));
    shots.add(shot);
}



@Override
public void removeHitbox(){
    hitbox = null;
}

@Override
public Rectangle setHitbox(){
    int width = getImageIcon().getIconWidth();
    int height = getImageIcon().getIconHeight();
    hitbox = new Rectangle(getX()+width/2-5, getY()+height/2-5, 1, 1);
    return hitbox;
}

public void takeDamage(int dmg){
    health -= dmg;
}
public int getHealth(){
    return health;
}

ペイントによって呼び出されるpaintComponentの拡張JFrameである私のスクリーンクラスで描画されます(ダブルバッファリングなど^^)

次のコード セグメントで:

    }else{
        g.drawImage(testlevel.getImage(),0,0,this);
        g.drawImage(player.getImage(),player.getX(),player.getY(),this);

        // painting the Score
        g.setColor(Color.white);
        g.setFont(new Font("Arial",Font.BOLD,14));
        g.drawString("Score: "+ Score.getScore(), getScreenWidth()-100, 50);
        // painting out the content of the ArrayLists shots, enemies, enemyShots
        try{
            for (int i = 0; i < Player.shots.size(); i++){
                PlayerShot s = (PlayerShot) Player.shots.get(i);      
                if (s.getDeleted() != true){
                    g.drawImage(s.getImage(), s.getX(), s.getY(), this);
                }
            }
            for (int i = 0; i < Enemy.enemies.size(); i++){
                Enemy e = (Enemy) Enemy.enemies.get(i);      
                if (e.getDestroied() != true){
                    g.drawImage(e.getImage(), e.getX(), e.getY(), this);
                }
            }
            for (int i = 0; i < Enemy.enemyShots.size(); i++){
                EnemyShot es = (EnemyShot) Enemy.enemyShots.get(i);      
                if (es.getDeleted() != true){
                    g.drawImage(es.getImage(), es.getX(), es.getY(), this);
                }
            }
        }catch(Exception e){}
    }
    repaint();
}

これで十分な情報だと思いますが、そうでない場合はお知らせください。

編集:

質問は、私のプログラムで動作する可能性のある別の方法があるか、または開始さえしないこの役に立たない JAR を取得するために何を台無しにしたかのようなものです。

これを変更します (このパスは netbeans でのみ機能し、jar はこのパスでそれを見つけることができません)

    imgIcon = new ImageIcon("src/Images/spaceship           (Redshrike,Stephen Challener).png");

これに:

    imgIcon = new ImageIcon(Core.classLoader.getResource("Images/spaceship           (Redshrike,Stephen Challener).png"));

JAR を実行できないようにします (バックグラウンドでのプロセスでさえありません) が、プレーヤーに画像がなかったという事実を除いて、古いパスでは問題なく動作しました。

4

2 に答える 2

0

リソースを最終的な Jar にパックする必要があります。

Eclipse には、それを行う FatJar というプラグインがあります (新しいバージョンの Eclipse では、[エクスポート] > [実行可能な Jar ファイル] オプションとして組み込まれています)。

通常、コンパイラはリソースをバンドルにパックしません。

于 2013-08-26T22:20:22.227 に答える