Help needed "the function add does not exist"

Hi there,

I’am trying to make a animation with animals increasing in number. But i run in to an error :frowning:
i now have one animal that is increasing in number ( katten) .
but i want the “paarden” to do the same.
Can someone of you help me by telling what im doing wrong?
I now get the error “the function add does not exist”, it refers to line 235

here is my code:


int _LEFT = -1; //dit gaat over de richting van het dier
int _RIGHT = 1;
int _DOWN = -1;
int _UP = 1;

int KAT = 0; // dit zijn alle dieren
int HOND = 1;
int PAARD = 2;
int KIP = 3;
int GANS = 4;
int SCHAAP = 5;
int VARKEN = 6;
int KONIJN = 7;
int KOE = 8;

class Animal {
  float x; //richting snelheid waar ze zijn op het scherm
  float y;
  int dirX = _RIGHT;
  int dirY = _UP;
  float speedX;
  float speedY;
  boolean isFood; // of het plaatje voedsel of pet is
}

class Animal_Groep { //dit is een overall groep voor de dieren. het naamkaartje, het type dier, welk dier het is uit de arraylist,  de data van de pixel afbeelding, en de fotos 
  String label; 
  int type; // KOE / KIP etc.
  ArrayList<Animal> animals = new ArrayList<Animal>();
  int[] data;
  PImage img;
}
Animal_Groep koeien_voedsel_groep; //groepen per dier
Animal_Groep koeien_groep;
Animal_Groep katten_groep;
Animal_Groep honden_groep;
Animal_Groep paarden_groep;
Animal_Groep paarden_voedsel_groep;
Animal_Groep kippen_groep;
Animal_Groep kippen_voedsel_groep;
Animal_Groep ganzen_groep;
Animal_Groep ganzen_voedsel_groep;
Animal_Groep schapen_groep;
Animal_Groep schapen_voedsel_groep;
Animal_Groep varken_groep;
Animal_Groep varken_voedsel_groep;
Animal_Groep konijn_groep;
Animal_Groep konijn_voedsel_groep;


PImage cow_image; //per dier een foto van een eet dier en een pet dier
PImage cow_image_food;

PImage chicken_image;
PImage chicken_image_food;

PImage varken_image;
PImage varken_image_food;

PImage gans_image;
PImage gans_image_food;

PImage konijn_image;
PImage konijn_image_food;

PImage paard_image;
PImage paard_image_food;

PImage schaap_image;
PImage schaap_image_food;

PImage hond_image;
PImage hond_image_food;

PImage kat_image;
PImage kat_image_food;

float animal_scale_start = 1; //de schaal van het dier -wordt kleiner naarmate meer frames geweest zijn
float animal_scale_end = 0.1;
int n_frames = 60 * 30;

PFont font; 

