使用自定义 Java class 绘图背景而非对象的已编译处理代码

Compiled Processing code using custom Java class drawing background but not object

此代码可以正确编译,然后 运行 但是我的 Circle 对象在调用 draw 方法时没有显示在屏幕上,它有一个包含对 Processing 中 ellipse 方法的调用的 draw 方法.我对此感到困惑,因为我可以更改背景的颜色并看到该更改得到反映,但没有别的。第一个 class 是一个抽象的父对象,代表要绘制的更复杂的对象,而 Circle class 只代表一个二维形状,主要用于我测试在 Eclipse 和自定义中使用处理 java classes。最后是本例中的驱动程序或草图,Bounce,它应该在屏幕上放置一个 Circle 对象。

//Name: CelestialBody

//Models generic space objects
//For ex. - Stars
//          Planets
//          Asteroids
//          Moons
//          Etc.

import processing.core.*;

public abstract class CelestialBody {
//constants
static final float c = 299792458; //speed of light in vacuum in meters per second


//object variables
String name; //name of object

float volume; //volume in cubic meters
float area; //area in square meters
float density; //density in kilograms per cubic meters
float mass; //mass in kilograms

float distanceM; //distance in meters
float distanceKM; // distance in kilometers

float xPos; //x coordinate (meters relative to origin)
float xVel; //velocity vector on x-axis in meters per second

float yPos; //y coordinate (meters relative to origin)
float yVel; //velocity vector on y-axis in meters per second

float zPos; //z coordinate (meters relative to origin)
float zVel; //velocity vector on z-axis in meters per second

PVector location= new PVector(); //location stored in vector object
PVector velocity= new PVector(); //velocity vector

PApplet parent;
//constructor
public CelestialBody(PApplet p, String name, float volume, float area, float density, float mass, 
    float x, float xVel, float y, float yVel, float z, float zVel)
    {
    parent=p;

    this.name=name;

    this.volume=volume;
    this.area=area;
    this.density=density;
    this.mass=mass;


    xPos=x;
    this.xVel=xVel;
    yPos=y;
    this.yVel=yVel;
    zPos=z;
    this.zVel=zVel;

    location.set(xPos,yPos,zVel);
    velocity.set(xVel,yVel,zVel);
}
}

//Name: Circle



//Models generic circle from 
//CelestialBody Class for the sake of 
// drawing practice even though this class
//is way simpler by nature and is
//not at all related to real objects

import processing.core.PApplet;

public class Circle extends CelestialBody{
//object variables
float radius; //radius in meters
float diameter; //diameter in meters
PApplet parent;

//constructor
public Circle(PApplet p,String name, float mass, float x, float xVel, float y, float yVel, float radius){
    super(p,name,0,0,0,mass,x,xVel,y,yVel,0,0);
    parent=p;
    this.radius=radius;
    diameter = radius * 2;
    area=(float)(Math.PI*Math.pow(radius,2));
}

public void drawCircle() {
    //shift x and y by the radius of the circle in order to correctly center it
    parent.ellipse(location.x - radius,location.y - radius,diameter,diameter);

}
}

//Name: Bounce

//Draws bouncing ball in box

import processing.core.PApplet;

public class Bounce extends PApplet {
public static void main(String args[]) {
    PApplet.main(new String[] { "--present", "Bounce" });
  }

public void settings() {
    size(displayWidth,displayHeight);
}

public void setup(){
    background(100,150,150);
}

public void draw() {
    Circle circ = new Circle (this,"ball",150,0,10,0,10,150);
    fill(0);
    stroke(0);
    circ.drawCircle();

    circ.location.x=circ.location.x+circ.velocity.x;
    circ.location.y=circ.location.y+circ.velocity.y;

    if (circ.location.x>width||circ.location.x<0){
        circ.velocity.x=circ.velocity.x*-1;
    }
    if (circ.location.y>width||circ.location.y<0){
        circ.velocity.y=circ.velocity.y*-1;
    }   
    }

    }   

你这里发生了一些事情。

首先,请注意您总是从 draw() 函数中初始化一个 Circle 对象。然后将 10 添加到 x 和 y 位置,因此您的 Circle 始终位于 10, 10.

位置

要解决这个问题,请尝试将 circ 变量的声明移动到草图级别。

你也画错了圆。您的圈子总是以其实际位置的 upper-left 结束。由于 10,10 的 upper-left 位置在 window 的边界之外,这就是为什么你永远看不到它的原因。

要解决此问题,请修改您的 drawCircle() 代码以在正确的位置绘制椭圆。尝试将圆圈的位置更改为 mouseX, mouseY 以了解我的意思。

最后,您并不是每帧都重新绘制背景,所以您最终得到的是 "trail" 个圆圈,而不是一个圆圈。如果这不是您想要的,请尝试在 draw() 函数中添加对 background() 的调用。