子类不显示处理

时间:2016-06-30 06:37:37

标签: tree processing superclass display flower

我正在进行一项需要创建基类Tree的赋值,其中包含子类Flower。 但我不知道哪里弄错了,按下鼠标时花不出现在树上,只出现树。到目前为止,这是我的代码,

 
Tree tree;
ArrayList<Tree> treeList = new ArrayList<Tree>();

Flower flowers;
ArrayList <Flower> flowerList = new ArrayList<Flower>();

void setup() {
  size(800, 800);
  tree = new Tree(mouseX, mouseY, HALF_PI, height/12);
  flowers = new Flower(mouseX, mouseY, HALF_PI, height/12);
}

void draw() {
  background(255);

  //current tree
  for (int j =0; j < treeList.size(); j++)
  {
    tree = treeList.get(j);
    tree.drawTree(tree.xPos, tree.yPos, tree.rotation, tree.tall);
  }

  //current flower
  for(int i = 0; i < flowerList.size(); i ++){
    flowers = flowerList.get(i);
    flowers.drawFlower();
  }
drawMouseTree(mouseX, mouseY, HALF_PI, height/12);

}

void mousePressed() {
  treeList.add(new Tree(mouseX, mouseY, HALF_PI, height/12));
  flowerList.add(new Flower(mouseX, mouseY, HALF_PI, height/12));
}

void drawMouseTree(float xPos, float yPos, float rotation, float tall) {
  //growing branch 
  float endX = xPos - tall * cos(rotation);
  float endY = yPos - tall * sin(rotation);

  //draw a tree
  stroke(0);
  strokeWeight(2);
  line(xPos, yPos, endX, endY);

  //create 2 branches 
  if (tall > 5 ) {
    drawMouseTree(endX, endY, rotation - PI/5, tall * 0.7); //left
    drawMouseTree(endX, endY, rotation + PI/5, tall * 0.7); //right
  }

  //create flowers each branch
  if (tall > 5 ) {

    stroke(255,102,178);
    fill(255, 102, 178);
    ellipse(endX, endY, 5, 5);
  }
}


class Tree {
  float xPos, yPos;
  float rotation;
  float tall, endX, endY;

  Tree(float xPos, float yPos, float rotation, float tall) {
    this.xPos = xPos;
    this.yPos = yPos;
    this.rotation = rotation;
    this.tall = tall;
  }

  void drawTree(float xPos, float yPos, float rotation, float tall) {
    //end of a branch
    float endX = xPos - tall * cos(rotation);
    float endY = yPos - tall * sin(rotation);

    //draw a tree
    stroke(0);
    strokeWeight(2);
    line(xPos, yPos, endX, endY);

    //create 2 branches 
    if (tall > 5) {
      drawTree(endX, endY, rotation - PI/5, tall * 0.7); //left
      drawTree(endX, endY, rotation + PI/5, tall * 0.7); //right
    }
  }
}

class Flower extends Tree {

  Flower(float xPos, float yPos, float rotation, float tall) {
    super(xPos, yPos, rotation, tall);
  }


  void drawFlower() {
    super.drawTree(xPos, yPos, rotation, tall);

    //create flowers each branch
    if (tall < 40 && tall > 5) { //so the flowers will appear around top of tree


      stroke(255, 102, 178);
      fill(255, 102, 178);
      ellipse(endX, endY, 5, 5);
    }
  }
}

我仍然是超级儿童班概念的新手。任何帮助解决这个问题将非常感激!

修改 找出我在drawFlower()中使用endX,endY的错误。这是新代码:

class Flower extends Tree {

  Flower(float xPos, float yPos, float rotation, float tall) {
    super(xPos, yPos, rotation, tall);
  }

  void drawFlower() {
    super.drawTree(xPos, yPos, rotation, tall);
    //create flowers each branch

    if (tall > 5 ) {
      //draw flower

      stroke(255, 102, 178);
      fill(255, 102, 178);
      ellipse(finX, finY, 5, 5);

    }
  }
}
class Tree {
  float xPos, yPos;
  float rotation;
  float tall, finX, finY;

  Tree(float xPos, float yPos, float rotation, float tall) {
    this.xPos = xPos;
    this.yPos = yPos;
    this.rotation = rotation;
    this.tall = tall;
  }

  void drawTree(float xPos, float yPos, float rotation, float tall) {
    //end of a branch
    float endX = xPos - tall * cos(rotation);
    float endY = yPos - tall * sin(rotation);
    finX = endX;
    finY = endY;

    //draw a tree
    stroke(0);
    strokeWeight(2);
    line(xPos, yPos, endX, endY); //branch

    //create 2 branches 
    if (tall > 5) {

      drawTree(endX, endY, rotation - PI/5, tall * 0.7); //left
      drawTree(endX, endY, rotation + PI/5, tall * 0.7); //right
    }
  }
}

然而,结果是:http://i.imgur.com/gNLeKsB.png 无论如何在树的每个末端分支上都有一朵花? 像这样:http://i.imgur.com/wz2iNgP.png

1 个答案:

答案 0 :(得分:0)

 

您的窗口height800

您传递到TreeFlower构造函数的最后一个参数是height/12

800/1266.6666...,会被截断为66

换句话说,tall变量包含值66。然后在此if语句中使用该变量:

if (tall < 40 && tall > 5) {

由于if 小于66,因此此40声明永远不会评估为真。

您只需在tall声明之前打印出if的值,即可轻松自行测试:

println(tall);

即使您对if声明发表评论,您仍然无法看到鲜花。同样,救援的println()功能:

  stroke(255, 102, 178);
  fill(255, 102, 178);
  println(endX + ", " + endY); //prints 0.0, 0.0
  ellipse(endX, endY, 50, 50);

此时endXendY的值始终为0。这对你如何使用它们很有意义。

我知道你在这里要去做什么,但是在代码的这一点上,你真的无法访问分支机构的最终位置。

如果我是你,我开始会更简单。不是使用递归函数来绘制树木,而是从顶部开一条花,然后从那里开始。