When I shoot a bullet in my scenario it doesn't always kill the monster (you can see for yourself in this scenario (http://www.greenfoot.org/scenarios/18183)). It shoots when you press space (coding for that is in a different class, not shown), but only sometimes does it remove the monster class.
Here is the Bullet class:
Here is the Monster class which snake (a monster) extends from:
Here is the Snake class which extends Monster:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
/**
* Write a description of class Bullet here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Bullet extends Actor
{
private static final int acceleration = 2; // down (gravity)
private static final int speed = 7; // running speed (sideways)
private static final int jumpStrength = 8;
private int vSpeed = 0;
private int counter=0;
private int direction;
public Bullet(int move)
{
direction=move;
setImage(new GreenfootImage("bullet.png"));
}
/**
* Act - do whatever the Bullet wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
Scene scene=(Scene)getWorld();
if(!scene.pause)
{
counter++;
fall();
if(onGround()&&!isTouching(Monster.class))
jump();
remove();
}
}
private boolean onGround()
{
Object under = getOneObjectAtOffset(0, getImage().getHeight()/2 , null);
return under != null;
}
private void jump()
{
setVSpeed(-jumpStrength);
fall();
}
private void setVSpeed(int speed)
{
vSpeed = speed;
}
private void fall()
{
setLocation ( getX()+direction, getY() + vSpeed);
vSpeed = vSpeed + acceleration;
}
private void remove()
{
Scene scene=(Scene)getWorld();
if(counter==50||touchingRightSide())
{
scene.removeObject(this);
}
else if(atBottom())
{
scene.removeObject(this);
}
}
private boolean touchingRightSide()
{
Object side=getOneObjectAtOffset(getImage().getWidth()/2-6,0,null);
return side!=null;
}
private boolean touchingRightSide2()
{
Object side=getOneObjectAtOffset(getImage().getWidth()/2+5,0,Monster.class);
return side!=null;
}
private boolean atBottom()
{
return getY() >= getWorld().getHeight() - 2;
}
}
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Monster here.
*
* @author (your name)
* @version (a version number or a date)
*/
public abstract class Monster extends Actor
{
public boolean removed=false;
public boolean onGround()
{
Object under = getOneObjectAtOffset(0, getImage().getHeight()/2 , null);
return under != null;
}
public boolean checkMonster()
{
return isTouching(Monster.class);
}
public boolean notOnGroundLeft()
{
Object under = getOneObjectAtOffset(-18, getImage().getHeight()/2 , null);
return under == null;
}
public boolean notOnGroundRight()
{
Object under = getOneObjectAtOffset(+18, getImage().getHeight()/2 , null);
return under == null;
}
private boolean onTop1()
{
Pengu pengu = (Pengu)getOneObjectAtOffset(0, -getImage().getHeight()/2 , Pengu.class);
return pengu != null&&pengu.vSpeed>0;
}
private boolean onTop2()
{
Pengu pengu = (Pengu)getOneObjectAtOffset(-getImage().getWidth()/2+5, -getImage().getHeight()/2 , Pengu.class);
return pengu != null&&pengu.vSpeed>0;
}
private boolean onTop3()
{
Pengu pengu = (Pengu)getOneObjectAtOffset(getImage().getWidth()/2-5, -getImage().getHeight()/2 , Pengu.class);
return pengu != null&&pengu.vSpeed>0;
}
public boolean onTop()
{
return onTop1()||onTop2()||onTop3();
}
private boolean touchingLeftSide1()
{
Object side=getOneObjectAtOffset(-getImage().getWidth()/2,0,null);
return side!=null;
}
private boolean touchingLeftSide2()
{
Object side=getOneObjectAtOffset(-getImage().getWidth()/2,getImage().getHeight()/2-5,null);
return side!=null;
}
private boolean touchingLeftSide3()
{
Object side=getOneObjectAtOffset(-getImage().getWidth()/2,-getImage().getHeight()/2+5,null);
return side!=null;
}
public boolean touchingLeftSide()
{
return touchingLeftSide1()||touchingLeftSide2()||touchingLeftSide3();
}
private boolean touchingRightSide1()
{
Object side=getOneObjectAtOffset(getImage().getWidth()/2,0,null);
return side!=null;
}
private boolean touchingRightSide2()
{
Object side=getOneObjectAtOffset(getImage().getWidth()/2,getImage().getHeight()/2-5,null);
return side!=null;
}
private boolean touchingRightSide3()
{
Object side=getOneObjectAtOffset(getImage().getWidth()/2,-getImage().getHeight()/2+5,null);
return side!=null;
}
public boolean touchingRightSide()
{
return touchingRightSide1()||touchingRightSide2()||touchingRightSide2();
}
private boolean penguRightSide()
{
Object side=getOneObjectAtOffset(getImage().getWidth()/2,0,Pengu.class);
return side!=null;
}
private boolean penguLeftSide()
{
Object side=getOneObjectAtOffset(-getImage().getWidth()/2,0,Pengu.class);
return side!=null;
}
private boolean penguBottom1()
{
Pengu pengu=(Pengu)getOneObjectAtOffset(-getImage().getWidth()/2,getImage().getHeight()/2,Pengu.class);
return pengu!=null;
}
private boolean penguBottom2()
{
Pengu pengu=(Pengu)getOneObjectAtOffset(getImage().getWidth()/2,getImage().getHeight()/2,Pengu.class);
return pengu!=null;
}
private boolean penguBottom3()
{
Pengu pengu=(Pengu)getOneObjectAtOffset(0,getImage().getHeight()/2,Pengu.class);
return pengu!=null;
}
private boolean pengu()
{
return penguRightSide()||penguLeftSide()||penguBottom1()||penguBottom2()||penguBottom3();
}
public void fall()
{
Scene scene=(Scene)getWorld();
setLocation(getX(),getY()+7);
}
public void removeM()
{
Scene scene=(Scene)getWorld();
if(atBottom())
{
scene.removeObject(this);
return;
}
if(isTouching(Bullet.class))
{
removeTouching(Bullet.class);
scene.score+=350;
scene.removeObject(this);
return;
}
}
public boolean atBottom()
{
return getY() >= getWorld().getHeight() - 2;
}
public void out()
{
Scene scene=(Scene)getWorld();
if(pengu())
{
scene.lives--;
scene.reset(true);
scene.levelUp();
}
}
public void penguMove()
{
Scene scene=(Scene)getWorld();
if(Greenfoot.isKeyDown("Right")&&scene.move==true)
setLocation(getX()+scene.moveSpeed,getY());
if(scene.onCloud==true)
{
if(scene.way==true)
{
setLocation(getX()-4,getY());
}
if(scene.way==false)
{
setLocation(getX()+4,getY());
}
}
}
}
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Snake here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Snake extends Monster
{
private GreenfootImage image1=new GreenfootImage("snake.png");
private GreenfootImage image2=new GreenfootImage("snake2.png");
private GreenfootImage image3=new GreenfootImage("snakeS.png");
private GreenfootImage image4=new GreenfootImage("snake2S.png");
private int speed;
private boolean squished=false;
private int timer=0;
private boolean move=false;
private int type;
public Snake(int num)
{
setImage(image2);
speed=-3;
type=num;
}
public Snake(int setSpeed,int num)
{
setImage(image2);
speed=setSpeed;
type=num;
}
/**
* Act - do whatever the Snake wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
Scene scene=(Scene)getWorld();
if(!scene.pause)
{
squished();
penguMove();
if(!squished)
{
if(type==1)
{
move();
}
else if(type==2)
{
move1();
}
}
remove();
if(!removed&&!squished)
{
out();
}
}
}
private void move()
{
Scene scene=(Scene)getWorld();
if(getX()<=745)
{
move=true;
}
if(move==true)
{
move(speed);
if(speed<0)
setImage(image2);
if(speed>0)
setImage(image1);
if(onGround()&&!checkMonster())
{
if(touchingLeftSide())
speed=-speed;
if(touchingRightSide())
speed=-speed;
}
if(onGround())
{
Actor under = getOneObjectAtOffset(0, getImage().getHeight()/2 , null);
if(under!=null)
{
int h=under.getImage().getHeight()/2+getImage().getHeight()/2-3;
int y=under.getY();
setLocation(getX(),y-h);
}
}
else
{
fall();
}
}
}
private void move1()
{
Scene scene=(Scene)getWorld();
if(getX()<=745)
{
scene.startToMove=true;
}
if(scene.startToMove==true)
{
move(speed);
if(speed<0)
setImage(image2);
if(speed>0)
setImage(image1);
if(onGround()&&!checkMonster())
{
if(touchingLeftSide())
speed=-speed;
if(touchingRightSide())
speed=-speed;
}
if(onGround())
{
Actor under = getOneObjectAtOffset(0, getImage().getHeight()/2 , null);
if(under!=null)
{
int h=under.getImage().getHeight()/2+getImage().getHeight()/2-3;
int y=under.getY();
setLocation(getX(),y-h);
}
}
else
{
fall();
}
}
}
private void squished()
{
if(onTop())
{
Scene scene=(Scene)getWorld();
squished=true;
if(getImage()==image1)
setImage(image3);
if(getImage()==image2)
setImage(image4);
if(!onGround())
fall();
}
}
private void remove()
{
Scene scene=(Scene)getWorld();
if(squished==true)
{
timer++;
}
if(timer>=20)
{
scene.removeObject(this);
scene.score+=350;
timer=0;
removed=true;
}
else if(atBottom()||getX()<=-100)
{
scene.removeObject(this);
removed=true;
}
else if(isTouching(Bullet.class))
{
removeTouching(Bullet.class);
scene.score+=350;
scene.removeObject(this);
removed=true;
}
}
}
