Get value from an Arraylist of Objects - processing

北城余情 提交于 2019-12-23 05:32:35

问题


I'm making a virtual pet game, and I am now trying to include hunger, however I'm not sure how to make the eat function work. I am trying to make it decrease through the addition of the nutrition value of an item of food. This value is in an object that is stored in an arraylist.

Is there a way to reference

 int nutrition(int eaten) {
    nutrition = nutrition - eaten;
    return nutrition;

(int eaten will be passed in later)

inside

ArrayList items;

void setup() {
    items = new ArrayList();
}


void draw() {
    for (int i = items.size() - 1; i >=0; i --) {
      Food food = (Food) items.get(i);
      food.display();
      if (food.finished()) {
        items.remove(i);
      }
    }
  }

  void mouseClicked() {
    items.add(new Food(mouseX, mouseY, 1));
  }





((Food)items.get(i)).nutrition();

http://www.java-forums.org/new-java/2370-how-return-object-arraylist.html I've tried to use this, but Processing is unable to find i. I believe this to be because i does not exist in the class, only in the main sketch. If this is so, I will find a way to place i into the method. Maybe using return.

I would appreciate the knowledge if someone was aware of a better way to do this.

CODE

Creature creature;
ArrayList items;
Hand hand;
String data[];
int gameInfo[];
int tempData[];
boolean haveFood;

void setup() {
  size(100, 100);
  smooth();
  noCursor();
  String data[] = loadStrings("save.txt");
  String[] tempData = split(data[0], ',');
  gameInfo = int(tempData);
  for (int i = 0; i < data.length; i++) { 
    creature = new Creature(gameInfo[0], gameInfo[1], gameInfo[2], gameInfo[3]);
    haveFood = false;
    hand = new Hand();
    items = new ArrayList();
  }
}

  void draw() {
    background(255);
    for (int i = items.size() - 1; i >=0; i --) {
      Food food = (Food) items.get(i);
      food.display();
      if (food.finished()) {
        items.remove(i);
      }
    }
    creature.whatWant();
    creature.whatDo(haveFood);
    hand.draw();
  }



  void mouseClicked() {
    items.add(new Food(mouseX, mouseY, 1));
    haveFood = true;
  }


class Creature {
  int hunger;
  int age;
  int gender;
  int asleep;
  boolean idle;
  char want;
  char request;



  Creature(int _gender, int _age, int _hunger, int _asleep) {
    gender = _gender;
    age = _age;
    hunger = _hunger;
    asleep = _asleep;
    idle = true;
  }  

  void whatWant() {
    if (hunger == 50) {
      want = 'H';
    }
  }

  void whatDo(boolean food) {
    if (idle == true) {
      switch(want) {
      case 'H':
        if (food == true) {
          creature.eat();
        }
        else 
          request = 'F';
        ask();
      }
    }
    else
    {
      println("IDLE");
    }
  }

  void ask() {
    if (request == 'F') {
      println("HUNGRY");
    }
  }
  void eat() {
    println("EAT");
((Food)items.get(i)).nutrition();
  }
}

class Food {
  float posX;
  float posY;
  int nutrition;


  Food(float _posX, float _posY, int rating) {
    posX = _posX;
    posY = _posY;
    nutrition = rating;
  }

  void display() {
    rect(posX, posY, 10, 10);
  }

  boolean finished() {
    if (nutrition < 0) {
      return true;
    }
    else {
      return false;
    }
  }

  int nutrition(int eaten) {
    nutrition = nutrition - eaten;
    return nutrition;
  }
}

class Hand {
  int posX;
  int posY;

  Hand() {
    posX = mouseX;
    posY = mouseY;
  }

  void draw() {
    rectMode(CENTER);
    point(mouseX, mouseY);
  }
}

Where save.txt is a txt file with 1,1,50,1,1.


回答1:


Unfortunately I can't provide a nice detailed answer. There are quite a few confusing things with the structure of your project and it's code.

In the meantime, you had a syntax error in the Creature's eat() function. Try this:

  void eat() {
    println("EAT");
    //((Food)items.get(i)).nutrition();
    for(int i = 0 ; i < items.size(); i++){
      Food yummy = (Food)items.get(0);
      yummy.nutrition(hunger);
    }
  }

The above works because items is declared at the top and therefore visible through out the scope of the whole sketch(global in other words). I'm not sure if this is intentional or what relationship you plan between creatures and food.

The above can be written in a lazier(but less common/obvious) way like so:

  void eat() {
    println("EAT");
    //((Food)items.get(i)).nutrition();
    for(Object yummy : items) ((Food)yummy).nutrition(hunger);
  }

I assume the creature will be fed based on how hungry it. At some point the creature should be full I suppose, so you would also update the creature's hungry property based on the nutrition it gets from food, etc.

Also, just to test, I've added very nutritious food :P

items.add(new Food(mouseX, mouseY, 10000));


来源:https://stackoverflow.com/questions/15015560/get-value-from-an-arraylist-of-objects-processing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!