void setup() {
  size(900, 900, P2D);
  background(255);

  font = createFont("Helvetica", 20); // deze moet in de setup anders wordtie heel traag... maar nu wel beetje pixelig

  cow_image = loadImage("koe.png");  // alle verschillende afbeeldingen
  cow_image_food = loadImage("Cow.png");
  chicken_image = loadImage("Kip.png");
  chicken_image_food = loadImage("kipvlees.png");
  varken_image = loadImage("varken.png");
  varken_image_food = loadImage("varkenvlees.png");
  gans_image = loadImage("gans.png");
  gans_image_food = loadImage("gansvlees.png");
  konijn_image = loadImage("konijn.png");
  konijn_image_food = loadImage("konijnvlees.png");
  paard_image = loadImage("paard.png");
  paard_image_food = loadImage("paardvlees.png");
  schaap_image = loadImage("schaap.png");
  schaap_image_food = loadImage("schaapvlees.png");
  hond_image = loadImage("hond.png");
  kat_image = loadImage("kat.png");

  //ALLE GROEPEN

  //koeien_voedsel_groep = new Animal_Groep();   //de koeien groep, eerst de foto, dan hoe hij moet toenemen(data), dan de andere foto. het label. en het type dier uit de arraylist nummer 8
  //PImage data_koe_voedsel_img = loadImage("data_koe_voedsel.png");
  //koeien_voedsel_groep.data = img_to_data(data_koe_voedsel_img, 150);
  //koeien_voedsel_groep.img = cow_image_food;
  //koeien_voedsel_groep.label = "KOE";
  //koeien_voedsel_groep.type = KOE;

  //koeien_groep = new Animal_Groep();   
  //PImage data_koe_pet_img = loadImage("data_koe_pet.png");
  //koeien_voedsel_groep.data = img_to_data(data_koe_pet_img, 150);
  //koeien_voedsel_groep.img = cow_image;
  //koeien_voedsel_groep.label = "KOE";
  //koeien_voedsel_groep.type = KOE;


  katten_groep = new Animal_Groep();   //de koeien groep, eerst de foto, dan hoe hij moet toenemen(data), dan de andere foto. het label. en het type dier uit de arraylist nummer 8
  PImage data_kat_pet_img = loadImage("data_kat_pet.png");
  katten_groep.data = img_to_data(data_kat_pet_img, 150);
  katten_groep.img = kat_image;
  katten_groep.label = "KAT";
  katten_groep.type = KAT;

  paarden_voedsel_groep = new Animal_Groep();   //de koeien groep, eerst de foto, dan hoe hij moet toenemen(data), dan de andere foto. het label. en het type dier uit de arraylist nummer 8
  PImage data_paard_voedsel_img = loadImage("data_paard_voedsel.png");
  paarden_voedsel_groep.data = img_to_data(data_paard_voedsel_img, 150);
  paarden_voedsel_groep.img = paard_image_food;
  paarden_voedsel_groep.label = "PAARD";
  paarden_voedsel_groep.type = PAARD;
}

int[] img_to_data(PImage img, int max) { // hier leest het de data afbeelding. zoek de witte kleur. voor elke witte pixel die hij vind neemt het aantal toe. breedte is 300 hoogte is 100. 

  img.loadPixels();

  int white = color(255);

  int[] data = new int[300];
  for (int x = 0; x < 300; x++) {
    // find white pixel
    int y;
    for (y = 0; y < 100; y++) {
      int index = y * 300 + x; //moet dit 100 of 300 zijn? of 150 (max aantal dieren op het moment
      if (img.pixels[index] == white) {
        break;
      }
    }
    data[x] = (int) map(y, 0, 100, max, 0);
  }

  return data; //return anders blijft ie er in hangen
}


void draw() {
  float progress = norm(frameCount, 1, n_frames);  //framecount is nodig voor de tijdsduur van de animatie


  background(190, 208, 208);
  fill(64, 2, 204);
  rect(0, 0, width/2, height); 

  //TEXT
  String e = String.join("\n", //op deze manier staan ze beiden in het midden
    "D", 
    "I", 
    "E", 
    "R", 
    "E", 
    "N", 
    " ", 
    "E", 
    "T", 
    "E", 
    "N");

  String a = "DIEREN AAIEN";  //deze moet ik denk ik nog aanpassen

  textFont(font);
  textAlign(CENTER, CENTER);

  float y = 280;
  //for (int i = 0; i < e.length(); i ++) {
  //  char c = e.charAt(i);
  //  fill(255);
  //  text(e.charAt(i), 200, y);
  //  y = y + 30;
  //}
  fill(255);
  textSize(50);
  textAlign(CENTER, CENTER);
  text(e, 0, 0, width/2, height);
  for (int i = 0; i < a.length(); i ++) {
    char c = a.charAt(i);
    fill(255);
    text(a.charAt(i), 600, y);
    y = y + 80;
  }


  // koeien_voedsel_groep 
  {
    Animal_Groep g = katten_groep,  paarden_voedsel_groep; //g wordt een verkorting voor koeien_voedsel_groep


    int data_index = int(map(progress, 0, 1, 0, g.data.length)); //hier kijkt ie naar de data. 
    int num_katten_wanted = g.data[data_index]; // hoeveel koeien er gevraagd worden haalt ie uit g.data 
    int num_paarden_voedsel_wanted =g.data[data_index]; 

    if (g.animals.size() < num_katten_wanted) { //als er geen koeien zijn begint ie bij 0 en te tellen. omhoog. nog niet atrekken. 
      for (int i = g.animals.size(); i < num_katten_wanted; i++) {
        Animal kat = create_animal(true);
        katten_groep.animals.add(kat);
      }
      if (g.animals.size() < num_paarden_voedsel_wanted) { //als er geen koeien zijn begint ie bij 0 en te tellen. omhoog. nog niet atrekken. 
        for (int i = g.animals.size(); i < num_paarden_voedsel_wanted; i++) {
          Animal paard = create_animal(true);
          paarden_voedsel_groep.add(paard);
        }
      }
    }

  
    println(g.animals.size());

    update_animals(g);
    draw_animals(g);
  }

  // kippen
  // ...
  // ...


  surface.setTitle(""+frameRate); //nu zie je bovenin wat de framerate is, makkelijk om te zien of ie trager wordt
}


