Hello! This is the final part of my project. Here, I want to make the number of flames (projectile) mario can throw be equal to the score of the world, and as mario shoots the projectile, the score also decreases! I tried a couple things, but nothing really worked. If you all could help, it would be appreciated
Score class:
FireBall:
Hero:
World:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* The parent class of worlds
*
* @soumya.__.khanna (Soumya Khanna)
* @I'llLookItUp (Jun 17th, 2020)
*/
public class Worlds extends World
{
public int width = getWidth(); //Width of the world --Accessed in children classes
public static Hero mario = new Hero(); //Declaring the Swimming Mario Class
//Number of hearts based on the life of Mario
public Life life0;
public Life life1;
public Life life2;
public Life life3;
public Life life4;
public Score score; //Adding the score board
public void act()
{
checkLife();
}
public Worlds()
{
// Create a new world with 600x400 cells with a cell size of 1x1 pixels.
super(2200, 576, 1, false);
}
public void lifeCounter(int x, int y)
{
//Declaring all lives
life0 = new Life();
life1 = new Life();
life2 = new Life();
life3 = new Life();
life4 = new Life();
//Adding lifes evenly spaced around
addObject(life0, x, y);
addObject(life1, x + 30, y);
addObject(life2, x + 60, y);
addObject(life3, x + 90, y);
addObject(life4, x + 120, y);
}
public void checkLife()
{
int lives = Hero.getLives();
if (lives == 4)
{
removeObject(life4);
}
if (lives == 3)
{
removeObject(life3);
}
if (lives == 2)
{
removeObject(life2);
}
if (lives == 1)
{
removeObject(life1);
}
if (lives == 0)
{
removeObject(life0);
}
}
public Score getScore()
{
return score; //Information from scoreboard
}
}
And Coin Block -- by bumping into which Mario increases score.
Thank you!
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 Score extends Actor
{
private String label;
private int score;
//Font and text variables:
private int fontSize;
private Color fontColour;
private Color backgroundColour;
private String scoreText;
public Score(int score)
{
this.score = score;
//What the score will sppear as
fontSize = 32;
fontColour = Color.ORANGE;
backgroundColour = new Color(0,0,0,0);
this.label = "Score: " + score;
updateImage();
}
public void update(int change)
{
score += change;
setLabel("Score: " + score);
}
public void setLabel(String text)
{
this.label = text;
updateImage();
scoreText = "Score: " + score;
}
public void updateImage()
{
GreenfootImage myImg = new GreenfootImage(label, fontSize, fontColour, backgroundColour); //Properties of the scoreboard
setImage(myImg); //Set the image as it updates
}
}
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class FireBall here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class FireBall extends Actor
{
private static GreenfootImage[] FLAME = {new GreenfootImage("Flame0.gif"),
new GreenfootImage("Flame1.gif")};
private GreenfootImage[] animation;
private int speed, damage;
private int frame;
private int actCounter;
int skipRate = 20;
public void act()
{
marioAnimator();
updateAmimation();
actCounter++;
move(speed);
checkBoundaries();
}
public FireBall()
{
animation = FLAME; //Animation when staying the way it is
}
public FireBall( int s, int d)
{
speed = s;
damage = d;
}
public void updateAmimation()
{
if(animate())
{
if(frame >= animation.length)//Bring frame to beginning of array to not crash
{
frame = 0;
}
setImage(animation[frame]);
frame++;
}
}
public boolean animate()
{
return actCounter % skipRate == 0;
}
public void marioAnimator()
{
animation = FLAME; //The animation sequence to play
this.skipRate = skipRate ; //How fast the animation will be in each case
actCounter = skipRate;
//frame = 0;
}
public void checkBoundaries()
{
GreenfootImage img = getImage();
int width = img.getWidth();
int height = img.getHeight();
World livesIn = getWorld();
int left = getX() - width/2;
int right = getX() + width/2;
int top = getY() - height/2;
int bottom = getY() + height/2;
if( left <= 0)
{
livesIn.removeObject(this);
}
else if( right >= livesIn.getWidth())
{
livesIn.removeObject(this);
}
else if(top <= 0)
{
livesIn.removeObject(this);
}
else if(bottom >= livesIn.getHeight())
{
livesIn.removeObject(this);
}
}
}
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
{
public static GreenfootImage[]IDLE =
{new GreenfootImage("Idle0.png"),
new GreenfootImage("Idle1.png"),
new GreenfootImage("Idle2.png"),
new GreenfootImage("Idle3.png"),
new GreenfootImage("Idle4.png"),
new GreenfootImage("Idle5.png"),
new GreenfootImage("Idle6.png"),
new GreenfootImage("Idle7.png")};
public static GreenfootImage[] GROUNDLEFT =
{new GreenfootImage("Left1.png"),
new GreenfootImage("Left2.png"),
new GreenfootImage("Left3.png")};
public static GreenfootImage[] GROUNDRIGHT =
{new GreenfootImage("Right1.png"),
new GreenfootImage("Right2.png"),
new GreenfootImage("Right3.png")};
public boolean triggerReleased; //Once weapon has been released
public int attackCycle; //For the hero to attack
public static int LifeLine;
public int speed; //Refers to the heros' speed, and health
public int frame;
public int actCounter;
public int skipRate;
public int floor = 440;
public GreenfootImage[] animation;
//ints
//doubles to allow decimals
public double gravity, gravityIncrement;
//Booleans
public boolean groundLevel;
public boolean changeAnimation;
public boolean movingRight;
public boolean ifIdle;
public boolean movingLeft;
public boolean damageTaken = false; //Hero has not taken any damage
public int damageTakenTimer = 0;
public void act()
{
updateAmimation();
actCounter++;
attack();
triggerReleased = true; //Trigger is released
marioMover();
gravity();
checkCeiling();
floatingMario();
}
public Hero()
{
this.LifeLine = 5;
frame = 0; //initial frame
skipRate = 75; //speed of animaation
actCounter = 0; //initial act
speed = 3; //How fast it moves
gravityIncrement = .05; //Velocity
gravity = 1;
}
public void updateAmimation()
{
if(animate())
{
setImage(animation[frame]);
frame ++;
if( frame >= animation.length)
{
frame = 0;
}
}
}
public boolean animate()
{
return actCounter % skipRate == 0;
}
public void fireWeapons(FireBall fireThis)
{
fireThis.setRotation (getRotation());
getWorld().addObject (fireThis,getX(),getY());
fireThis.move(getImage().getWidth()/2);
}
public void attack()
{
if(attackCycle <= 0) //To avoid rapid shooting
{
if(Greenfoot.isKeyDown("M"))
{
fireWeapons(new FireBall(3, 3)); //Shoot the weapons depending on whether or not key is pressed
}
else
{
triggerReleased = true; //Otherwise, trigger is released.
}
attackCycle = 10; // n being the cooldown in act cycles.
}
else if(attackCycle > 0)
{
attackCycle--; // decrement by 1 per act cycle.
}
}
public void moveToGround(Actor ground)
{
int groundHeight = ground.getImage().getHeight();
int newY = ground.getY() - (groundHeight + getImage().getHeight())/2;
setLocation(getX(),newY);
groundLevel = true;
}
public void checkCeiling()
{
try
{
Actor ceiling = getOneObjectAtOffset(0, -getCustomHeight(), Block.class);//Create information of platforms at offset
if(ceiling != null)//Check for platform(double negative)
{
groundLevel = false;
goToCeiling(ceiling);
}
}
catch(IllegalStateException ex)
{
//yay
}
}
public void goToCeiling(Actor ceiling) //Check for what is on top of Mario's head
{
int ceilingHeight = ceiling.getImage().getHeight();
int ceilingBottom = ceiling.getY() + ceilingHeight/2;
setLocation(getX(), ceilingBottom+getCustomHeight()); //Set this location
if(getY() == ceilingBottom+getCustomHeight())
{
setLocation(getX(), getY() +(int) gravity); //Stay at the same x value, but fall with gravity
gravity = gravity + 70*gravityIncrement; //Adding velocity
}
}
public void floatingMario()
{
if (getY() >= floor) //Don't go past the floor
{
setLocation(getX(), floor);
groundLevel = true;
//gravity = 0
}
}
public void gravity()
{
setLocation(getX(), getY() +(int) gravity); //Stay at the same x value, but fall with gravity
gravity = gravity + gravityIncrement; //Adding velocity
if(groundLevel)
{
gravity = 0;
}
}
public void marioMover()
{
try
{
if (Greenfoot.isKeyDown("left")) //Go in the left direction(accoring to speed), if left key is down
{
setLocation(getX() - speed, getY());
movingLeft = true;
}
if (Greenfoot.isKeyDown("right")) //Move right
{
setLocation(getX() + speed, getY());
movingRight = true;
}
gravity(); //Fall from the top, and after jumps
}
catch(IllegalStateException ex)
{
}
}
//Getters and Setters
public int getSpeed()
{
return speed; //Get information from speed
}
public void setSpeed(int s)
{
speed = s;
}
public int getHeight()
{
return getImage().getHeight();
}
public int getCustomHeight()
{
return getImage().getHeight()/4;
}
public int getWidth()
{
return getImage().getWidth();
}
public int getCustomWidth()
{
return getImage().getWidth()/4;
}
public static int getLives()
{
return LifeLine;
}
}
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* This is the class for all coing blocks that Mario can hit
*
* @soumya.__.khanna (Soumya Khanna)
* @3.16.8 IThink? (June 20th)
*/
public class CoinBlock extends Block
{
public final int value = 1;
public void act()
{
super.act(); //Adapt the parent act method
}
public CoinBlock() //Initial image
{
setImage(coin);
}
public void changeImage() //New image, when mario hits block
{
setImage(coinHit);
Worlds myWorld = (Worlds)getWorld();
Score scoreboard = myWorld.getScore();
scoreboard.update(value);
}
}
