This site requires JavaScript, please enable it in your browser!
Greenfoot back
Kevin_Bacon
Kevin_Bacon wrote ...

2012/10/19

Changing health meter

Kevin_Bacon Kevin_Bacon

2012/10/19

#
I need this question to be answered in the next three hours. My hero has a hunger meter, it increases every time act is called. When it hits a certian value, he starves and its game over. I have a hunger counter that shows up on screen. The variable increases in value, but the counter does not change. I need the counter to update itself every time the value of hunger increases, but I'm having trouble. When the hero eats food, hunger decreases. I need the counter to update with that info too. Here is the code I have. It may look long, but do not read it all, only pay attention to the things that have to do with hunger In World Class: import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.List; /** * Write a description of class BigWorld here. * * @author (your name) * @version (a version number or a date) */ public class BigWorld extends World { private Level _currentLevel; private Score _score; private Hunger _hunger; private boolean isGameOver; private boolean isGameRunning; private int numEnemies; private int moar; GreenfootSound backgroundmusic = new GreenfootSound("bubbleman.mp3"); /** * Constructor for objects of class BigWorld. * */ public BigWorld() { // Create a new world with 800x600 cells with a cell size of 1x1 pixels. super(800, 600, 1); _currentLevel = new Level1(); _currentLevel.prepare(this); _score = new Score(); addObject(_score, 78, 34); _hunger = new Hunger(); addObject(_hunger, 78, 64); Hero hero = new Hero(); addObject(hero, 400, 311); isGameOver = false; isGameRunning = false; numEnemies = getObjects( Enemy.class ).size(); prepare(); } public void started() { backgroundmusic.playLoop(); } public void changeScore(Integer newScore) { _score.setScore(newScore); } public void changeHunger(Integer newHunger) { _hunger.setHunger(newHunger); } public void isLevelUp() { if(getObjects(Food1.class).size() == 0) { _currentLevel = _currentLevel.nextLevel(); _currentLevel.prepare(this); } } /** * Prepare the world for the start of the program. That is: create the initial * objects and add them to the world. */ public Score getScore(){ return _score; } public Hunger getHunger(){ return _hunger; } private void prepare() { Score score = new Score(); addObject(score, 277, 81); score.setLocation(69, 36); removeObject(score); Hunger hunger = new Hunger(); addObject(hunger, 277, 100); hunger.setLocation(69, 50); } public void act() { if (Greenfoot.getRandomNumber(1000) < 1) { addObject (new Enemy(), 411, 558); //moar = moar + 1; } if (Greenfoot.getRandomNumber(1000) < 2) { addObject (new Enemy2(), 200, 100); //moar = moar + 1; } if ( ! isGameOver ) { int numEnemies = getObjects( Enemy.class ).size(); } if ( !isGameRunning && numEnemies > 0 ) { isGameRunning = true; } else if ( isGameRunning && numEnemies == 3 ) { isGameOver = true; onEndGame(); Greenfoot.stop(); } } public void onEndGame() { System.out.println( "Too many enemies! GAME OVER!" ); Greenfoot.stop(); } } In Hero Class: import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** * Write a description of class Hero here. * * @author (your name) * @version (a version number or a date) */ public class Hero extends Actor { private int hunger; private int health; private int fed; private int crash; private int anothercrash; private String lastEnemyHit; //stuff for third version of score private Score _score; public Hero() { hunger = 0; health = 25; lastEnemyHit = null; } /** * Third version of score */ public Hero(Score score) { fed = 0; _score = score; } /** * Act - do whatever the Hero wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. */ private void checkForHunger() { for(int hunger = 0; hunger < 4000; hunger++){ //first world.changeHunger(hunger); //second Hunger hunger = world.getHunger(); hunger.incrementHunger(); //third _hunger.incrementHunger(); } } public void act() { checkForHunger(); if (Greenfoot.isKeyDown("left")) { setRotation(180); move(15); } if (Greenfoot.isKeyDown("right")) { setRotation(0); move(15); } if (Greenfoot.isKeyDown("down")) { setRotation(90); move(15); } if (Greenfoot.isKeyDown("up")) { setRotation(270); move(15); } if (getOneIntersectingObject(Enemy.class) !=null) { health = health - 1; crash = crash + 1; Greenfoot.playSound("Hit.wav"); } if (getOneIntersectingObject(Enemy2.class) !=null) { health = health - 1; anothercrash = anothercrash + 1; Greenfoot.playSound("Hit.wav"); } //if (crash == 2) { //crash = 0; //fed = 0; //} //if (anothercrash == 2) { //anothercrash = 0; //fed = 0; //} if (health == 0) { ((BigWorld) getWorld()).backgroundmusic.stop(); Greenfoot.stop(); } if (getOneIntersectingObject(Mine.class) !=null) { Greenfoot.playSound("boom.wav"); ((BigWorld) getWorld()).backgroundmusic.stop(); Greenfoot.stop(); } if (getOneIntersectingObject(Food1.class) !=null) { hunger = hunger -1000; fed = fed + 1; } if(lastEnemyHit == "Enemy.class"){ for (int fed = 0; fed < 10; fed++) { int worldX = Greenfoot.getRandomNumber(getWorld().getWidth()); int worldY = Greenfoot.getRandomNumber(getWorld().getHeight()); getWorld().addObject(new Food1(), worldX, worldY); } fed = 0; } if (hunger == 4000) { ((BigWorld) getWorld()).backgroundmusic.stop(); getWorld().removeObject(this); Greenfoot.stop(); } if (hunger == 1000) { getImage().setTransparency(200); } if (hunger == 2000) { getImage().setTransparency(150); } if (hunger == 3000) { getImage().setTransparency(100); } } private void hitFoes() { } private void checkForFood() { Actor collidedWith; collidedWith = getOneIntersectingObject(Food1.class); //Actor collideWith = getOneIntersectingObject(Feather.class); BigWorld world = (BigWorld)getWorld(); if(collidedWith != null) { //turn(180); if(hunger >= 2000) { getWorld().removeObject(collidedWith); fed = fed + 1; hunger = hunger - 1000; //first version of changing score world.changeScore(fed); //Second version of changing score Score score = world.getScore(); score.incrementScore(); //Third _score.incrementScore(); //here is where we would call isLevelUp world.isLevelUp(); } } } } Hunger meter class: import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** * Write a description of class Score here. * * @author (your name) * @version (a version number or a date) */ public class Hunger extends Actor { private Integer _hunger; public Hunger() { _hunger = 0; GreenfootImage image = new GreenfootImage(100, 20); image.setColor(java.awt.Color.BLACK); image.drawString("Hunger: " + _hunger, 0, 10); setImage(image); } private void updateHunger() { GreenfootImage image = getImage(); image.clear(); image.setColor(java.awt.Color.BLACK); image.drawString("Hunger: " + _hunger, 0, 10); setImage(image); } public void incrementHunger() { _hunger++; updateHunger(); } public void addToHunger(Integer amount) { _hunger = _hunger + amount; updateHunger(); } public void setHunger(Integer amount) { _hunger = amount; updateHunger(); } /** * Act - do whatever the Score wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. */ public void act() { //incrementScore(); } }
danpost danpost