void update_animals(Animal_Groep g) {

  ArrayList<Animal> animals = g.animals;

  for (int i = 0; i < animals.size(); i++) {
    Animal a = animals.get(i);
    //
    // move
    //

    if (a.y < 0) {
      a.dirY = a.dirY == _UP ? _DOWN : _UP;
    }

    // x
    if (random(1) < 0.1) {  //de helft kans dat het dier links of rechts gaat
      a.dirX = random(1) < 0.5 ? _LEFT : _RIGHT;
      a.speedX = random(0, 2); // snelheid zit tussen 0 en 3
    }
    // y
    if (random(1) < 0.05) { // de helft kans dat het dier op en neer gaat
      a.dirY = random(1) < 0.5 ? _UP : _DOWN;
      a.speedY = random(0, 2);
    }

    a.x += a.dirX * a.speedX;  //de richting van het dier. 
    a.y += a.dirY * a.speedY;

    if (a.isFood) {
      if (a.x > width/2) {
        a.x = width/2;
      }
    } else {
      if (a.x < width/2) {
        a.x = width/2;
      }
    }
  }
}


void draw_animals(Animal_Groep g) {

  ArrayList<Animal> animals = g.animals;

  for (int i = 0; i < animals.size(); i++) {
    Animal a = animals.get(i);
    //
    // draw
    //

    imageMode(CENTER); //begin in het midden van het scherm en centreer om het midden heen
    pushMatrix();
    translate(a.x, a.y);
    scale(a.dirX, 1);

    float zoom_scale = map(frameCount, 0, n_frames, animal_scale_start, animal_scale_end); //het zoomt uit naarmate meer framecounts geweest zijn en de dieren worden kleiner
    scale(zoom_scale);

    //println(g.label);
    image(g.img, 0, 0);
    popMatrix();

    fill(0);
    textSize(12);
    text(g.label, a.x, a.y - 5); //de tekst van de naam van het dier
  }
}

Animal create_animal(boolean isFood) {

  Animal an = new Animal();

  if (isFood) {
    an.x = random(0, width/2)/**0.7*/; //verandert waar de dieren zijn op de pagina. 
    an.y = random(height); //onder of boven op de pagina
  } else {
    an.x = random(width/2, width)/**0.7*/; //verandert waar de dieren zijn op de pagina. 
    an.y = random(height); //onder of boven op de pagina
  }

  an.dirX = random(1) < 0.5 ? _LEFT : _RIGHT; //de richting waarin ze bewegen
  an.dirY = random(1) < 0.5 ? _UP : _DOWN;
  an.speedX = random(2); //de snelheid waarmee ze bewegen
  an.speedY = random(2);
  an.isFood = isFood;
  return an;
}
1 Like

start by hitting ctrl-t in processing

in the forum go back, edit your post

mark code and click the </> sign in the command bar

Chrisir

I don’t understand much here but this line:

Animal_Groep g = katten_groep, paarden_voedsel_groep;

looks suspicious

Problem

In this line you forgot animals.

paarden_voedsel_groep.add(paard);

should be

paarden_voedsel_groep.animals.add(paard);

1 Like

thanks! that looks way better.
Ooh yep thats it. thanks! :blush:

1 Like