微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 PeasyCam 和 Processing 时出现 java.lang.NullPointerException PeasyCam 说它无法读取“宽度”,因为 <parameter2> 为空

如何解决使用 PeasyCam 和 Processing 时出现 java.lang.NullPointerException PeasyCam 说它无法读取“宽度”,因为 <parameter2> 为空

我正在使用 IntelliJ ideaprocessingpeasy 和显然 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 和 processing 完全陌生,并且在调试时遇到了困难。

代码如下:

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,sphereVertices,-PI,PI);
           for (int j = 0; j < sphereVertices; j++)
           {
               float latitude = map(j,-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),请帮助我弄清楚为什么它会给我这个错误

解决方法

该问题可能是由于在调用 PApplet 函数时未完全初始化 settings 对象所致。

背景信息:PeasyCam 类的“主”构造函数使用从 PGraphics 对象派生的 PApplet 对象。调用 PGraphics 时,此 settings 对象可能为 null,这会导致 PeasyCam 构造函数中的 the following line 失败:

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);
    // [...]
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。