在Processing中使用另一个类中的一个类的变量

时间:2014-08-27 15:31:30

标签: class variables processing

我是编程和处理的新手。我很难从Processing中的另一个类中的一个类访问变量。

我有两个班级,一个“球”班和一个碰撞班。

class ball {


    float xBall; 
    float yBall; 
    int balldiameter = 20; 
    float oldxball, oldyball;
    boolean linehit; 
    color ballcolor = color(100, 200, 100); 
    float r; 
    float x;

    float speedx, speedy; 
    float speed = 6; 

    ball() {
        xBall = 200;
        yBall = 300;
        r = 2.8;
        boolean linehit;
    } // ball ()

    void ballUpdate() {

        float  px = xBall + cos(r)*(speed); 
        float  py = yBall + sin(r)*(speed);
        speedx = px - xBall; 
        speedy = py - yBall; 
        oldxball = xBall; 
        oldyball = yBall;
        xBall += speedx; 
        yBall += speedy;
        // display ball
        stroke(0); 
        fill(ballcolor); 
        ellipse (xBall, yBall, balldiameter, balldiameter);

    } //void ballUpdate()
} // class ball

碰撞类:

class collision {

    ball bl;

    collision() {
    } // collision ()

    void collisionUpdate() {

        bl = new ball();
        println(bl.r);
        println(bl.xBall);
        println(bl.yBall);
        println(bl.x);

这里我尝试从碰撞类中的Ball类访问xBall和其他变量,代码正在运行,但if语句永远不会成立。变量永远不会改变。

        if (bl.xBall < 0 || bl.xBall > width) { // side wall
            bl.x = PI - bl.r; 
            bl.r = bl.x;
            println("if 1");
        }

        if (bl.yBall < 0 || bl.yBall > height) { // top & bottom
            bl.x = TWO_PI - bl.r; 
            bl.r = bl.x;
            println("if 2");
        }
    } // void collisionUpdate()
} // class collision 

我尝试将球类中的xBall,YBall,r和x变量连接到碰撞类,使球在墙壁上反弹。 Main看起来像这样:

ball bl;
collision cl;

void setup() {
    size(600, 600);

    bl = new ball();
    cl = new collision();
}


void draw() {
background(255);
bl.ballUpdate();
cl.collisionUpdate();

对于noob问题感到抱歉,但我是初学者

2 个答案:

答案 0 :(得分:0)

如果你有两个Balls实例,一个应该被Collision类使用?我不知道整个想法,所以我无法真正得到你要去的地方......

请注意,在碰撞内你创建了一个新球,这是你试图在墙上检查的球,但它永远不会更新。你想查看在全球范围内创建的另一个球。

也许结合应该是球类内部的一种方法,而不是一个新的类...正如我所说,我不知道你的目标,但我认为这个设计没有理由...无论如何......减少尽可能改变你的代码,我认为你必须将对要检查的球实例的引用传递给碰撞的构造函数,如:

Ball bl;
Collision cl;


void setup() {
  size(600, 600);

  bl = new Ball();
  cl = new Collision(bl);
}


void draw() {
  background(255);
  bl.ballUpdate();
  cl.collisionUpdate();
}


class Ball {

  float xBall; 
  float yBall; 
  int balldiameter = 20; 
  float oldxball, oldyball;
  boolean linehit; 
  color ballcolor = color(100, 200, 100); 
  float r; 
  float x;
  float speedx, speedy; 
  float speed = 6; 

  Ball() {
    xBall = 200;
    yBall = 300;
    r = 2.8;
    boolean linehit;
  } // ball ()


  void ballUpdate() {

    float  px = xBall + cos(r)*(speed); 
    float  py = yBall + sin(r)*(speed);
    speedx = px - xBall; 
    speedy = py - yBall; 
    oldxball = xBall; 
    oldyball = yBall;
    xBall += speedx; 
    yBall += speedy;
    // display ball
    stroke(0); 
    fill(ballcolor); 
    ellipse (xBall, yBall, balldiameter, balldiameter);
  } //void ballUpdate()
} // class ball




class Collision {

  Ball bl;

  Collision(Ball _bl) {
    bl = _bl;
  } // collision ()

  void collisionUpdate() {

    println(bl.r);
    println(bl.xBall);
    println(bl.yBall);
    println(bl.x);



    if (bl.xBall < 0 || bl.xBall > width) { // side wall
      bl.x = PI - bl.r; 
      bl.r = bl.x;
      println("if 1");
    }

    if (bl.yBall < 0 || bl.yBall > height) { // top & bottom
      bl.x = TWO_PI - bl.r; 
      bl.r = bl.x;
      println("if 2");
    }
  } // void collisionUpdate()
} // class collision 

答案 1 :(得分:0)

你需要检查球是否与任何其他球发生碰撞?或另一个对象。?或两者兼而有之?

如果它只是为了看看它们是否相互碰撞我会建议将它作为一个函数移动到球类本身内,然后你有一个方法可以在每个循环中调用,这将检查整个数组(即如何你有很多球)

plus - 你应该真正使用PVector存储对象(球)的lcoation,因为它将有助于未来的数学方法