1.简单练习植物射击僵尸
使用动画函数 AnimationChannel、 AnimatedTexture以及实体工厂EntityFactory,通过SpawData传参生成实体。
2实现
2.1 代码
实现EntityFactory类
public class PlantFactory implements EntityFactory {
@Spawns("shooter")
public Entity newPeashooter(SpawnData data){
ArrayList<Image> imageArrayList=new ArrayList<>();
for (int i=0;i<13;i++){
imageArrayList.add(image(String.format("player/Peashooter_"+i+".png")));
}
AnimationChannel ac=new AnimationChannel(imageArrayList, Duration.seconds(1.1));
AnimatedTexture at=new AnimatedTexture(ac);
at.loop();//循环播放
return entityBuilder(data)
.type(PlantEntity.PLANT)
.viewWithBBox(at)
.with(new CollidableComponent(true))
.build();
}
@Spawns("zomba")
public Entity newZomba(SpawnData data){
ArrayList<Image> imageArrayList=new ArrayList<>();//图片集合
for (int i=0;i<22;i++){
imageArrayList.add(image(String.format("zombie/Zombie_"+i+".png")));
}
//动画播放通道,时间设置
AnimationChannel ac=new AnimationChannel(imageArrayList,Duration.seconds(1.0));
AnimatedTexture at=new AnimatedTexture(ac);
at.loop();//循环播放
return entityBuilder(data)
.type(PlantEntity.ZOMBA)
.viewWithBBox(at)
.with(new CollidableComponent(true))
.build();
}
@Spawns("pea")
public Entity newBullet(SpawnData data){
return entityBuilder(data)
.type(PlantEntity.BULLET)
.viewWithBBox("peabullet.png")
.with(new CollidableComponent(true))
.build();
}
}
主类
public class MainPlay extends GameApplication {
protected Entity shooter;
protected Entity normalizedZomba;
protected Entity bullet;
int z_hp=12;//僵尸血条
int s_hp=10;//植物血条
@Override
protected void initSettings(GameSettings gameSettings) {
gameSettings.setWidth(680);
gameSettings.setHeight(480);
gameSettings.setVersion("1.0v");
gameSettings.setTitle("植物练习射击僵尸");
}
@Override
protected void initGame() {
getGameWorld().addEntityFactory(new PlantFactory());
shooter=spawn("shooter");
normalizedZomba=spawn("zomba");
normalizedZomba.setPosition(600,100);
generate();
}
private void generate(){
bullet=spawn("pea");
bullet.setPosition(shooter.getX()+10, shooter.getY());
}
@Override
protected void initInput() {
Input input=getInput();
input.addEventHandler(MouseEvent.MOUSE_CLICKED,event -> {
shooter.setPosition(event.getX()-40, event.getY()-20);
});
}
@Override
protected void initPhysics() {
getPhysicsWorld().addCollisionHandler(new CollisionHandler(PlantEntity.PLANT,PlantEntity.ZOMBA) {
@Override
protected void onCollisionBegin(Entity plant, Entity zomba) {
s_hp--;
if (s_hp<=0){
shooter.removeFromWorld();
}
}
});
getPhysicsWorld().addCollisionHandler(new CollisionHandler(PlantEntity.BULLET,PlantEntity.ZOMBA) {
@Override
protected void onCollision(Entity bullet, Entity zomba) {
z_hp--;
if (z_hp<=0){
zomba.removeFromWorld();
}
bullet.removeFromWorld();//开始碰撞后移除bullet
}
});
}
@Override
protected void onUpdate(double tpf) {
normalizedZomba.translate(new Vec2(-tpf*10,0));//僵尸移动
bullet.translate(new Vec2(6,0));//子弹发射
if (bullet.getX()>getAppWidth()){
bullet.removeFromWorld();
generate();
}
}
public static void main(String[] args) {
launch(args);
}
}