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

2016/11/29

Bullet/Fireball

Nosson1459 Nosson1459

2016/11/29

#
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:
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;
    }
}
Here is the Monster class which snake (a monster) extends from:
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());
            }
        }
    }
    
}
Here is the Snake class which extends Monster:
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;
        }
        
    }
}
danpost danpost

2016/11/29

#
The problem is that you have both the monster looking for a bullet as well as the bullet looking for a monster. Only code collision between two different type objects in one of the two classes. In this case, it might be best to keep the code it in the Snake class and eliminate the Monster class collision checking in the Bullet class.
Nosson1459 Nosson1459

2016/11/29

#
danpost wrote...
The problem is that you have both the monster looking for a bullet as well as the bullet looking for a monster.
Where is the bullet looking for the monster?
danpost danpost

2016/11/29

#
Nosson1459 wrote...
Where is the bullet looking for the monster?
Lines 34 and 77 of the Bullet class both check on Monster objects. On closer inspection, however, it seems that you only 'jump' when the conditions on line 34 are true and I cannot find where 'touchingRightSide2' is being called from. So, the issue probably resides somewhere else. When looking at the scenario itself, a bullet did "bounce" off a snake once. Why this is occurring eludes me at the moment.
Nosson1459 Nosson1459

2016/11/30

#
Oh well.
Nosson1459 Nosson1459

2016/12/1

#
The snake posted above is the green snake not the red one or the wombat, should I post the code for these other monsters (which one did you see it bounce off of)?
danpost danpost

2016/12/1

#
Nosson1459 wrote...
The snake posted above is the green snake not the red one or the wombat, should I post the code for these other monsters (which one did you see it bounce off of)?
I have seen bullets bounce off of all three of them!
Nosson1459 Nosson1459

2016/12/1

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Creature here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Creature extends Monster
{
    private GreenfootImage image1=new GreenfootImage("Creature.png");
    private GreenfootImage image2=new GreenfootImage("Creature2.png");
    private GreenfootImage image3=new GreenfootImage("CreatureS.png");
    private GreenfootImage image4=new GreenfootImage("Creature2S.png");
    private int speed=-2;
    private boolean squished=false;
    private int timer=0;
    private static final int acceleration = 2;      // down (gravity)            
    private static final int jumpStrength = 20;
    private int vSpeed = 0; 
    private int direction;
    private boolean move=false;
    private int delay=0;
    private int delayUntil;
    private boolean stopDelay=false;
    public Creature()
    {
        setImage(image2);
    }
    public Creature(int num)
    {
        setImage(image2);
        delayUntil=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();
            if(!squished)
            {
                move();
            }   
            remove();
            if(!removed&&!squished)
            {
                out();
            }
        }   
    }
    private void move()
    {
        if(getX()<=745)
        {
            delay++;
        }
        if(delay>=delayUntil)
        {
            move=true;
        }
        if(move==true)
        {
            fall1();
            if(onGround())
            jump();
            move(speed);
            if(speed<0)
            setImage(image2);
            if(speed>0)
            setImage(image1);
            if(onGround())
            {
                if(touchingLeftSide())
                speed=-speed;
                if(touchingRightSide())
                speed=-speed;
            }
            if(!onGround())
            fall();
        }
    }
    private void squished()
    {
        if(onTop())
        {
            Scene scene=(Scene)getWorld();
            squished=true;
            if(getImage()==image1)
            setImage(image3);
            if(getImage()==image2)
            setImage(image4);
            fall();
        }
    }
    private void remove()
    {
        Scene scene=(Scene)getWorld();
        if(squished==true)
        {
            timer++;
        }
        if(timer>=20)
        {
            scene.removeObject(this);
            scene.score+=750;
            timer=0;
            removed=true;
            return;
        }
        if(atBottom()||getX()<=-100)
        {
            scene.removeObject(this);
            removed=true;
            return;
        }
        if(isTouching(Bullet.class))
        {
            removeTouching(Bullet.class);
            scene.score+=750;
            scene.removeObject(this);
            removed=true;
            return;
        }
    }   
    private void jump()
    {
        setVSpeed(-jumpStrength);
        fall();
    }
    private void setVSpeed(int velocity)
    {
        vSpeed = velocity;
    }
    private void fall1()
    {
        setLocation ( getX()+speed, getY() + vSpeed);
        vSpeed = vSpeed + acceleration;
    }
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class SnakeD here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class SnakeD extends Monster
{
    private GreenfootImage image1=new GreenfootImage("snake4.png");
    private GreenfootImage image2=new GreenfootImage("snake3.png");
    private GreenfootImage image3=new GreenfootImage("snake3S.png");
    private GreenfootImage image4=new GreenfootImage("snake4S.png");
    private int speed=-2;
    private boolean squished=false;
    private int timer=0;
    public SnakeD()
    {
        setImage(image2);
    }
    /**
     * Act - do whatever the SnakeD 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();
            changeSpeed(); 
            if(!squished)
            {
                move();
            }
            remove();
            if(!squished&&!removed)
            {
                out();
            }
        }
    }
    private void move()
    {
        Scene scene=(Scene)getWorld();
        move(speed);
        if(speed<0)
           setImage(image2);
        if(speed>0)
           setImage(image1);  
        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 changeSpeed()
    {
        if(notOnGroundLeft()||touchingLeftSide())
        {
            speed=2;
        }
        if(notOnGroundRight()||touchingRightSide())
        {
            speed=-2;
        }
    }
    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(atBottom()||getX()<=-50)
        {
            scene.removeObject(this);
            removed=true;
        }
        else if(timer>=20)
        {
            scene.removeObject(this);
            scene.score+=500;
            timer=0;
            removed=true;
        }
        
        else if(isTouching(Bullet.class))
        {
            removeTouching(Bullet.class);
            scene.score+=500;
            scene.removeObject(this);
            removed=true;
        }
    }
}
SnakeD is the red one
You need to login to post a reply.