我有一项任务,我必须展示"健身器材"和他们的数据通过PApplet处理器。我需要使用多态和继承(跑步机是GymMachine等)。每台健身器材都必须有自己的抽奖方法。我只是无法弄清楚如何避免NullPointerException。
这是我的" ProcessingExample.java"中的代码。 file,实际通过处理器绘制图像的代码:
import processing.core.PApplet;
import processing.core.PImage;
public class ProcessingExample extends PApplet {
public long start_time;
public static int canvas_x = 1200;
public static int canvas_y = 800;
TreadMill treadmill;
Stepper stepper;
Bicycle bicycle;
public ProcessingExample(){
start_time = System.currentTimeMillis();
}
public void setup(){
size(canvas_x, canvas_y);
treadmill = new TreadMill();
stepper = new Stepper();
bicycle = new Bicycle();
}
public void draw(){
// treadmill
treadmill.draw();
}
}
这是我的GymMachine课程,跑步机将从中导出:
import processing.core.PApplet;
import processing.core.PImage;
public class GymMachine extends PApplet {
public long start_time;
public static int canvas_x = 1200;
public static int canvas_y = 800;
public GymMachine(){
start_time = System.currentTimeMillis();
}
public void draw(){ // for now I am just trying to draw the background, a block of color on 1/3 of the canvas
fill(83, 85, 171);
rect(0, 0, canvas_x / 3, canvas_y);
}
}
这是我的跑步机课程,仅为了清晰起见:
import processing.core.PApplet;
import processing.core.PImage;
public class TreadMill extends GymMachine {
private int angleOfInclination;
private double mph;
public TreadMill(){
angleOfInclination = 1;
mph = 1.0;
image = "treadmill.png";
}
public TreadMill(int i, double m){
if (i >= 1 && i <= 15){ // data validation
angleOfInclination = i;
}
else { // else, defer to defaults
angleOfInclination = 1;
}
if (m >= 1.0 && m <= 15.0){
mph = m;
}
else {
mph = 1.0;
}
}
public void setAngleOfInclination(int i){
if (i >= 1 && i <= 15){ // data validation
this.angleOfInclination = i;
}
}
public void setMPH(double m){
if (m >= 1.0 && m <= 15.0){ // data validation
this.mph = m;
}
}
public long getCaloriesUsed(){
return 20 *(long) mph + 15 * angleOfInclination;
}
public String toString(){
return "Angle of inclination is " + angleOfInclination + " degrees; Speed is " + mph + " mph; Calories burned: " + this.getCaloriesUsed();
}
}
在过去的5个小时里,我还没有弄清楚为什么treadmill.draw()
会抱怨NullPointerException。我不太清楚null
变量是什么。我已经尝试将ProcessingExample和GymMachine设为同一个类,因为我认为它可能需要访问&#34;相同的画布,&#34;但问题是ProcessingExample不断调用自己,因为我需要在某处创建一个跑步机的实例。我还读过,而不是制作GymMachine extend PApplet
,我可以让构造函数采用PApplet
类型的参数,(即GymMachine(PApplet p){...})
,但是我无法得到TreadMill
从这一点。感谢任何帮助。
答案 0 :(得分:1)
只有一个类应该扩展dot.exe
类。
将PApplet
视为在窗口中运行的整个草图。你只想要一个窗口出现,对吧?所以你只想要一个PApplet
类。
您不希望每个PApplet
都显示在自己的窗口中。您希望在一个窗口中绘制多个GymMachine
。所以摆脱GymMachines
类上的extends PApplet
。
执行此操作后,您将收到一些编译器错误,因为GymMachine
类无法识别GymMachine
或fill()
等函数。要解决此问题,您需要将主草图类(扩展rect()
的类)的实例传入辅助草图类。 PApplet
关键字可以派上用场。
最后,您必须使用对主this
草图的引用来调用Processing函数。这是一个例子:
PApplet
有关详细信息,请参阅this tutorial的从非草图类调用处理函数部分。