I'm trying to make blood stains for a shooting game, so that every time a target gets hit a blood stain appears in the world (and new targets are inseted). First I used a class that extended Actor to do this but that had the problem that whenever a preexisting target moved passed a newly inserted stain the target was draw behind the stain. So I figured this could be solved by drawing the stains on the background instead. I've created a BackGround class which has an image as a field variable and a method for updating that image by drawing stains onto it by using the GreenfootImage.drawImage() method, and also created an instance of this class as a field variable in my world class, which is set as the world background in the act method, and updated every time a target is hit. The problem is however, that instead of just drawing the stain, it draws the entire world onto the preexisting image of the world and uses that a the background (see image and relevant code below ).
Does anyone know how I might solve this problem? Thanks in advance :)
From the world class:
From the background class:
From the ball class:
This is what it looks like:

public class ShootingRange extends World
{
public BackGround backGround = new BackGround();
public ShootingRange()
{
super(1100, 500, 1);
}
public void act()
{
setBackground(backGround.getBackGround());
}
public void handleTargetCollision()
{
List<Ball> balls = getObjects(Ball.class);
for(int i=0; i<balls.size(); i++)
{
Ball b = balls.get(i);
b.handleTargetCollision();
}
}
}
public class BackGround
{
private GreenfootImage backGround;
GreenfootImage[] images = new GreenfootImage[]{
new GreenfootImage("blood1.png"),
new GreenfootImage("blood2.png"),
new GreenfootImage("blood3.png"),
new GreenfootImage("blood4.png"),};
public BackGround()
{
backGround = new GreenfootImage(1100,500);
}
public void setBackGround(int x, int y)
{
GreenfootImage blood = images[Greenfoot.getRandomNumber(4)];
blood.rotate(Greenfoot.getRandomNumber(360));
backGround.drawImage(blood,x,y);
}
public GreenfootImage getBackGround()
{
return backGround;
}
}
public void handleTargetCollision()
{
World w = getWorld();
ShootingRange s = (ShootingRange)w;
if(hitTarget()==true)
{
List<Target> list = this.getIntersectingObjects(Target.class);
for(int j=0; j<list.size(); j++)
{
Target t = list.get(j);
if(s.Sound==true) t.hit();
int x = t.getX();
int y = t.getY();
DestroyedTarget d = new DestroyedTarget();
d.setImage(t.getImage());
d.vel.setX(t.vel.getX());
s.removeObject(t);
s.addObject(d,x,y);
if(s.Blood==true)
{
s.backGround.setBackGround(x,y);
}
s.hitCount++;
hitCount++;
}
}
}
