Kai Simon
3 years ago
8 changed files with 486 additions and 6 deletions
-
2GameProject/src/base/BreakoutGame.java
-
28GameProject/src/controller/BreakoutController.java
-
21GameProject/src/controller/MineController.java
-
2GameProject/src/log4j2.xml
-
119GameProject/src/playground/BreakoutLevel0.java
-
152GameProject/src/playground/BreakoutLevel2.java
-
70GameProject/src/playground/BreakoutLevel3.java
-
98GameProject/src/playground/BreakoutLevelBaseAdvanced.java
@ -0,0 +1,28 @@ |
|||||
|
package controller; |
||||
|
|
||||
|
import java.awt.event.KeyEvent; |
||||
|
|
||||
|
import gameobjects.GameObject; |
||||
|
|
||||
|
public class BreakoutController extends EgoController{ |
||||
|
|
||||
|
public BreakoutController(double width, double height) { |
||||
|
super(width, height); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public void onUp(KeyEvent kc, GameObject ego) { |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public void onDown(KeyEvent kc, GameObject ego) { |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void onSpace(KeyEvent e, GameObject ego) { |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,119 @@ |
|||||
|
package playground; |
||||
|
|
||||
|
import java.awt.Color; |
||||
|
import org.apache.logging.log4j.LogManager; |
||||
|
import org.apache.logging.log4j.Logger; |
||||
|
import collider.RectCollider; |
||||
|
import controller.EgoController; |
||||
|
import controller.ReboundController2; |
||||
|
import gameobjects.FallingStar; |
||||
|
import gameobjects.GameObject; |
||||
|
import gameobjects.RectObject; |
||||
|
|
||||
|
/** |
||||
|
* simple solution example for Breakout game. |
||||
|
* |
||||
|
* not implemented: penalty if balls hits ground, no score for removed bricks, no bonus items, no |
||||
|
* lives. |
||||
|
* </ul> |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
public class BreakoutLevel0 extends BreakoutLevelBase { |
||||
|
|
||||
|
private static Logger logger = LogManager.getLogger(BreakoutLevelBase.class); |
||||
|
|
||||
|
|
||||
|
protected GameObject createEgoObject() { |
||||
|
RectObject ro = new RectObject("ego", this, 350, 550, 0, 0, 80, 10, Color.BLUE); |
||||
|
ro.generateColliders(); |
||||
|
EgoController ec = new EgoController(80,10); |
||||
|
ro.addController(ec); |
||||
|
logger.info("ego created."); |
||||
|
|
||||
|
return ro; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
protected GameObject createBall() { |
||||
|
GameObject co = new FallingStar("ball1", this, 350, 350, 100, 100, Color.RED, 5); |
||||
|
co.addController(new ReboundController2()); |
||||
|
logger.info("ball created."); |
||||
|
return co; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* creates one brick. For |
||||
|
* collision {@link RectCollider} is used. |
||||
|
*/ |
||||
|
@Override |
||||
|
protected GameObject createBrick(int row, int column) { |
||||
|
double xSize = 60; |
||||
|
double ySize = 30; |
||||
|
double xStart = 40; |
||||
|
double yStart = 40; |
||||
|
double space = 5; |
||||
|
Color c = Color.BLUE; |
||||
|
|
||||
|
RectObject ro = new RectObject("brick" + row + "/" + column, this, xStart + column * (xSize + space), |
||||
|
yStart + row * (ySize + space), 0, 0, xSize - 4, ySize - 4, c); |
||||
|
RectCollider rc = new RectCollider("egal", ro, xSize - 4, ySize - 4); |
||||
|
ro.addCollider(rc); |
||||
|
|
||||
|
return ro; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* lets ball bounce in Y direction, deletes brick. |
||||
|
*/ |
||||
|
@Override |
||||
|
protected void actionIfBallHitsBrick(GameObject ball, GameObject brick) { |
||||
|
|
||||
|
ball.setVY(ball.getVY() * -1); // bounce effect for ball |
||||
|
this.deleteObject(brick.getId()); // remove brick from field |
||||
|
logger.debug("deleted brick " + brick.getId()); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Let the ball bounce off in Y direction. |
||||
|
* |
||||
|
*/ |
||||
|
@Override |
||||
|
protected void actionIfBallHitsEgo(GameObject ball, GameObject ego) { |
||||
|
double ballY = ball.getY(); |
||||
|
double egoY = ego.getY(); |
||||
|
ball.setY(ballY < egoY ? ballY - 10 : ballY + 10); // radius 5 hard coded. |
||||
|
ball.setVY(ball.getVY() * -1); |
||||
|
logger.debug("ball bounces of ego object."); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Prepares a Breakout level with a 3 x 3 matrix of blocks on top. This method relies on the |
||||
|
* methods {@link #createEgo}, {@link #createBall} and {@link #createBrick}, among others. |
||||
|
* |
||||
|
* @param level String passes by the game engine (not used currently and can be ignored). |
||||
|
*/ |
||||
|
@Override |
||||
|
public void prepareLevel(String level) { |
||||
|
for (int y = 3; y < 6; y++) { |
||||
|
for (int x = 0; x < 3; x++) { |
||||
|
logger.trace("trying to create brick X, Y (" + x + "," + y + ")"); |
||||
|
GameObject brick = this.createBrick(x, y); |
||||
|
this.addObject(brick); |
||||
|
} |
||||
|
} |
||||
|
this.ego = this.createEgoObject(); |
||||
|
this.ball = this.createBall(); |
||||
|
this.addObject(this.ego); |
||||
|
this.addObject(this.ball); |
||||
|
logger.info("level preperation succeeded."); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,152 @@ |
|||||
|
package playground; |
||||
|
|
||||
|
import java.awt.Color; |
||||
|
import java.util.Random; |
||||
|
|
||||
|
import controller.BreakoutController; |
||||
|
import controller.LimitedTimeController; |
||||
|
import controller.ReboundController; |
||||
|
import gameobjects.GameObject; |
||||
|
import gameobjects.RectObject; |
||||
|
|
||||
|
public class BreakoutLevel2 extends BreakoutLevelBaseAdvanced { |
||||
|
|
||||
|
@Override |
||||
|
protected int calcNrBricksX() { |
||||
|
return 6; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected int calcNrBricksY() { |
||||
|
return 5; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected double getBrickSizeX() { |
||||
|
return 60.0; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected double getBrickSizeY() { |
||||
|
return 30.0; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected double getBrickStartX() { |
||||
|
return 90.0; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected double getBrickStartY() { |
||||
|
return 60.0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** Create Explosion effect with random Colors that lasts 2 Seconds. |
||||
|
* |
||||
|
* @param ball GameObject |
||||
|
* @param brick GameObject |
||||
|
*/ |
||||
|
@Override |
||||
|
protected void actionIfBallHitsBrick(GameObject ball, GameObject brick) { |
||||
|
//logger.info(brick.getId()+" is hitted and deleted!"); |
||||
|
ball.setVY(ball.getVY() * -1.0); |
||||
|
int max = 240; |
||||
|
int min = -240; |
||||
|
Random rand = new Random(); |
||||
|
|
||||
|
for(int i = 0; i < 20; i++) { |
||||
|
Color randColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat()); |
||||
|
gameobjects.FallingStar explosion = new gameobjects.FallingStar("explosion"+gameTime+i, this, brick.getX(), brick.getY(), rand.nextInt(max - min + 1) + min, rand.nextInt(max - min + 1) + min, randColor, 2); |
||||
|
explosion.addController(new LimitedTimeController(gameTime, 2)); |
||||
|
this.addObjectNow(explosion); |
||||
|
|
||||
|
this.deleteObject(brick.getId()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/** Lets Ball bounce of from Ego. |
||||
|
* If the right or left end part is hitted, the ball bounces of in the end part direction doesn't matter from which site |
||||
|
* |
||||
|
* @param ball Gameobject |
||||
|
* @param ego GameObject |
||||
|
*/ |
||||
|
@Override |
||||
|
protected void actionIfBallHitsEgo(GameObject ball, GameObject ego) { |
||||
|
RectObject egoCopyCastedInRectObject = (RectObject) ego; |
||||
|
double egoMiddleX = ego.getX(); |
||||
|
double ballX = ball.getX(); |
||||
|
double egoWidth = egoCopyCastedInRectObject.getWidth();// Maybe an easier and cleaner way instead of casting an new |
||||
|
double egoHalfWidth = egoWidth / 2.0; |
||||
|
|
||||
|
double egoEndPerc = 45.0; |
||||
|
double egoDistEndPartFromMiddle = (egoEndPerc * egoHalfWidth) / 100; |
||||
|
double egoEndPartStartLeft = egoMiddleX - egoDistEndPartFromMiddle; |
||||
|
double egoEndPartStartRight = egoMiddleX + egoDistEndPartFromMiddle; |
||||
|
|
||||
|
if ((ballX < egoEndPartStartLeft && (ball.getVX() > 0.0)) || (ballX > egoEndPartStartRight && (ball.getVX() < 0.0))) { |
||||
|
ball.setVX(ball.getVX() * -1.0); |
||||
|
} |
||||
|
|
||||
|
ball.setVY(ball.getVY() * -1.0); |
||||
|
} |
||||
|
|
||||
|
/** Creates Ego object with an extra Controller for Breakout. |
||||
|
* |
||||
|
* @return ego |
||||
|
*/ |
||||
|
@Override |
||||
|
protected GameObject createEgoObject() { |
||||
|
RectObject ego = new RectObject("ego", this, 350, 550, 0, 0, 60, 10, Color.blue); |
||||
|
ego.addController(new BreakoutController(ego.getWidth(), ego.getHeight())); |
||||
|
ego.addCollider(new collider.RectCollider(ego.getId(), ego, ego.getWidth(), ego.getHeight())); |
||||
|
return ego; |
||||
|
} |
||||
|
|
||||
|
/** Creates Ball. |
||||
|
* |
||||
|
* @return ball |
||||
|
*/ |
||||
|
@Override |
||||
|
protected GameObject createBall() { |
||||
|
gameobjects.FallingStar ball = new gameobjects.FallingStar("ball", this, 350, 350, 130, 130, Color.red, 5); |
||||
|
ball.addController(new ReboundController()); |
||||
|
return ball; |
||||
|
} |
||||
|
|
||||
|
/** Creates Brick with a random color. |
||||
|
* |
||||
|
* @param row int |
||||
|
* @param column int |
||||
|
* |
||||
|
* @return brick |
||||
|
*/ |
||||
|
@Override |
||||
|
protected GameObject createBrick(int row, int column) { |
||||
|
|
||||
|
double rnd = Math.random(); |
||||
|
Color clr; |
||||
|
if (rnd <= .25) { |
||||
|
clr = Color.red; |
||||
|
} else { |
||||
|
if (rnd <= .5) { |
||||
|
clr = Color.blue; |
||||
|
} else { |
||||
|
if (rnd <= .75) { |
||||
|
clr = Color.yellow; |
||||
|
} else { |
||||
|
clr = Color.green; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
RectObject brick = new RectObject("brick" + row + column, this, getBrickStartX() + (row * (getBrickSizeX() * 2)), getBrickStartY() + (column * (getBrickSizeY() * 2)), 0, 0, getBrickSizeX(), getBrickSizeY(), clr); |
||||
|
brick.addCollider(new collider.RectCollider(brick.getId(), brick, brick.getWidth(), brick.getHeight())); |
||||
|
|
||||
|
return brick; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,70 @@ |
|||||
|
package playground; |
||||
|
|
||||
|
import java.awt.Color; |
||||
|
|
||||
|
import gameobjects.GameObject; |
||||
|
|
||||
|
public class BreakoutLevel3 extends BreakoutLevel2 { |
||||
|
|
||||
|
gameobjects.TextObject textPoints, textLives; |
||||
|
|
||||
|
/** Creates flags and TextObjects to display scores and Lives. |
||||
|
* |
||||
|
* @param level String |
||||
|
*/ |
||||
|
@Override |
||||
|
public void prepareLevel(String level) { |
||||
|
setGlobalFlag("points", 0); |
||||
|
getOrCreateGlobalFlag("lives", 3); |
||||
|
textPoints = new gameobjects.TextObject("textPoints", this, 50 , 10, 0, 0, "Score: 0", 10, Color.black); |
||||
|
textLives = new gameobjects.TextObject("textLives", this, 600 , 10, 0, 0, "Lives: "+(int)getOrCreateGlobalFlag("lives", 3), 10, Color.black); |
||||
|
this.addObject(textPoints); |
||||
|
this.addObject(textLives); |
||||
|
|
||||
|
super.prepareLevel(level); |
||||
|
} |
||||
|
|
||||
|
/** Sets the Score if a Brick is hitted. |
||||
|
* |
||||
|
* @param ball GameObject |
||||
|
* @param brick |
||||
|
*/ |
||||
|
@Override |
||||
|
protected void actionIfBallHitsBrick(GameObject ball, GameObject brick) { |
||||
|
super.actionIfBallHitsBrick(ball, brick); |
||||
|
|
||||
|
setGlobalFlag("points", (int)(getGlobalFlag("points")) + 10); |
||||
|
textPoints.setText("Score: "+(int)getGlobalFlag("points")); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** If the Ball goes under the Ego, Lives are decreased and Ball is set above Ego. |
||||
|
*/ |
||||
|
@Override |
||||
|
public void applyGameLogic() { |
||||
|
super.applyGameLogic(); |
||||
|
|
||||
|
if(ball.getY() > ego.getY()) { |
||||
|
setGlobalFlag("lives", (int)(getGlobalFlag("lives")) - 1); |
||||
|
textLives.setText("Lives: "+(int)getGlobalFlag("lives")); |
||||
|
if(ball.getVY() > 0) { |
||||
|
ball.setVY(ball.getVY() *- 1); |
||||
|
} |
||||
|
ball.setY(ego.getY()-20.0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** game ends if egoLives < 0 . |
||||
|
* |
||||
|
* @return gameOver boolean |
||||
|
*/ |
||||
|
@Override |
||||
|
public boolean gameOver() { |
||||
|
if((int)getGlobalFlag("lives") < 0) { |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
@ -0,0 +1,98 @@ |
|||||
|
package playground; |
||||
|
|
||||
|
import org.apache.log4j.LogManager; |
||||
|
import org.apache.log4j.Logger; |
||||
|
|
||||
|
/** |
||||
|
* Advanced version of abstract {@link BreakoutLevelBase} providing a complete implementation of |
||||
|
* {@link #prepareLevel(String)}. Additionally abstract methods for number of bricks in X and Y |
||||
|
* direction are provided as well as abstract methods for brick sizes and start coordinates. |
||||
|
* |
||||
|
* @see #calcNrBricksX() |
||||
|
* @see #calcNrBricksY() |
||||
|
* @see #getBrickSizeX() |
||||
|
* @see #getBrickSizeY() |
||||
|
* @see #getBrickStartX() |
||||
|
* @see #getBrickStartY() |
||||
|
* |
||||
|
*/ |
||||
|
public abstract class BreakoutLevelBaseAdvanced extends BreakoutLevelBase { |
||||
|
|
||||
|
private static Logger logger = LogManager.getLogger(BreakoutLevelBaseAdvanced.class); |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* provides the number of bricks to be set in horizontal direction. |
||||
|
* |
||||
|
* @return positive value of how many bricks are to be next to each other in X direction |
||||
|
*/ |
||||
|
protected abstract int calcNrBricksX(); |
||||
|
|
||||
|
/** |
||||
|
* provides the number of bricks to be set in vertical direction. |
||||
|
* |
||||
|
* @return positive value of how many bricks are to be next to each other in Y direction |
||||
|
*/ |
||||
|
protected abstract int calcNrBricksY(); |
||||
|
|
||||
|
/** |
||||
|
* provides the length of one brick. |
||||
|
* |
||||
|
* @return positive value of how long a brick should be in X direction. |
||||
|
*/ |
||||
|
protected abstract double getBrickSizeX(); |
||||
|
|
||||
|
/** |
||||
|
* provides the height of one brick. |
||||
|
* |
||||
|
* @return positive value of how high a brick should be in Y direction. |
||||
|
*/ |
||||
|
protected abstract double getBrickSizeY(); |
||||
|
|
||||
|
/** |
||||
|
* provides the start coordinate of upper left corner (X value). |
||||
|
* |
||||
|
* @return positive value of the X coordinate to use as the starting point of the upper left |
||||
|
* corner of the brick set. |
||||
|
*/ |
||||
|
protected abstract double getBrickStartX(); |
||||
|
|
||||
|
/** |
||||
|
* provides the start coordinate of upper left corner (Y value). |
||||
|
* |
||||
|
* @return positive value of the Y coordinate to use as the starting point of the upper left |
||||
|
* corner of the brick set. |
||||
|
*/ |
||||
|
protected abstract double getBrickStartY(); |
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Prepares a complete Breakout type level and uses the values provided by implementations of |
||||
|
* {@link #calcNrBricksX()} and {@link #calcNrBricksY()} to generate the stone matrix. |
||||
|
* Furthermore, it relies on the methods {@link #createEgoObject()}, {@link #createBall} and {@link #createBrick}, |
||||
|
* which are meant to be overwritten in subclasses. <br> |
||||
|
* Attention: For collision detection bricks created by {@link #createBrick(int, int)} need to have the String 'brick' in ID. |
||||
|
* |
||||
|
* @see LevelBreakoutBase#prepareLevel(String) for further information. |
||||
|
* |
||||
|
* @param level String passes by the game engine (not used currently and can be ignored). |
||||
|
* |
||||
|
*/ |
||||
|
@Override |
||||
|
public void prepareLevel(String level) { |
||||
|
|
||||
|
for (int y = 0; y < this.calcNrBricksY(); y++) { |
||||
|
for (int x = 0; x < this.calcNrBricksX(); x++) { |
||||
|
logger.trace("trying to create brick X, Y (" + x + "," + y + ")"); |
||||
|
this.addObject(this.createBrick(x, y)); |
||||
|
} |
||||
|
} |
||||
|
this.ego = this.createEgoObject(); |
||||
|
this.ball = this.createBall(); |
||||
|
this.addObject(this.ego); |
||||
|
this.addObject(this.ball); |
||||
|
logger.info("level preperation succeeded."); |
||||
|
} |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue