Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java屏幕变量为空_Java_Nullpointerexception - Fatal编程技术网

Java屏幕变量为空

Java屏幕变量为空,java,nullpointerexception,Java,Nullpointerexception,我正在上一堂积分课,以便更容易地得分。我想让它在我自己的坐标系和屏幕的坐标系之间转换,但是当我调用getWidth方法时,它会说它为null,并给出一个NullPointerException。以下是我的重点课程: import java.awt.Graphics2D; import java.awt.Image; public class Point extends GameLoop{ public float X, Y; private float scale; public float

我正在上一堂积分课,以便更容易地得分。我想让它在我自己的坐标系和屏幕的坐标系之间转换,但是当我调用getWidth方法时,它会说它为null,并给出一个NullPointerException。以下是我的重点课程:

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类,它包含screen对象:

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类,它是我的screen变量的对象:

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;
    }
}

}
导入java.awt.DisplayMode;
导入java.awt.Graphics2D;
导入java.awt.GraphicsConfiguration;
导入java.awt.GraphicsDevice;
导入java.awt.GraphicsEnvironment;
导入java.awt.Window;
导入java.awt.image.BufferStrategy;
导入java.awt.image.buffereImage;
导入javax.swing.JFrame;
公共类屏幕管理器{
私有图形设备vc;
公共屏幕管理器(){
GraphicsEnvironment e=GraphicsEnvironment.getLocalGraphicsEnvironment();
vc=e.getDefaultScreenDevice();
}
公共显示模式[]getCompatibleDisplayModes(){
返回vc.getDisplayModes();
}
公共显示模式findFirstCompatibleMode(显示模式[]模式){
DisplayMode goodModes[]=vc.getDisplayModes();

对于(intx=0;x,您仅在GameLoop的init方法中初始化screen字段,该字段仅从run方法调用

当你构建你的点时,它会生成自己的屏幕字段,因为它是GameLoop的一个子类,所以它不会使用你可能拥有的GameLoop类的屏幕字段


实际上,您不需要点扩展GameLoop。但是如果您需要,您必须在构造函数中初始化点的本地版本的screen。

Java已经有了一个
Point
类,它已经具有本地和屏幕上下文支持之间的转换功能,您的
Point
类需要扩展from
GameLoop
由于它并没有真正向该特定类添加任何新功能,并且没有进一步的证据,我会“猜测”您正在创建
GameLoop
的一个实例和
Point
的另一个实例,但是
Point
不会初始化
屏幕