Как рисовать на одном Canvas из разных классов? Проблема в том, что при обращении к canvas из разных классов возвращаются разные ссылки.
Главный класс, загружающий приложение:
@FXML
public Canvas game = new Canvas(WIDTH, HEIGHT);
//Объект для взаимодействия с классом.
public static GameController gamecontroller = new GameController();
//Графический контекст, из которого я рисую
public GraphicsContext gc = this.getGraphicsContext();
public void initialize(URL url, ResourceBundle resourceBundle) {
System.out.println("Game was loaded");
gc = getGraphicsContext(); //{return draw.getGraphicsContext2D;}
gc.setFill(Color.BLACK);
gc.fillRect(0,0,WIDTH,HEIGHT);
Handler.handler.addGameObject(new Player(30.0, 30.0, Id.player)); //Добавляю объект на сцену
Handler.handler.render(); //Рисую его
}
public GraphicsContext getGraphicsContext()
{
return game.getGraphicsContext2D();
}
Также у меня есть класс GameObject, от которого наследуются классы игровых объектов, Player, например. GameObject:
public static GraphicsContext draw
= GameController.gamecontroller.getGraphicsContext();
Player:
public void render() {
draw.setFill(Color.WHITE);
draw.fillRect(10,10,16,16);
}
То есть метод render() работает, но на Canvas ничего не отображается, почему-то при обращении к одному объекту (или при обращении к функции, которая возвращает значение), возвращаются разные ссылки на него.
Вероятно, у вас получается несколько экземпляров класса GameController
. Вы создаете первый где-то при старте своего приложения, вызываете его метод initialize
. Тот, в свою очередь, вызывает render
на объекте Player
, а render
читает статическое поле gamecontroller
. А поле gamecontroller
инициализировано другим экземпляром GameController
. Вот и получается, что вы обращаетесь к совсем другому объекту.
Попробуйте исправить свой код так:
...
public static GameController gamecontroller; // оставьте это поле неинициализированным
...
public void initialize(URL url, ResourceBundle resourceBundle) {
....
gamecontroller = this; // пусть теперь это поле ссылается на созданный вами экземпляр GameController
...
}
Если ваш код нигде больше не дергает GameController.gamecontroller
до инициализации поля, то NullPointerException
не вылетит и все будет замечательно.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
ЗдравствуйтеНадо нужно написать бота для чат-приложения