diff --git a/README.md b/README.md index 9b51878..ad20a06 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ ___ - Enter: Pause - Escape: Debug menu -These controls may change in the future to something more sensible, and I may add a controls config in the future. +These controls may change, and I may add a controls config in the future. ___ diff --git a/src/main/java/dev/boyfailure/quajra/vectorbreakout/Ball.java b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Ball.java index 48ff7fa..644e850 100644 --- a/src/main/java/dev/boyfailure/quajra/vectorbreakout/Ball.java +++ b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Ball.java @@ -138,19 +138,21 @@ public class Ball { } // Check bricks - for (byte i = 0; i < VectorBreakout.currentBricks.length; i++) { - if (VectorBreakout.currentBricks[i] != null) { - if (VectorBreakout.currentBricks[i].brickY <= this.ballY && - VectorBreakout.currentBricks[i].brickY + VectorBreakout.currentBricks[i].brickHeight >= this.ballY + this.ballHeight) { - if (VectorBreakout.currentBricks[i].brickX <= this.ballX && - VectorBreakout.currentBricks[i].brickX + VectorBreakout.currentBricks[i].brickWidth >= this.ballX + this.ballWidth) { - VectorBreakout.currentBricks[i].breakBrick(); + if (VectorBreakout.currentLevel != null) { + for (byte i = 0; i < VectorBreakout.currentLevel.levelBricks.length; i++) { + if (VectorBreakout.currentLevel.levelBricks[i] != null) { + if (VectorBreakout.currentLevel.levelBricks[i].brickY <= this.ballY && + VectorBreakout.currentLevel.levelBricks[i].brickY + VectorBreakout.currentLevel.levelBricks[i].brickHeight >= this.ballY + this.ballHeight) { + if (VectorBreakout.currentLevel.levelBricks[i].brickX <= this.ballX && + VectorBreakout.currentLevel.levelBricks[i].brickX + VectorBreakout.currentLevel.levelBricks[i].brickWidth >= this.ballX + this.ballWidth) { + VectorBreakout.currentLevel.levelBricks[i].breakBrick(); this.bounce((byte) 0); return; } } } } + } // Check paddles for (byte i = 0; i < VectorBreakout.currentPaddles.length; i++) { @@ -176,6 +178,31 @@ public class Ball { else { this.bounce((byte) 0); } + + // Draw particles + byte ballParticleGen = 0; + for (byte ii = 0; ii < VectorBreakout.currentParticles.length; ii++) { + if (VectorBreakout.currentParticles[ii] == null) { + ballParticleGen++; + switch(ballParticleGen) { + case 1: + VectorBreakout.currentParticles[ii] = new Particle(0, this.ballX, this.ballY - 10, 0, -2, 15, 2, 7, 3); + VectorBreakout.currentParticles[ii].spawn(5); + break; + case 2: + VectorBreakout.currentParticles[ii] = new Particle(0, this.ballX - 3, this.ballY - 10, -2, -4, 15, 2, 6, 3); + VectorBreakout.currentParticles[ii].spawn(5); + break; + case 3: + VectorBreakout.currentParticles[ii] = new Particle(0, this.ballX + 10, this.ballY - 10, 2, -4, 15, 2, 8, 3); + VectorBreakout.currentParticles[ii].spawn(5); + break; + } + if (ballParticleGen < 3) {continue;} + else {return;} + } + } + return; } } diff --git a/src/main/java/dev/boyfailure/quajra/vectorbreakout/Brick.java b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Brick.java index e8be25a..65502f1 100644 --- a/src/main/java/dev/boyfailure/quajra/vectorbreakout/Brick.java +++ b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Brick.java @@ -21,25 +21,56 @@ public class Brick { } public void breakBrick() { - isBroken = true; - VectorBreakout.score += this.scoreOnBreak + (VectorBreakout.level - 1); - VectorBreakout.bricksOnScreen--; - switch(this.specialAbility) { - case 1: - VectorBreakout.lives++; - break; - case 2: - for (byte i = 0; i < VectorBreakout.currentBalls.length; i++) { - if (VectorBreakout.currentBalls[i] == null) { - VectorBreakout.currentBalls[i] = new Ball(300, 300, 7, 7, 0, true); - VectorBreakout.currentBalls[i].spawnBall((this.brickX + (this.brickWidth / 2)), (this.brickY + (this.brickHeight / 2))); - return; + if (!isBroken) { + isBroken = true; + VectorBreakout.score += this.scoreOnBreak + (VectorBreakout.level - 1); + VectorBreakout.bricksOnScreen--; + switch(this.specialAbility) { + case 1: + VectorBreakout.lives++; + break; + case 2: + for (byte i = 0; i < VectorBreakout.currentBalls.length; i++) { + if (VectorBreakout.currentBalls[i] == null) { + VectorBreakout.currentBalls[i] = new Ball(300, 300, 7, 7, 0, true); + VectorBreakout.currentBalls[i].spawnBall((this.brickX + (this.brickWidth / 2)), (this.brickY + (this.brickHeight / 2))); + return; + } } - } - break; - default: - break; + break; + default: + break; + } } + + // Draw particles + byte brickParticleGen = 0; + for (byte ii = 0; ii < VectorBreakout.currentParticles.length; ii++) { + if (VectorBreakout.currentParticles[ii] == null) { + brickParticleGen++; + switch(brickParticleGen) { + case 1: + VectorBreakout.currentParticles[ii] = new Particle(0, this.brickX, this.brickY, this.brickWidth - 1, 3, this.brickColor, 3, 3, 2); + VectorBreakout.currentParticles[ii].spawn(20); + break; + case 2: + VectorBreakout.currentParticles[ii] = new Particle(0, this.brickX, this.brickY, -2, this.brickHeight - 1, this.brickColor, 3, 3, 2); + VectorBreakout.currentParticles[ii].spawn(20); + break; + case 3: + VectorBreakout.currentParticles[ii] = new Particle(0, this.brickX, this.brickY + this.brickHeight, this.brickWidth - 1, 2, this.brickColor, 3, 3, 2); + VectorBreakout.currentParticles[ii].spawn(20); + break; + case 4: + VectorBreakout.currentParticles[ii] = new Particle(0, this.brickX + this.brickWidth, this.brickY, -2, this.brickHeight, this.brickColor, 3, 3, 2); + VectorBreakout.currentParticles[ii].spawn(20); + break; + } + if (brickParticleGen < 4) {continue;} + else {return;} + } + } + this.brickX = 32767; this.brickY = 32767; } diff --git a/src/main/java/dev/boyfailure/quajra/vectorbreakout/GameDisplay.java b/src/main/java/dev/boyfailure/quajra/vectorbreakout/GameDisplay.java index f3a565b..a11d502 100644 --- a/src/main/java/dev/boyfailure/quajra/vectorbreakout/GameDisplay.java +++ b/src/main/java/dev/boyfailure/quajra/vectorbreakout/GameDisplay.java @@ -18,6 +18,7 @@ public class GameDisplay extends JComponent { public static float beamScaleX = 1; // Horizontal drawing scale public static float beamScaleY = 1; // Vertical drawing scale + public static float beamThicknessScale = 1; // Thickness of lines public void paint(Graphics gameGraphics) { @@ -41,7 +42,7 @@ public class GameDisplay extends JComponent { // Score resetBeam(); moveBeam(20, -13); - g2.setStroke(new BasicStroke(2)); + g2.setStroke(bt(2)); String numToString = String.valueOf(VectorBreakout.score); String[] numToRender = numToString.split(""); for (byte i = iStart; i < numToRender.length; i++) { @@ -95,7 +96,7 @@ public class GameDisplay extends JComponent { // Walls g2.setColor(Color.gray); - g2.setStroke(new BasicStroke(10)); + g2.setStroke(bt(10)); resetBeam(); moveBeam(15, 0); g2.draw(drawVec(0, 600)); @@ -105,50 +106,30 @@ public class GameDisplay extends JComponent { g2.draw(drawVec(-800, 0)); // Bricks - for (byte i = 0; i < VectorBreakout.currentBricks.length; i++) { - if (VectorBreakout.currentBricks[i] != null) { - if (VectorBreakout.currentBricks[i].isBroken == false) { - resetBeam(); - g2.setStroke(new BasicStroke(3)); - moveBeam(VectorBreakout.currentBricks[i].brickX + 1, VectorBreakout.currentBricks[i].brickY + 1); - switch(VectorBreakout.currentBricks[i].brickColor) { - case 0: - g2.setColor(Color.red); - break; - case 1: - g2.setColor(Color.getHSBColor(25, 258, 77)); - break; - case 2: - g2.setColor(Color.cyan); - break; - case 3: - g2.setColor(Color.green); - break; - case 4: - g2.setColor(Color.magenta); - break; - default: - g2.setColor(Color.gray); - break; - } - g2.draw(drawVec(VectorBreakout.currentBricks[i].brickWidth - 2, 0)); - g2.draw(drawVec(0, -(VectorBreakout.currentBricks[i].brickHeight - 2))); - g2.draw(drawVec(-(VectorBreakout.currentBricks[i].brickWidth - 2), 0)); - g2.draw(drawVec(0, VectorBreakout.currentBricks[i].brickHeight - 2)); + if (VectorBreakout.currentLevel != null) { + for (byte i = 0; i < VectorBreakout.currentLevel.levelBricks.length; i++) { + if (VectorBreakout.currentLevel.levelBricks[i] != null) { + if (VectorBreakout.currentLevel.levelBricks[i].isBroken == false) { + resetBeam(); + g2.setStroke(bt(3)); + moveBeam(VectorBreakout.currentLevel.levelBricks[i].brickX + 1, VectorBreakout.currentLevel.levelBricks[i].brickY + 1); + g2.setColor(vc(VectorBreakout.currentLevel.levelBricks[i].brickColor)); + g2.draw(drawVec(VectorBreakout.currentLevel.levelBricks[i].brickWidth - 2, 0)); + g2.draw(drawVec(0, -(VectorBreakout.currentLevel.levelBricks[i].brickHeight - 2))); + g2.draw(drawVec(-(VectorBreakout.currentLevel.levelBricks[i].brickWidth - 2), 0)); + g2.draw(drawVec(0, VectorBreakout.currentLevel.levelBricks[i].brickHeight - 2)); + } } } } - // Paddle + // Paddles g2.setColor(Color.white); for (byte i = 0; i < VectorBreakout.currentPaddles.length; i++) { if (VectorBreakout.currentPaddles[i] != null) { if (VectorBreakout.currentPaddles[i].isActive) { resetBeam(); - /*g2.setStroke(new BasicStroke(VectorBreakout.currentPaddles[i].paddleHeight)); - moveBeam(VectorBreakout.currentPaddles[i].paddleX, VectorBreakout.currentPaddles[i].paddleY + (VectorBreakout.currentPaddles[i].paddleHeight / 2)); - g2.draw(drawVec(VectorBreakout.currentPaddles[i].paddleWidth, 0));*/ - g2.setStroke(new BasicStroke(3)); + g2.setStroke(bt(3)); moveBeam(VectorBreakout.currentPaddles[i].paddleX, VectorBreakout.currentPaddles[i].paddleY); g2.draw(drawVec(VectorBreakout.currentPaddles[i].paddleWidth, 0)); g2.draw(drawVec(0, -(VectorBreakout.currentPaddles[i].paddleHeight))); @@ -159,24 +140,38 @@ public class GameDisplay extends JComponent { } // Balls - g2.setStroke(new BasicStroke(1)); + g2.setStroke(bt(3)); g2.setColor(Color.yellow); for (byte i = 0; i < VectorBreakout.currentBalls.length; i++) { - // Check if ball is null first! if (VectorBreakout.currentBalls[i] != null) { if (VectorBreakout.currentBalls[i].isActive) { resetBeam(); moveBeam(VectorBreakout.currentBalls[i].ballX, VectorBreakout.currentBalls[i].ballY); - for (byte ii = 0; ii < VectorBreakout.currentBalls[i].ballHeight; ii++) { - g2.draw(drawVec(VectorBreakout.currentBalls[i].ballWidth, 0)); - moveBeam(-(VectorBreakout.currentBalls[i].ballWidth), -1); - } + g2.draw(drawVec(VectorBreakout.currentBalls[i].ballWidth, 0)); + g2.draw(drawVec(0, VectorBreakout.currentBalls[i].ballHeight)); + g2.draw(drawVec(-VectorBreakout.currentBalls[i].ballWidth, 0)); + g2.draw(drawVec(0, -VectorBreakout.currentBalls[i].ballHeight)); } } } + // Particles (still experimenting with these! rendering disabled for now...) + /* + for (byte i = 0; i < VectorBreakout.currentParticles.length; i++) { + if (VectorBreakout.currentParticles[i] != null) { + if (VectorBreakout.currentParticles[i].isActive) { + resetBeam(); + moveBeam(VectorBreakout.currentParticles[i].particleX, VectorBreakout.currentParticles[i].particleY); + g2.setStroke(bt(VectorBreakout.currentParticles[i].vectorScale)); + g2.setColor(vc(VectorBreakout.currentParticles[i].particleColor)); + g2.draw(drawVec(VectorBreakout.currentParticles[i].particleX2, VectorBreakout.currentParticles[i].particleY2)); + } + } + } + */ + // Paused - g2.setStroke(new BasicStroke(3)); + g2.setStroke(bt(3)); if (VectorBreakout.isPaused) { g2.setColor(Color.white); resetBeam(); @@ -228,6 +223,23 @@ public class GameDisplay extends JComponent { return new Line2D.Float(oldBeamX, oldBeamY, beamX, beamY); } + public Color vc(int col) { + switch ((byte) col) { + case 0: return Color.red; + case 1: return Color.getHSBColor(25, 258, 77); + case 2: return Color.cyan; + case 3: return Color.green; + case 4: return Color.magenta; + case 5: return Color.yellow; + case 15: return Color.white; + default: return Color.gray; + } + } + + public BasicStroke bt(float size) { + return new BasicStroke(size * beamThicknessScale); + } + public void moveBeam(float x, float y) { beamX += (x * beamScaleX); beamY += (y * beamScaleY); diff --git a/src/main/java/dev/boyfailure/quajra/vectorbreakout/Level.java b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Level.java new file mode 100644 index 0000000..19880e1 --- /dev/null +++ b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Level.java @@ -0,0 +1,84 @@ +package dev.boyfailure.quajra.vectorbreakout; + +public class Level { + + short levelID; + String levelName = "Level"; + byte[] levelLayout; // 19 bricks per row + Brick[] levelBricks; + + public Level(int id) { + this.levelID = (short) id; + + switch(id) { + case 1: + this.levelName = "Test"; + levelLayout = new byte[] + {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 3,3,3,3,3,5,3,3,3,3,3,3,3,5,3,3,3,3,3, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + break; + case 2: + this.levelName = "waow (based)"; + levelLayout = new byte[] + {4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2, + 3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1, + 2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4, + 1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3}; + break; + case 3: + this.levelName = "HOLES"; + levelLayout = new byte[] + {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 3,3,0,0,3,3,3,3,0,0,0,3,3,3,3,0,0,3,3, + 2,2,0,0,2,2,2,2,0,0,0,2,2,2,2,0,0,2,2, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + break; + default: + this.levelName = "Level " + levelID; + levelLayout = new byte[] + {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + break; + } + + } + + public void startLevel() { + // Brick placement + short brickLeftPlacement = 20; + if (this.levelLayout != null) { + this.levelBricks = new Brick[this.levelLayout.length]; + for (int i = 0; i < this.levelLayout.length; i++) { + switch (this.levelLayout[i]) { + case 1: + this.levelBricks[i] = new Brick(brickLeftPlacement, (((int) (i / 19)) * 20) + 50, false, 3, 4, 0); + break; + case 2: + this.levelBricks[i] = new Brick(brickLeftPlacement, (((int) (i / 19)) * 20) + 50, false, 2, 8, 0); + break; + case 3: + this.levelBricks[i] = new Brick(brickLeftPlacement, (((int) (i / 19)) * 20) + 50, false, 1, 16, 0); + break; + case 4: + this.levelBricks[i] = new Brick(brickLeftPlacement, (((int) (i / 19)) * 20) + 50, false, 0, 32, 0); + break; + case 5: + this.levelBricks[i] = new Brick(brickLeftPlacement, (((int) (i / 19)) * 20) + 50, false, 4, 8, 2); + break; + default: + this.levelBricks[i] = null; + break; + } + brickLeftPlacement += 40; + if (brickLeftPlacement >= 760) {brickLeftPlacement = 20;} + } + } + VectorBreakout.bricksOnScreen = (short) this.levelBricks.length; + + } + +} diff --git a/src/main/java/dev/boyfailure/quajra/vectorbreakout/Particle.java b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Particle.java new file mode 100644 index 0000000..a194b59 --- /dev/null +++ b/src/main/java/dev/boyfailure/quajra/vectorbreakout/Particle.java @@ -0,0 +1,54 @@ +package dev.boyfailure.quajra.vectorbreakout; + +public class Particle { + + byte particleID; + short particleX; + short particleY; + short particleX2; + short particleY2; + boolean isActive = true; + byte particleColor; + short particleFrame = 0; + short particleLifetime; + float vectorScale = 1; + byte particleDirection; + byte particleSpeed = 2; + + public Particle(int pid, int x, int y, int x2, int y2, int pc, float sc, int dir, int speed) { + this.particleID = (byte) pid; + this.particleX = (short) x; + this.particleY = (short) y; + this.particleX2 = (short) x2; + this.particleY2= (short) y2; + this.particleColor = (byte) pc; + this.vectorScale = sc; + this.particleDirection = (byte) dir; + this.particleSpeed = (byte) speed; + } + + public void spawn(int lifetime) { + this.isActive = true; + this.particleLifetime = (short) lifetime; + } + + public void update() { + this.particleFrame++; + if (this.particleDirection != 0) { + switch(this.particleDirection) { + case 1:this.particleX += this.particleSpeed;break; + case 2:this.particleX += this.particleSpeed;this.particleY+= this.particleSpeed;break; + case 3:this.particleY += this.particleSpeed;break; + case 4:this.particleX -= this.particleSpeed;this.particleY+= this.particleSpeed;break; + case 5:this.particleX -= this.particleSpeed;break; + case 6:this.particleX -= this.particleSpeed;this.particleY-= this.particleSpeed;break; + case 7:this.particleY -= this.particleSpeed;break; + case 8:this.particleX += this.particleSpeed;this.particleY-= this.particleSpeed;break; + } + } + if (this.particleFrame >= this.particleLifetime) { + this.isActive = false; + } + } + +} diff --git a/src/main/java/dev/boyfailure/quajra/vectorbreakout/VectorBreakout.java b/src/main/java/dev/boyfailure/quajra/vectorbreakout/VectorBreakout.java index 779088f..db0b5b0 100644 --- a/src/main/java/dev/boyfailure/quajra/vectorbreakout/VectorBreakout.java +++ b/src/main/java/dev/boyfailure/quajra/vectorbreakout/VectorBreakout.java @@ -13,6 +13,7 @@ import javax.swing.Timer; public class VectorBreakout { public static String gameName = "Vector Breakout"; + public static boolean isGameStarted = false; public static boolean isPaused = false; public static boolean debugMenuEnabled = false; public static boolean isLost = false; @@ -22,7 +23,7 @@ public class VectorBreakout { public static byte chancey = 0; public static short level = 1; public static byte ballsOnScreen = 0; - public static byte bricksOnScreen = 76; + public static short bricksOnScreen = 0; public static byte targetFrameRate = 60; public static byte actualFrames = 0; public static byte actualFrameRate = 0; @@ -31,91 +32,16 @@ public class VectorBreakout { public static long frameCounter = 0; public static boolean movingLeft = false; public static boolean movingRight = false; - public static Ball[] currentBalls = {null,null,null,null,null}; + public static Ball[] currentBalls = new Ball[10]; + public static Particle[] currentParticles = new Particle[63]; public static Paddle[] currentPaddles = {new Paddle(350, 500, 100, 15, 0, 1)}; - public static Brick[] currentBricks = { - new Brick(20, 50, false, 0, 32, 0), - new Brick(60, 50, false, 0, 32, 0), - new Brick(100, 50, false, 0, 32, 0), - new Brick(140, 50, false, 0, 32, 0), - new Brick(180, 50, false, 0, 32, 0), - new Brick(220, 50, false, 0, 32, 0), - new Brick(260, 50, false, 0, 32, 0), - new Brick(300, 50, false, 0, 32, 0), - new Brick(340, 50, false, 0, 32, 0), - new Brick(380, 50, false, 0, 32, 0), - new Brick(420, 50, false, 0, 32, 0), - new Brick(460, 50, false, 0, 32, 0), - new Brick(500, 50, false, 0, 32, 0), - new Brick(540, 50, false, 0, 32, 0), - new Brick(580, 50, false, 0, 32, 0), - new Brick(620, 50, false, 0, 32, 0), - new Brick(660, 50, false, 0, 32, 0), - new Brick(700, 50, false, 0, 32, 0), - new Brick(740, 50, false, 0, 32, 0), - new Brick(20, 70, false, 1, 16, 0), - new Brick(60, 70, false, 1, 16, 0), - new Brick(100, 70, false, 1, 16, 0), - new Brick(140, 70, false, 1, 16, 0), - new Brick(180, 70, false, 1, 16, 0), - new Brick(220, 70, false, 1, 16, 0), - new Brick(260, 70, false, 1, 16, 0), - new Brick(300, 70, false, 1, 16, 0), - new Brick(340, 70, false, 1, 16, 0), - new Brick(380, 70, false, 1, 16, 0), - new Brick(420, 70, false, 1, 16, 0), - new Brick(460, 70, false, 1, 16, 0), - new Brick(500, 70, false, 1, 16, 0), - new Brick(540, 70, false, 1, 16, 0), - new Brick(580, 70, false, 1, 16, 0), - new Brick(620, 70, false, 1, 16, 0), - new Brick(660, 70, false, 1, 16, 0), - new Brick(700, 70, false, 1, 16, 0), - new Brick(740, 70, false, 1, 16, 0), - new Brick(20, 90, false, 2, 8, 0), - new Brick(60, 90, false, 2, 8, 0), - new Brick(100, 90, false, 2, 8, 0), - new Brick(140, 90, false, 2, 8, 0), - new Brick(180, 90, false, 2, 8, 0), - new Brick(220, 90, false, 4, 8, 2), - new Brick(260, 90, false, 2, 8, 0), - new Brick(300, 90, false, 2, 8, 0), - new Brick(340, 90, false, 2, 8, 0), - new Brick(380, 90, false, 2, 8, 0), - new Brick(420, 90, false, 2, 8, 0), - new Brick(460, 90, false, 2, 8, 0), - new Brick(500, 90, false, 2, 8, 0), - new Brick(540, 90, false, 4, 8, 2), - new Brick(580, 90, false, 2, 8, 0), - new Brick(620, 90, false, 2, 8, 0), - new Brick(660, 90, false, 2, 8, 0), - new Brick(700, 90, false, 2, 8, 0), - new Brick(740, 90, false, 2, 8, 0), - new Brick(20, 110, false, 3, 4, 0), - new Brick(60, 110, false, 3, 4, 0), - new Brick(100, 110, false, 3, 4, 0), - new Brick(140, 110, false, 3, 4, 0), - new Brick(180, 110, false, 3, 4, 0), - new Brick(220, 110, false, 3, 4, 0), - new Brick(260, 110, false, 3, 4, 0), - new Brick(300, 110, false, 3, 4, 0), - new Brick(340, 110, false, 3, 4, 0), - new Brick(380, 110, false, 3, 4, 0), - new Brick(420, 110, false, 3, 4, 0), - new Brick(460, 110, false, 3, 4, 0), - new Brick(500, 110, false, 3, 4, 0), - new Brick(540, 110, false, 3, 4, 0), - new Brick(580, 110, false, 3, 4, 0), - new Brick(620, 110, false, 3, 4, 0), - new Brick(660, 110, false, 3, 4, 0), - new Brick(700, 110, false, 3, 4, 0), - new Brick(740, 110, false, 3, 4, 0) - }; + public static Level currentLevel; public VectorBreakout() { } public static void main(String[] args) { + System.setProperty("sun.java2d.opengl", "true"); final JFrame gameFrame = new JFrame(); gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -135,10 +61,10 @@ public class VectorBreakout { debugMenuEnabled = !debugMenuEnabled; break; case 10: // Enter - isPaused = !isPaused; + if (isGameStarted) {isPaused = !isPaused;} break; case 32: // Space - if (isLost) {newGame();return;} + if (isLost || !isGameStarted) {isGameStarted = true;newGame();return;} if (!isPaused) { if (ballsOnScreen < 1) { for (byte i = 0; i < currentBalls.length; i++) { @@ -152,10 +78,10 @@ public class VectorBreakout { } break; case 37: // Left - movingLeft = true; + if (isGameStarted) {movingLeft = true;} break; case 39: // Right - movingRight = true; + if (isGameStarted) {movingRight = true;} break; } } @@ -177,6 +103,8 @@ public class VectorBreakout { public void componentResized(ComponentEvent componentEvent) { gameCanvas.beamScaleX = gameFrame.getBounds().width / 800f; gameCanvas.beamScaleY = gameFrame.getBounds().height / 600f; + if (gameCanvas.beamScaleX <= gameCanvas.beamScaleY) {gameCanvas.beamThicknessScale = gameCanvas.beamScaleX;} + else {gameCanvas.beamThicknessScale = gameCanvas.beamScaleY;} } }); @@ -199,24 +127,33 @@ public class VectorBreakout { public void actionPerformed(ActionEvent e) { actualFrameRate = actualFrames; actualFrames = 0; - for (byte i = 0; i < VectorBreakout.currentBricks.length; i++) { - if (VectorBreakout.currentBricks[i] != null) { - if (VectorBreakout.currentBricks[i].isBroken) { - VectorBreakout.currentBricks[i] = null; + if (currentLevel != null) { + for (byte i = 0; i < currentLevel.levelBricks.length; i++) { + if (currentLevel.levelBricks[i] != null) { + if (currentLevel.levelBricks[i].isBroken) { + currentLevel.levelBricks[i] = null; + } } } } - for (byte i = 0; i < VectorBreakout.currentBalls.length; i++) { - if (VectorBreakout.currentBalls[i] != null) { - if (VectorBreakout.currentBalls[i].isActive == false) { - VectorBreakout.currentBalls[i] = null; + for (byte i = 0; i < currentBalls.length; i++) { + if (currentBalls[i] != null) { + if (currentBalls[i].isActive == false) { + currentBalls[i] = null; } } } - if (bricksOnScreen <= 0) { - refreshBricks(); - if (level < 32767) {level++;} else {level = 1;} - if (lives < 127) {lives++;} else {lives = 127;} + for (byte i = 0; i < currentParticles.length; i++) { + if (currentParticles[i] != null) { + if (currentParticles[i].isActive == false) { + currentParticles[i] = null; + } + } + } + if (bricksOnScreen <= 0 && isGameStarted) { + level++; + currentLevel = new Level(level); + currentLevel.startLevel(); } } }); @@ -255,13 +192,24 @@ public class VectorBreakout { currentBalls[i].moveBall(); } } - } + } + + // Particles + for (byte i = 0; i < currentParticles.length; i++) { + if (currentParticles[i] != null) { + if (currentParticles[i].isActive) { + currentParticles[i].update(); + } + } + } } public static void gameLose() { - for (byte i = 0; i < currentBricks.length; i++) { - currentBricks[i] = null; + if (currentLevel != null) { + for (byte i = 0; i < currentLevel.levelBricks.length; i++) { + currentLevel.levelBricks[i] = null; + } } for (byte i = 0; i < currentBalls.length; i++) { currentBalls[i] = null; @@ -280,11 +228,8 @@ public class VectorBreakout { movingLeft = false; movingRight = false; currentPaddles[0] = new Paddle(350, 500, 100, 15, 0, 1); - refreshBricks(); - } - - public static void refreshBricks() { - bricksOnScreen = 76; - currentBricks[0] = new Brick(20, 50, false, 0, 32, 0);currentBricks[1] = new Brick(60, 50, false, 0, 32, 0);currentBricks[2] = new Brick(100, 50, false, 0, 32, 0);currentBricks[3] = new Brick(140, 50, false, 0, 32, 0);currentBricks[4] = new Brick(180, 50, false, 0, 32, 0);currentBricks[5] = new Brick(220, 50, false, 0, 32, 0);currentBricks[6] = new Brick(260, 50, false, 0, 32, 0);currentBricks[7] = new Brick(300, 50, false, 0, 32, 0);currentBricks[8] = new Brick(340, 50, false, 0, 32, 0);currentBricks[9] = new Brick(380, 50, false, 0, 32, 0);currentBricks[10] = new Brick(420, 50, false, 0, 32, 0);currentBricks[11] = new Brick(460, 50, false, 0, 32, 0);currentBricks[12] = new Brick(500, 50, false, 0, 32, 0);currentBricks[13] = new Brick(540, 50, false, 0, 32, 0);currentBricks[14] = new Brick(580, 50, false, 0, 32, 0);currentBricks[15] = new Brick(620, 50, false, 0, 32, 0);currentBricks[16] = new Brick(660, 50, false, 0, 32, 0);currentBricks[17] = new Brick(700, 50, false, 0, 32, 0);currentBricks[18] = new Brick(740, 50, false, 0, 32, 0);currentBricks[19] = new Brick(20, 70, false, 1, 16, 0);currentBricks[20] = new Brick(60, 70, false, 1, 16, 0);currentBricks[21] = new Brick(100, 70, false, 1, 16, 0);currentBricks[22] = new Brick(140, 70, false, 1, 16, 0);currentBricks[23] = new Brick(180, 70, false, 1, 16, 0);currentBricks[24] = new Brick(220, 70, false, 1, 16, 0);currentBricks[25] = new Brick(260, 70, false, 1, 16, 0);currentBricks[26] = new Brick(300, 70, false, 1, 16, 0);currentBricks[27] = new Brick(340, 70, false, 1, 16, 0);currentBricks[28] = new Brick(380, 70, false, 1, 16, 0);currentBricks[29] = new Brick(420, 70, false, 1, 16, 0);currentBricks[30] = new Brick(460, 70, false, 1, 16, 0);currentBricks[31] = new Brick(500, 70, false, 1, 16, 0);currentBricks[32] = new Brick(540, 70, false, 1, 16, 0);currentBricks[33] = new Brick(580, 70, false, 1, 16, 0);currentBricks[34] = new Brick(620, 70, false, 1, 16, 0);currentBricks[35] = new Brick(660, 70, false, 1, 16, 0);currentBricks[36] = new Brick(700, 70, false, 1, 16, 0);currentBricks[37] = new Brick(740, 70, false, 1, 16, 0);currentBricks[38] = new Brick(20, 90, false, 2, 8, 0);currentBricks[39] = new Brick(60, 90, false, 2, 8, 0);currentBricks[40] = new Brick(100, 90, false, 2, 8, 0);currentBricks[41] = new Brick(140, 90, false, 2, 8, 0);currentBricks[42] = new Brick(180, 90, false, 2, 8, 0);currentBricks[43] = new Brick(220, 90, false, 4, 8, 2);currentBricks[44] = new Brick(260, 90, false, 2, 8, 0);currentBricks[45] = new Brick(300, 90, false, 2, 8, 0);currentBricks[46] = new Brick(340, 90, false, 2, 8, 0);currentBricks[47] = new Brick(380, 90, false, 2, 8, 0);currentBricks[48] = new Brick(420, 90, false, 2, 8, 0);currentBricks[49] = new Brick(460, 90, false, 2, 8, 0);currentBricks[50] = new Brick(500, 90, false, 2, 8, 0);currentBricks[51] = new Brick(540, 90, false, 4, 8, 2);currentBricks[52] = new Brick(580, 90, false, 2, 8, 0);currentBricks[53] = new Brick(620, 90, false, 2, 8, 0);currentBricks[54] = new Brick(660, 90, false, 2, 8, 0);currentBricks[55] = new Brick(700, 90, false, 2, 8, 0);currentBricks[56] = new Brick(740, 90, false, 2, 8, 0);currentBricks[57] = new Brick(20, 110, false, 3, 4, 0);currentBricks[58] = new Brick(60, 110, false, 3, 4, 0);currentBricks[59] = new Brick(100, 110, false, 3, 4, 0);currentBricks[60] = new Brick(140, 110, false, 3, 4, 0);currentBricks[61] = new Brick(180, 110, false, 3, 4, 0);currentBricks[62] = new Brick(220, 110, false, 3, 4, 0);currentBricks[63] = new Brick(260, 110, false, 3, 4, 0);currentBricks[64] = new Brick(300, 110, false, 3, 4, 0);currentBricks[65] = new Brick(340, 110, false, 3, 4, 0);currentBricks[66] = new Brick(380, 110, false, 3, 4, 0);currentBricks[67] = new Brick(420, 110, false, 3, 4, 0);currentBricks[68] = new Brick(460, 110, false, 3, 4, 0);currentBricks[69] = new Brick(500, 110, false, 3, 4, 0);currentBricks[70] = new Brick(540, 110, false, 3, 4, 0);currentBricks[71] = new Brick(580, 110, false, 3, 4, 0);currentBricks[72] = new Brick(620, 110, false, 3, 4, 0);currentBricks[73] = new Brick(660, 110, false, 3, 4, 0);currentBricks[74] = new Brick(700, 110, false, 3, 4, 0);currentBricks[75] = new Brick(740, 110, false, 3, 4, 0); + //test currentPaddles[0] = new Paddle(0, 500, 800, 60, 0, 1); + currentLevel = new Level(level); + currentLevel.startLevel(); } }