首页 > 解决方案 > 使用 PeasyCam 和处理时出现 java.lang.NullPointerException。PeasyCam 说它无法读取“宽度”,因为一片空白

问题描述

我正在使用IntelliJ idea,processingpeasy显然Java运行所有内容。我正在尝试在我的setting()方法中使用 PeasyCam,但它一直给我这个错误:

java.lang.NullPointerException: Cannot read field "width" because "<parameter2>" is null
    at peasy.PeasyCam.<init>(Unknown Source)
    at peasy.PeasyCam.<init>(Unknown Source)
    at com.nod.planets.Main.settings(Main.java:14)
    at processing.core.PApplet.handleSettings(PApplet.java:978)
    at processing.core.PApplet.runSketch(PApplet.java:10897)
    at processing.core.PApplet.main(PApplet.java:10657)
    at processing.core.PApplet.main(PApplet.java:10639)
    at com.nod.planets.Main.main(Main.java:45)

老实说,我对 peasy 和处理完全陌生,在调试时我被困住了。

这是供参考的代码:

package com.nod.planets;

import processing.core.PApplet;
import peasy.*;

public class Main extends PApplet
{
    PeasyCam cam;

    @Override
    public void settings()
    {
        size(600, 600, P3D);
        cam = new PeasyCam(this, 200);
    }

    @Override
    public void draw()
    {
        background(0);
        fill(255);
        lights();
        //translate(width / 2, height / 2);

       float sphereRadius = 200;
       int sphereVertices = 100;
       for (int i = 0; i < sphereVertices; i++)
       {
           float longitude = map(i, 0, sphereVertices, -PI, PI);
           for (int j = 0; j < sphereVertices; j++)
           {
               float latitude = map(j, 0, sphereVertices, -HALF_PI, HALF_PI);
               float x = sphereRadius * sin(longitude) * cos(latitude);
               float y = sphereRadius * sin(longitude) * sin(latitude);
               float z = sphereRadius * cos(longitude);
               stroke(255);
               strokeWeight(2);
               point(x, y, z);
           }
        }
    }

    public static void main(String[] args)
    {
        PApplet.main("com.nod.planets.Main");
    }
}

如果我摆脱初始化 PeasyCam 并取消注释translate(width / 2, height / 2);代码,那么它就像一个魅力,但是当我尝试这个的那一刻,它给出了那个错误......只是这个该死的“简单”“PeasyCam”给我带来了麻烦。另外,是的,如果您想知道,我正在尝试制作具有柏林噪声地形的行星。不要@我它是否会工作(idk tbh),请帮助我弄清楚为什么它会给我这个错误。

标签: javaintellij-ideaprocessing

解决方案


该问题可能是由于调用PApplet函数时对象未完全初始化造成的settings

背景信息:类的“主”构造函数PeasyCam使用PGraphics从对象派生的PApplet对象。该PGraphics对象在被调用时可能为 null settings,这将导致构造函数中的以下行PeasyCam失败:

viewport[2] = pg.width;

您可以将相机的初始化推迟到这样的setup函数(感谢George Profenza改进此答案):

@Override
public void settings()
{
    size(600, 600, P3D);
}

@Override
public void setup()
{
    cam = new PeasyCam(this, 200);
}

@Override
public void draw()
{
    background(0);
    // [...]
}

推荐阅读