Create Animation, base Explosions on Animation, create MultiExplosion.
This commit is contained in:
parent
223612de32
commit
671e9f5ef0
|
@ -0,0 +1,69 @@
|
|||
package de.teamteamteam.spacescooter.entity;
|
||||
|
||||
/**
|
||||
* A very simple image slideshow animation.
|
||||
* Given a list of images and an interval, it does a (fast) slideshow
|
||||
* through all the images, changing them after <interval> ticks.
|
||||
*/
|
||||
public class Animation extends Entity {
|
||||
|
||||
/**
|
||||
* The list of images to display
|
||||
*/
|
||||
private String[] images;
|
||||
|
||||
/**
|
||||
* Internal counter to check whether the interval is over.
|
||||
*/
|
||||
private int counter;
|
||||
|
||||
/**
|
||||
* Interval parameter - change the image after each interval.
|
||||
*/
|
||||
private int interval;
|
||||
|
||||
/**
|
||||
* Index of the current image that is displayed.
|
||||
*/
|
||||
private int currentImage;
|
||||
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
public Animation(int x, int y) {
|
||||
super(x, y);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the list of images to display plus the interval.
|
||||
*/
|
||||
public void configure(String[] images, int interval) {
|
||||
this.images = images;
|
||||
this.interval = interval;
|
||||
this.counter = 0;
|
||||
this.currentImage = 0;
|
||||
this.setImage(this.images[this.currentImage]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Increase the counter every tick, then check whether the interval is over.
|
||||
* If the interval is over, check whether there are more images to display.
|
||||
* If there is one, display the next image, else it is just over and the
|
||||
* Animation removes itself.
|
||||
*/
|
||||
public void update() {
|
||||
this.counter++;
|
||||
if(this.counter % this.interval == 0) {
|
||||
this.currentImage++;
|
||||
if(this.currentImage == this.images.length) {
|
||||
this.remove();
|
||||
} else {
|
||||
this.setImage(this.images[this.currentImage]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -3,7 +3,7 @@ package de.teamteamteam.spacescooter.entity;
|
|||
import java.awt.Rectangle;
|
||||
|
||||
import de.teamteamteam.spacescooter.entity.enemy.Enemy;
|
||||
import de.teamteamteam.spacescooter.entity.explosion.Explosion;
|
||||
import de.teamteamteam.spacescooter.entity.explosion.ExplosionTwo;
|
||||
import de.teamteamteam.spacescooter.entity.shot.Shot;
|
||||
import de.teamteamteam.spacescooter.entity.spi.Collidable;
|
||||
import de.teamteamteam.spacescooter.entity.spi.Hittable;
|
||||
|
@ -60,6 +60,8 @@ public abstract class LivingEntity extends Entity implements Collidable, Hittabl
|
|||
public void collideWith(Collidable entity) {
|
||||
if(entity instanceof Shot) {
|
||||
Shot s = (Shot) entity;
|
||||
if(this instanceof Enemy && s.getDirection() == Shot.LEFT) return;
|
||||
if(this instanceof Player && s.getDirection() == Shot.RIGHT) return;
|
||||
this.takeDamage(s.getDamageValue());
|
||||
}
|
||||
if(entity instanceof Player && (!(this instanceof Player))) {
|
||||
|
@ -120,7 +122,7 @@ public abstract class LivingEntity extends Entity implements Collidable, Hittabl
|
|||
* Override this method for a different explosion behaviour.
|
||||
*/
|
||||
public void explode() {
|
||||
new Explosion(this.getX(), this.getY());
|
||||
new ExplosionTwo(this.getX(), this.getY());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -5,6 +5,7 @@ import java.util.Random;
|
|||
import de.teamteamteam.spacescooter.datastructure.ConcurrentIterator;
|
||||
import de.teamteamteam.spacescooter.entity.Entity;
|
||||
import de.teamteamteam.spacescooter.entity.Player;
|
||||
import de.teamteamteam.spacescooter.entity.explosion.MultiExplosion;
|
||||
import de.teamteamteam.spacescooter.entity.item.Items;
|
||||
import de.teamteamteam.spacescooter.screen.Screen;
|
||||
import de.teamteamteam.spacescooter.utility.GameConfig;
|
||||
|
@ -42,6 +43,14 @@ public class EnemyThree extends Enemy{
|
|||
super.die();
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom MultiExplosion for this enemy.
|
||||
*/
|
||||
@Override
|
||||
public void explode() {
|
||||
new MultiExplosion(this.getX(), this.getY());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
super.update();
|
||||
|
|
|
@ -1,67 +0,0 @@
|
|||
package de.teamteamteam.spacescooter.entity.explosion;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import de.teamteamteam.spacescooter.entity.Entity;
|
||||
|
||||
|
||||
public class Explosion extends Entity {
|
||||
|
||||
/**
|
||||
* Time to 'live' in update ticks. Will be decreased with each update()-call.
|
||||
*/
|
||||
private int timeToLive;
|
||||
|
||||
/**
|
||||
* Attributes for the 'spawn more' constructor.
|
||||
*/
|
||||
private int count;
|
||||
private int height;
|
||||
private int width;
|
||||
/**
|
||||
* Instance of Random, so we get good random numbers.
|
||||
*/
|
||||
private Random random;
|
||||
|
||||
/**
|
||||
* Just be a single explosion.
|
||||
*/
|
||||
public Explosion(int x, int y) {
|
||||
super(x, y);
|
||||
this.setImage("images/explosions/explosion_proto.png");
|
||||
this.setPosition(x - (this.getWidth()/2), y - (this.getHeight()/2));
|
||||
Random rand = new Random();
|
||||
if (rand.nextInt(99) <= 70) {
|
||||
new ExplosionOne(x, y);
|
||||
} else {
|
||||
new ExplosionTwo(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Be an explosion that spawns even more explosions! :O
|
||||
*/
|
||||
public Explosion(int x, int y, int count, int width, int height) {
|
||||
super(x, y);
|
||||
System.out.println("Explosion with: " + count);
|
||||
this.setImage("images/explosions/explosion_proto.png");
|
||||
this.setPosition(x, y);
|
||||
this.random = new Random();
|
||||
this.count = 10;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.timeToLive = 100 * this.count; //Just a random value of ticks the explosion will take to spawn more explosions.
|
||||
}
|
||||
|
||||
/**
|
||||
* Here, a countdown is happening. Every X ticks, a new Explosion is born.
|
||||
*/
|
||||
public void update() {
|
||||
this.timeToLive--;
|
||||
if(this.timeToLive <= 0) this.remove();
|
||||
if(this.count > 0 && this.timeToLive % this.count == 0) {
|
||||
new Explosion(this.getX() + (int) (this.width * this.random.nextDouble()), this.getY() + (int) (this.height * this.random.nextDouble()));
|
||||
this.count--;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,45 +1,21 @@
|
|||
package de.teamteamteam.spacescooter.entity.explosion;
|
||||
|
||||
import de.teamteamteam.spacescooter.entity.Entity;
|
||||
import de.teamteamteam.spacescooter.entity.Animation;
|
||||
|
||||
public class ExplosionOne extends Entity {
|
||||
public class ExplosionOne extends Animation {
|
||||
|
||||
private int count = 71;
|
||||
|
||||
public ExplosionOne(int x, int y) {
|
||||
super(x, y);
|
||||
this.setImage("images/explosions/explosion_proto.png");
|
||||
String[] images = {
|
||||
"images/explosions/01/explosion1.png",
|
||||
"images/explosions/01/explosion2.png",
|
||||
"images/explosions/01/explosion3.png",
|
||||
"images/explosions/01/explosion4.png",
|
||||
"images/explosions/01/explosion5.png",
|
||||
"images/explosions/01/explosion6.png",
|
||||
"images/explosions/01/explosion7.png"
|
||||
};
|
||||
this.configure(images, 10);
|
||||
this.setPosition(x - (this.getWidth()/2), y - (this.getHeight()/2));
|
||||
}
|
||||
|
||||
public void update() {
|
||||
if (count >= 0) {
|
||||
count--;
|
||||
} else {
|
||||
this.remove();
|
||||
}
|
||||
switch (count) {
|
||||
case 70:
|
||||
this.setImage("images/explosions/01/explosion1.png");
|
||||
break;
|
||||
case 60:
|
||||
this.setImage("images/explosions/01/explosion2.png");
|
||||
break;
|
||||
case 50:
|
||||
this.setImage("images/explosions/01/explosion3.png");
|
||||
break;
|
||||
case 40:
|
||||
this.setImage("images/explosions/01/explosion4.png");
|
||||
break;
|
||||
case 30:
|
||||
this.setImage("images/explosions/01/explosion5.png");
|
||||
break;
|
||||
case 20:
|
||||
this.setImage("images/explosions/01/explosion6.png");
|
||||
break;
|
||||
case 10:
|
||||
this.setImage("images/explosions/01/explosion7.png");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,73 +1,31 @@
|
|||
package de.teamteamteam.spacescooter.entity.explosion;
|
||||
|
||||
import de.teamteamteam.spacescooter.entity.Entity;
|
||||
import de.teamteamteam.spacescooter.entity.Animation;
|
||||
|
||||
public class ExplosionTwo extends Entity {
|
||||
public class ExplosionTwo extends Animation {
|
||||
|
||||
private int count = 141;
|
||||
|
||||
public ExplosionTwo(int x, int y) {
|
||||
super(x, y);
|
||||
this.setImage("images/explosions/explosion_proto.png");
|
||||
String[] images = {
|
||||
"images/explosions/02/explosion2_1.png",
|
||||
"images/explosions/02/explosion2_2.png",
|
||||
"images/explosions/02/explosion2_3.png",
|
||||
"images/explosions/02/explosion2_4.png",
|
||||
"images/explosions/02/explosion2_5.png",
|
||||
"images/explosions/02/explosion2_6.png",
|
||||
"images/explosions/02/explosion2_7.png",
|
||||
"images/explosions/02/explosion2_8.png",
|
||||
"images/explosions/02/explosion2_9.png",
|
||||
"images/explosions/02/explosion2_10.png",
|
||||
"images/explosions/02/explosion2_11.png",
|
||||
"images/explosions/02/explosion2_12.png",
|
||||
"images/explosions/02/explosion2_13.png",
|
||||
"images/explosions/02/explosion2_14.png",
|
||||
"images/explosions/02/explosion2_15.png",
|
||||
"images/explosions/02/explosion2_16.png"
|
||||
};
|
||||
this.configure(images, 10);
|
||||
this.setPosition(x - (this.getWidth()/2), y - (this.getHeight()/2));
|
||||
}
|
||||
|
||||
public void update() {
|
||||
if (count >= 0) {
|
||||
count--;
|
||||
} else {
|
||||
this.remove();
|
||||
}
|
||||
switch (count) {
|
||||
case 150:
|
||||
this.setImage("images/explosions/02/explosion2_1.png");
|
||||
break;
|
||||
case 140:
|
||||
this.setImage("images/explosions/02/explosion2_2.png");
|
||||
break;
|
||||
case 130:
|
||||
this.setImage("images/explosions/02/explosion2_3.png");
|
||||
break;
|
||||
case 120:
|
||||
this.setImage("images/explosions/02/explosion2_4.png");
|
||||
break;
|
||||
case 110:
|
||||
this.setImage("images/explosions/02/explosion2_5.png");
|
||||
break;
|
||||
case 100:
|
||||
this.setImage("images/explosions/02/explosion2_6.png");
|
||||
break;
|
||||
case 90:
|
||||
this.setImage("images/explosions/02/explosion2_7.png");
|
||||
break;
|
||||
case 80:
|
||||
this.setImage("images/explosions/02/explosion2_8.png");
|
||||
break;
|
||||
case 70:
|
||||
this.setImage("images/explosions/02/explosion2_9.png");
|
||||
break;
|
||||
case 60:
|
||||
this.setImage("images/explosions/02/explosion2_10.png");
|
||||
break;
|
||||
case 50:
|
||||
this.setImage("images/explosions/02/explosion2_11.png");
|
||||
break;
|
||||
case 40:
|
||||
this.setImage("images/explosions/02/explosion2_12.png");
|
||||
break;
|
||||
case 30:
|
||||
this.setImage("images/explosions/02/explosion2_13.png");
|
||||
break;
|
||||
case 20:
|
||||
this.setImage("images/explosions/02/explosion2_14.png");
|
||||
break;
|
||||
case 10:
|
||||
this.setImage("images/explosions/02/explosion2_15.png");
|
||||
break;
|
||||
case 1:
|
||||
this.setImage("images/explosions/02/explosion2_16.png");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
package de.teamteamteam.spacescooter.entity.explosion;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* Extends the functionality of the simple ExplosionOne to randomly
|
||||
* spawn more explosions in the area.
|
||||
*/
|
||||
public class MultiExplosion extends ExplosionOne {
|
||||
|
||||
/**
|
||||
* Internal tick counter.
|
||||
*/
|
||||
private int counter;
|
||||
|
||||
/**
|
||||
* Instance of Random, so we get good random numbers.
|
||||
*/
|
||||
private Random random;
|
||||
|
||||
/**
|
||||
* Just be a single explosion.
|
||||
*/
|
||||
public MultiExplosion(int x, int y) {
|
||||
super(x, y);
|
||||
this.random = new Random();
|
||||
}
|
||||
|
||||
/**
|
||||
* Decide every 10 ticks whether or not to spawn a random explosion.
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
if(this.counter % 10 == 0) {
|
||||
if(this.random.nextBoolean()) {
|
||||
this.spawnExplosion();
|
||||
}
|
||||
}
|
||||
this.counter++;
|
||||
super.update();
|
||||
}
|
||||
|
||||
/**
|
||||
* Randomly spawn a new random explosion at a random location.
|
||||
*/
|
||||
private void spawnExplosion() {
|
||||
int x_offset = this.random.nextInt(35);
|
||||
if(this.random.nextBoolean()) x_offset *= -1;
|
||||
int y_offset = this.random.nextInt(35);
|
||||
if(this.random.nextBoolean()) y_offset *= -1;
|
||||
int explosionType = this.random.nextInt(2);
|
||||
switch(explosionType) {
|
||||
case 0:
|
||||
new ExplosionOne(this.getX() + x_offset, this.getY() + y_offset);
|
||||
break;
|
||||
case 1:
|
||||
new ExplosionTwo(this.getX() + x_offset, this.getY() + y_offset);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
package de.teamteamteam.spacescooter.entity.shot;
|
||||
|
||||
import de.teamteamteam.spacescooter.entity.LivingEntity;
|
||||
import de.teamteamteam.spacescooter.entity.Player;
|
||||
import de.teamteamteam.spacescooter.entity.enemy.Enemy;
|
||||
import de.teamteamteam.spacescooter.entity.spi.Collidable;
|
||||
import de.teamteamteam.spacescooter.utility.GameConfig;
|
||||
|
||||
|
@ -49,6 +51,14 @@ public class Shot extends LivingEntity {
|
|||
this.setImage(filename);
|
||||
this.setPosition(this.getX() - this.getImage().getWidth() / 2, this.getY() - this.getImage().getHeight() / 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the direction the Shot is traveling into.
|
||||
* Returns Shot.LEFT or Shot.RIGHT
|
||||
*/
|
||||
public int getDirection() {
|
||||
return this.direction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the damage this shot does to LivingEntities it hits.
|
||||
|
@ -85,6 +95,8 @@ public class Shot extends LivingEntity {
|
|||
*/
|
||||
@Override
|
||||
public void collideWith(Collidable entity) {
|
||||
if(this.direction == LEFT && entity instanceof Enemy) return;
|
||||
if(this.direction == RIGHT && entity instanceof Player) return;
|
||||
super.collideWith(entity);
|
||||
this.explode();
|
||||
this.remove();
|
||||
|
|
Loading…
Reference in New Issue