Явная переменная экрана Java

-3

Я делаю класс Point, чтобы легче делать очки. Я хочу, чтобы он преобразовал мою систему координат в систему координат экрана, но когда я вызываю метод getWidth, он говорит, что он равен нулю и дает исключение NullPointerException. Вот мой класс Point:

import java.awt.Graphics2D;
import java.awt.Image;

public class Point extends GameLoop{
public float X, Y;
private float scale;

public float getScale() {
return scale;
}

public void setScale(float scale) {
this.scale = scale;
}

public Point toScreenCoordinates(){
return new Point(((this.X + scale)/2 * screen.getWidth()), ((this.Y + scale)/2 * screen.getHeight()));
}

public void drawImageHere(Image i, Graphics2D g){
Point p = this.toScreenCoordinates();
g.drawImage(i, Math.round(p.X) - i.getWidth(null)/2, (Math.round(p.Y) - i.getHeight(null))/2, null);
}

public Point(float x, float y){
X = x;
Y = y;
scale = 1;
}

public void update(long timePassed) {

}

public void draw(Graphics2D g) {

}
}

Вот мой класс GameLoop, который содержит экранный объект:

import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Window;

public abstract class GameLoop {

private static DisplayMode[] modes = {
new DisplayMode(800, 600, 32, 0),
new DisplayMode(800, 600, 24, 0),
new DisplayMode(800, 600, 16, 0),
new DisplayMode(640, 480, 32, 0),
new DisplayMode(640, 480, 24, 0),
new DisplayMode(640, 480, 16, 0)
};

private boolean running;
public Animation a;
public int fps;

public ScreenManager screen;

public void stopAll(){
running = false;
}

public void run(){
try{
init();
gameLoop();
}finally{
screen.restoreScreen();
}
}

public void gameLoop(){
long startTime = System.currentTimeMillis();
long cumTime = startTime;

while(running){
long timePassed = System.currentTimeMillis() - cumTime;
cumTime += timePassed;

update(timePassed);

Graphics2D g = screen.getGraphics();
draw(g);
g.dispose();
screen.update();
a.update(timePassed);

try{
Thread.sleep((1000 + (fps - (1000 % fps)))/fps);
}catch(Exception ex){}
}
}

public void init(){
fps = 60;
a = new Animation();
screen = new ScreenManager();
DisplayMode dm = screen.findFirstCompatibleMode(modes);
screen.setFullScreen(dm);

Window w = screen.getFullScreenWindow();
w.setFont(new Font("Times New Roman", Font.PLAIN, 30));
w.setBackground(Color.YELLOW);
w.setForeground(Color.BLACK);
running = true;
}

public abstract void update(long timePassed);
public abstract void draw(Graphics2D g);

}

И вот мой класс ScreenManager, который является классом, в котором моя переменная экрана является объектом:

import java.awt.DisplayMode;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Window;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class ScreenManager {

private GraphicsDevice vc;

public ScreenManager(){
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
vc = e.getDefaultScreenDevice();
}

public DisplayMode[] getCompatibleDisplayModes(){
return vc.getDisplayModes();
}

public DisplayMode findFirstCompatibleMode(DisplayMode[] modes){
DisplayMode goodModes[] = vc.getDisplayModes();
for(int x = 0;x<modes.length;x++){
for(int y = 0;y<goodModes.length;y++){
if(displayModesMatch(modes[x], goodModes[y])){
return modes[x];
}
}
}
return null;
}

public boolean displayModesMatch(DisplayMode m1, DisplayMode m2){
if(m1.getWidth() != m2.getWidth() || m1.getHeight() != m2.getHeight()){
return false;
}
if(m1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI && m2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI && m1.getBitDepth() != m2.getBitDepth()){
return false;
}
if(m1.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN && m2.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN && m1.getRefreshRate() != m2.getRefreshRate()){
return false;
}
return true;
}

public DisplayMode getCurrentDisplayMode(){
return vc.getDisplayMode();
}

public void setFullScreen(DisplayMode dm){
JFrame f = new JFrame();
f.setUndecorated(true);
f.setResizable(false);
f.setIgnoreRepaint(true);
vc.setFullScreenWindow(f);

if(dm != null && vc.isDisplayChangeSupported()){
try{
vc.setDisplayMode(dm);
}catch(Exception ex){}
}

f.createBufferStrategy(2);
}

public Graphics2D getGraphics(){
Window w = vc.getFullScreenWindow();
if(w != null){
BufferStrategy s = w.getBufferStrategy();
return (Graphics2D)s.getDrawGraphics();
}else{
return null;
}
}

public void update(){
Window w = vc.getFullScreenWindow();
if(w != null){
BufferStrategy s = w.getBufferStrategy();
if(!s.contentsLost()){
s.show();
}
}
}

public Window getFullScreenWindow(){
return vc.getFullScreenWindow();
}

public int getWidth(){
Window w = vc.getFullScreenWindow();
if(w != null){
return w.getWidth();
}else{
return 0;
}
}

public int getHeight(){
Window w = vc.getFullScreenWindow();
if(w != null){
return w.getHeight();
}else{
return 0;
}
}

public void restoreScreen(){
Window w = vc.getFullScreenWindow();
if(w != null){
w.dispose();
}
vc.setFullScreenWindow(null);
}

public BufferedImage createCompatibleImage(int w, int h, int t){
Window win = vc.getFullScreenWindow();
if(win != null){
GraphicsConfiguration gc = win.getGraphicsConfiguration();
return gc.createCompatibleImage(w, h, t);
}else{
return null;
}
}

}

спросил(а) 2015-04-08T04:50:00+03:00 4 года, 10 месяцев назад
0
90

Вы инициализируете поле экрана только в методе init GameLoop и вызывается только из метода run.

Когда вы создаете свой Point, он создает собственное поле экрана, потому что это подкласс GameLoop. Поэтому он не использует поле экрана класса GameLoop, которое у вас, вероятно, есть.

На самом деле вам не нужно, чтобы Point расширял GameLoop. Но если вам это нужно, вы должны инициализировать локальную версию экрана Point в конструкторе.

ответил(а) 2015-04-08T05:06:00+03:00 4 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема