Image (JFX)使用静态方法和继承类加载图像时出现问题

Image (JFX)使用静态方法和继承类加载图像时出现问题,image,javafx,imageview,Image,Javafx,Imageview,我正在尝试使用我创建的静态方法loadImage(String)加载2个图像。 此方法存储在我的实体(抽象)类中,我的类和播放器继承自此实体 但是,当我使用此方法时(自从我加载“spolder.loadImage(“image1”);”和“Player.loadImage(“image2”);”)以来,已经加载了2次),只存储了第二个图像 我认为这是继承造成的,因为loadImage()方法是在Entity类中编写的,所以它可能会更改实体中的静态精灵,而不是播放器或投射物,但我不知道如何在不重新

我正在尝试使用我创建的静态方法loadImage(String)加载2个图像。 此方法存储在我的实体(抽象)类中,我的类和播放器继承自此实体

但是,当我使用此方法时(自从我加载“spolder.loadImage(“image1”);”和“Player.loadImage(“image2”);”)以来,已经加载了2次),只存储了第二个图像

我认为这是继承造成的,因为loadImage()方法是在Entity类中编写的,所以它可能会更改实体中的静态精灵,而不是播放器或投射物,但我不知道如何在不重新创建loadImage()的情况下修复此问题方法,使子类不继承sprite属性,而是拥有自己的子类

下面是一个代码示例:

//Main class
package application;

import Entities.*;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
public class Main extends Application
{
    final int WIDTH = 800;
    final int HEIGHT = 800;
    public int frameCount = 0;
    Player p;

    public static void main(String[] args) {

        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Player.loadImage("/images/isaac.png");
        Projectile.loadImage("/images/tear.png");
        stage.setTitle("My first JFX / Java project");
        Group root = new Group();
        Scene scene = new Scene(root, WIDTH, HEIGHT);
        p = new Player(WIDTH/2,HEIGHT/2,root);
        stage.setScene(scene);
        stage.setResizable(false);
        stage.sizeToScene();
        stage.show();
    }

}

这是预期的行为:静态字段在实例之间共享,因此第二个调用重置第一个调用的值。故事的寓意:不要使用静态访问:)那么有没有一种方法可以在不使用静态访问的情况下加载我的投射物和玩家纹理?因为当谈到投射物时,每次创建一个纹理时给纹理充电似乎有点耗电。我解决这个问题的方法是让每个类都有自己的图像(所以不是继承的)和loadImage方法和图像类,但这似乎有点多余,当然
图像
对象可以共享,只是不是你在你的问题中实现它的方式。。。快速而肮脏的方法是为每个具体类添加一个
静态图像
字段(并用访问这些字段的方法替换
getSprite
方法)。更干净的方法可能是使用工厂创建对象并存储
图像
对象。。。
//Entity Class and load Image
package Entities;

import application.Vector2;
import javafx.scene.Group;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

public abstract class Entity {
    protected double x;
    protected double y;
    private Group root;
    protected Vector2 dir;
    protected double speed;
    private static Image sprite;
    private ImageView iv;
    private int size;
    private double hp;
    public Entity(float px, float py,Group r, Image s) {
        root = r;
        x = px;
        y = py;
        size = 100;
        iv = new ImageView(s);
        dir = new Vector2(0,0);
        speed = 0.2;
        hp = 3;
        root.getChildren().add(iv);
        iv.setX(x);
        iv.setY(y);
        iv.setFitWidth(100);
        iv.setFitHeight(100);
    }
    public static void loadImage(String input) {
        sprite = new Image(input);
    }
//Player class constructor 
package Entities;

import application.Vector2;
import javafx.scene.Group;
public class Player extends Entity{


    private boolean north, west, south, east;
    private boolean shootN, shootW, shootS, shootE;
    private Vector2 pInput;

    public Player(float px, float py,Group r) {
        super(px,py,r,getSprite());
        north = false;
        west = false;
        south = false;
        east = false;
        pInput = new Vector2(0,0);
        setHp(10);
    }
}
//Projectile Constructor 
package Entities;

import java.util.ArrayList;
import application.Vector2;
import javafx.scene.Group;

public class Projectile extends Entity{
    private double speed;
    Entity parent;
    int lifespan;
    public Projectile(float px, float py,Group r,Entity p,Vector2 d){
        super(px,py,r,getSprite());
        speed = 5;
        dir = new Vector2(d.x,d.y);
        dir.x += p.dir.x/30;
        dir.y += p.dir.y/30;
        lifespan = 100;
        parent = p;
    }
}