====== Projekt Sidescroller - Stand nach der 4. Hausaufgabe ======
=== Bullet ===
class Bullet extends Circle {
double vx;
double vy;
public Bullet(double x, double y, double vx1, double vy1, double radius) {
super(x, y, radius);
vx = vx1;
vy = vy1;
setFillColor(Color.white);
}
public void act() {
move(vx, vy);
if(isOutsideView()) {
destroy();
}
}
}
=== Spaceship ===
class Spaceship extends Sprite {
double v = 6;
Sidescroller sidescroller;
int timeSinceLastBullet = 0;
public Spaceship(Sidescroller s) {
super(80, 270, SpriteLibrary.Ship_Adrian, 2);
scale(2);
sidescroller = s;
}
public void act() {
if(sidescroller.state != 1) return;
if(isKeyDown(Key.ArrowUp)) {
if(getCenterY() > 30) {
move(0, -v);
}
}
if(isKeyDown(Key.ArrowDown)) {
if(getCenterY() < 570) {
move(0, v);
}
}
if(isKeyDown(Key.ArrowRight)) {
if(getCenterX() < 370) {
move(v, 0);
}
}
if(isKeyDown(Key.ArrowLeft)) {
if(getCenterX() > 80) {
move(-v, 0);
}
}
timeSinceLastBullet++;
if(isKeyDown(" ")) {
if(timeSinceLastBullet > 5) {
System.playSound(Sound.laser_shoot);
double r = timeSinceLastBullet / 30 * 10;
if(r > 40) r = 40;
if(r < 5) r = 5;
sidescroller.addBullet(getCenterX() + 15, getCenterY(), 15, 0, r);
timeSinceLastBullet = 0;
}
}
}
}
=== Sidescroller ===
World w = new World(800, 600);
new Sidescroller();
class Sidescroller extends Actor {
Spaceship spaceship;
Group bullets = new Group();
Group flyingObjects = new Group();
int points = 0;
Text pointsText = new Text(5, 5, 40, "0 Punkte");
int lives = 3;
Text livesText = new Text(795, 5, 40, lives + " Leben");
Text großerText = new Text(400, 200, 60, "");
Text kleinerText = new Text(400, 300, 40, "Press s to start!");
// zustand == 0 bedeutet: Warten auf Spielbeginn
// zustand == 1 bedeutet: im Spiel
// zustand == 2 bedeutet: zwischen zwei Spielen
int state = 0;
public Sidescroller() {
super();
// Hier startet das Programm
spaceship = new Spaceship(this);
livesText.setAlignment(Alignment.right);
großerText.setAlignment(Alignment.center);
kleinerText.setAlignment(Alignment.center);
setState(0);
}
public void onKeyTyped(String key) {
if(key == "s" && state != 1) {
setState(1);
}
}
public void addBullet(double x, double y, double vx, double vy, double radius) {
Bullet b = new Bullet(x, y, vx, vy, radius);
bullets.add(b);
}
public void act() {
if(state == 1) {
generateEnemies();
generatePowerups();
checkCollisionsBulletsWithEnemies();
checkCollisionSpaceshipWithEnemies();
}
}
private void checkCollisionSpaceshipWithEnemies() {
Shape[] collidingEnemies = flyingObjects.getCollidingShapes(spaceship);
if(collidingEnemies.length > 0) {
if(collidingEnemies[0] instanceof Enemy) {
Enemy e =(Enemy)collidingEnemies[0];
double le = Math.sqrt(e.getWidth() * e.getHeight());
new Explosion(e.getCenterX(), e.getCenterY(), le / 50);
e.destroy();
lives--;
if(lives == 0) {
System.playSound(Sound.far_bomb);
setState(2);
} else {
System.playSound(Sound.cannon_boom);
}
} else {
Powerup pu = (Powerup)collidingEnemies[0];
lives++;
pu.destroy();
}
updateText();
}
}
private void generateEnemies() {
double p = 0.03 * Math.sqrt(points) / 100;
if(p < 0.04) p = 0.04;
if(p > 0.3) p = 0.3;
if(Math.random() < p) {
Enemy e = new Enemy(this);
flyingObjects.add(e);
}
}
private void generatePowerups() {
if(Math.random() < 0.005) {
Powerup p = new Powerup();
flyingObjects.add(p);
}
}
private void checkCollisionsBulletsWithEnemies() {
CollisionPair[] pairs = bullets.getCollisionPairs(flyingObjects, true);
for(int i = 0; i < pairs.length; i++) {
CollisionPair cp = pairs[i];
if(cp.shapeB instanceof Enemy) {
Enemy enemy = (Enemy)cp.shapeB;
double le = Math.sqrt(enemy.getWidth() * enemy.getHeight());
points += Math.round(200000 / enemy.getFläche() * enemy.getGeschwindigkeit());
updateText();
if(enemy.alpha > 0.2) {
enemy.alpha = enemy.alpha - 0.2;
enemy.setAlpha(enemy.alpha);
} else {
new Explosion(enemy.getCenterX(), enemy.getCenterY(), le / 50);
System.playSound(Sound.shoot);
enemy.destroy();
}
Bullet b = (Bullet)cp.shapeA;
double r = b.getRadius();
if(r <= 5) {
b.destroy();
} else {
int anzahl = Math.round(r / 5.0);
for(int i = 0; i < anzahl; i++) {
addBullet(b.getCenterX(), b.getCenterY(), Math.random() * 10 + 10, Math.random() * 30 - 15, 5);
}
b.destroy();
}
}
// double r = b.getRadius() - 5;
// if(r <= 0) {
// b.destroy();
// } else {
// b.setRadius(r);
// }
}
}
public void updateText() {
pointsText.setText(points + " Punkte");
livesText.setText(lives + " Leben");
}
public void addPoints(int p) {
points = points + p;
updateText();
}
private void setState(int newState) {
if(newState == 0) {
spaceship.setVisible(false);
großerText.setText("Spielname");
großerText.setFillColor(Color.darkgreen);
großerText.setVisible(true);
kleinerText.setVisible(true);
} else if(newState == 1) {
spaceship.setVisible(true);
lives = 3;
points = 0;
spaceship.setCenter(100, 300);
updateText();
großerText.setVisible(false);
kleinerText.setVisible(false);
} else if(newState == 2) {
spaceship.setVisible(false);
großerText.setText("Game over");
großerText.setFillColor(Color.darkred);
großerText.setVisible(true);
kleinerText.setVisible(true);
}
state = newState;
}
}
=== Explosion ===
class Explosion extends Sprite {
public Explosion(double x, double y, double size) {
super(x, y, SpriteLibrary.Explosion_1, 0);
playAnimation(0, 60, RepeatType.once, 20);
scale(size);
}
}
=== Enemy ===
class Enemy extends Rectangle {
double vx;
double vy;
double vw;
double alpha;
public Enemy(Sidescroller s) {
super(850, Math.random() * 600, Math.random() * 250 + 50, Math.random() * 250 + 50);
double vMax = s.points / 1000.0 * 5;
if(vMax < 2) {
vMax = 2;
}
if(vMax > 10) {
vMax = 10;
}
vy = Math.random() * vMax - vMax / 2;
vx = -Math.random() * vMax - vMax / 2;
vw = Math.random() * 10 - 5;
int red = Math.floor(Math.random() * 200 + 56);
int green = Math.floor(Math.random() * 200 + 56);
int blue = Math.floor(Math.random() * 200 + 56);
alpha = Math.random() * 0.7 + 0.3;
setFillColor(Color.fromRGBA(red, green, blue, alpha));
}
public void act() {
move(vx, vy);
rotate(vw);
if(getCenterX() < - 1000) {
destroy();
}
}
public double getGeschwindigkeit() {
return Math.sqrt(vx * vx + vy * vy);
}
public double getFläche() {
return getWidth() * getHeight();
}
}
=== Powerup ===
class Powerup extends Circle {
double vx;
double vy;
public Powerup() {
super(850, Math.random() * 500 + 50, 10);
vx = Math.random() *(-5) - 5;
vy = Math.random() * 5 - 2.5;
setFillColor(null);
setBorderColor(Color.red);
}
public void act() {
move(vx, vy);
if(getCenterX() < - 300) {
destroy();
}
}
}