private void addEnnemies(int freq, final String fileName, final int vel, final boolean shoot) {
TimeReact.randomly(freq, freq * 2).subscribe(new Procedure1<Integer>() {
@Override
public void invoke(Integer arg1) {
final Sprite ennemy = new Sprite(fileName, Shape.Type.ENNEMY);
Signal<Integer> changeVel = TimeReact.every(1000);
final int ix = (int) (rnd.nextFloat() * (game.getRWidth().getValue() - ennemy.getWidth()));
final int iy = (int) (rnd.nextFloat() * game.getRHeight().getValue()) / 3;
final Var<Integer> velX = changeVel.map(new Function1<Integer, Integer>() {
@Override
public Integer invoke(Integer arg1) {
return (rnd.nextInt(vel * 2)) - vel;
}
}).toVar(vel);
final Var<Integer> velY = changeVel.map(new Function1<Integer, Integer>() {
@Override
public Integer invoke(Integer arg1) {
return (rnd.nextInt(vel * 2)) - vel;
}
}).toVar(vel);
final Var<Integer> x = fps.weak().fold(ix, new Function2<Integer, Integer, Integer>() {
@Override
public Integer invoke(Integer arg1, Integer arg2) {
return arg1 + velX.getValue();
}
});
final Var<Integer> y = fps.weak().fold(iy, new Function2<Integer, Integer, Integer>() {
@Override
public Integer invoke(Integer arg1, Integer arg2) {
return arg1 + velY.getValue();
}
});
Signal s1 = ennemy.getOutLeft().merge(ennemy.getOutRight(), new Function2<Boolean, Boolean, Boolean>() {
@Override
public Boolean invoke(Boolean arg1, Boolean arg2) {
return arg1 || arg2;
}
}).subscribe(new Procedure1<Boolean>() {
@Override
public void invoke(Boolean arg1) {
if (arg1) {
velX.setValue(-velX.getValue());
}
}
});
Signal s2 = ennemy.getOutTop().merge(ennemy.getOutBottom(), new Function2<Boolean, Boolean, Boolean>() {
@Override
public Boolean invoke(Boolean arg1, Boolean arg2) {
return arg1 || arg2;
}
}).subscribe(new Procedure1<Boolean>() {
@Override
public void invoke(Boolean arg1) {
if (arg1) {
velY.setValue(-velY.getValue());
}
}
});
ennemy.getCollision().subscribe(new Procedure1<Shape>() {
@Override
public void invoke(Shape arg1) {
if (arg1.getType() == Shape.Type.PLAYER) {
game.addToScore(-250);
}
}
});
if (shoot) {
Signal shoot = TimeReact.every(500).subscribe(new Procedure1<Integer>() {
@Override
public void invoke(Integer arg1) {
addEnnemyShoot(x.getValue() + ennemy.getWidth() / 2, y.getValue() + ennemy.getHeight(), 25);
}
});
ennemy.addLink(shoot);
}
ennemy.addLink(changeVel);
ennemy.addLink(velX);
ennemy.addLink(velY);
ennemy.addLink(s1);
ennemy.addLink(s2);
ennemy.setX(x);
ennemy.setY(y);
game.addCollideShape(ennemy);
}
}).emit(0);
}