2012/10/19

#
I think it would be a lot easier if you removed everything refering to hunger from the Hero class; then, move the Hunger object from the world to the Hero class
// in the Hero class
// instance variable
Hunger hunger = new Hunger();
// add the following method
public void addedToWorld(World world)
{
    world.addObject(hunger, 277, 100);
}
// now, in the act method, add
hunger.incrementHunger();
// when the hero eats, add
hunger.addToHunger(-1000);
// for checking its value
int h = hunger.getValue();
getImage().setTransparency(255);
if (h >= 1000) getImage().setTransparency(200);
if (h >= 2000) getImage().setTransparency(150);
if (h >= 3000) getImage().setTransparency(100);
if (h >= 4000)
{
    ((BigWorld) getWorld()).backgroundmusic.stop();
    getWorld().removeObject(this);
    Greenfoot.stop();
}
// In the Hunger class, add this method
public int getValue()
{
    return _hunger;
}
This same adjustment can be done with the Score object, since it also is directly related to the Hero object.
Kevin_Bacon Kevin_Bacon

2012/10/19

#
Am fixing this up, will update shortly on how things are going
Kevin_Bacon Kevin_Bacon

2012/10/19

#
I got this error. damn the error reporter is so vague: addedToWorld(greenfoot.World) in Hero cannot override addedToWorld(greenfoot.world) in greenfoot.Actor attempting to assign weaker access priveleges; was protected EDIT: the error went away after I changed the name of addedToWorld to 'addToWorld'. The code compiled for everything just fine. But the counter still does not work :(
danpost danpost

2012/10/19

#
The name of the method must be 'addedToWorld'; however, I think what the error message is saying, is it needs to be 'protected void addedToWorld(World world)'.
Kevin_Bacon Kevin_Bacon

2012/10/19

#
Too late, the assignment was due @ 11:55. But this will probably be on the quiz tomorrow. Thanks
You need to login to post a reply.