From f6407115e6d400e2ff867980094d022243634719 Mon Sep 17 00:00:00 2001 From: Sagi Dayan Date: Sat, 19 Mar 2016 00:33:29 +0200 Subject: [PATCH] wave & stage abstraction also cleaned some code. --- .../sagi/dayan/Games/Elements/EnemyShip.java | 5 +- src/com/sagi/dayan/Games/Elements/Wave.java | 5 +- .../sagi/dayan/Games/Engine/GameEngine.java | 11 ++++- src/com/sagi/dayan/Games/Images/E1-Fire.png | Bin 4578 -> 2425 bytes .../sagi/dayan/Games/Stage/FirstStage.java | 46 ++++++++++++++++++ src/com/sagi/dayan/Games/Stage/Level.java | 12 ++--- .../sagi/dayan/Games/Utils/WaveConfig.java | 41 ++++++++++++++++ .../sagi/dayan/Games/Utils/WaveConfigs.java | 34 +++++++++++++ 8 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 src/com/sagi/dayan/Games/Stage/FirstStage.java create mode 100644 src/com/sagi/dayan/Games/Utils/WaveConfig.java create mode 100644 src/com/sagi/dayan/Games/Utils/WaveConfigs.java diff --git a/src/com/sagi/dayan/Games/Elements/EnemyShip.java b/src/com/sagi/dayan/Games/Elements/EnemyShip.java index e8fbd6d..6eca8dc 100644 --- a/src/com/sagi/dayan/Games/Elements/EnemyShip.java +++ b/src/com/sagi/dayan/Games/Elements/EnemyShip.java @@ -10,14 +10,15 @@ import java.awt.event.ActionListener; * Created by sagi on 2/20/16. */ public class EnemyShip extends AnimatedSprite { - protected int fireDelay, stepDelay, currentStep; + protected int currentStep; + protected double stepDelay, fireDelay; protected long lastFireTime, lastStepTime; protected int[] moveVector; protected Wave wave; protected int hitsToDestroy; protected boolean isDone; protected long startExploded; - public EnemyShip(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight,int fireDelay, int stepDelay, Wave wave, int[] moveVector,int numOfFirstFrames, int hitsToDestroy) { + public EnemyShip(int x, int y, int w, int h, int acc, String imgName, double angle, int sWidth, int sHeight,double fireDelay, double stepDelay, Wave wave, int[] moveVector,int numOfFirstFrames, int hitsToDestroy) { super(x, y, w, h, acc, imgName, angle, sWidth, sHeight, numOfFirstFrames); this.fireDelay = fireDelay; this.stepDelay = stepDelay; diff --git a/src/com/sagi/dayan/Games/Elements/Wave.java b/src/com/sagi/dayan/Games/Elements/Wave.java index 3b20e8d..f089ab0 100644 --- a/src/com/sagi/dayan/Games/Elements/Wave.java +++ b/src/com/sagi/dayan/Games/Elements/Wave.java @@ -13,7 +13,8 @@ import java.util.Vector; public class Wave { protected Level level; - protected int enemyMaxAmount, currentAmount,fireDelay, launchDelay, stepDelay, acc, startX, startY; + protected int enemyMaxAmount, currentAmount, acc, startX, startY; + protected double stepDelay,fireDelay, launchDelay; protected int[] moveVector; protected Vector enemies; protected Vector bullets; @@ -21,7 +22,7 @@ public class Wave { protected String imageName; protected int hitsToDestroy; - public Wave(int enemyMaxAmount, int[] moveVector, int fireDelay, int stepDelay, int launchDelay, int acc, String imageName, int startX, int startY, Level stage, int hitsToDestroy){ + public Wave(int enemyMaxAmount, int[] moveVector, double fireDelay, double stepDelay, double launchDelay, int acc, String imageName, int startX, int startY, Level stage, int hitsToDestroy){ this.enemies = new Vector<>(); this.bullets = new Vector<>(); this.enemyMaxAmount = enemyMaxAmount; diff --git a/src/com/sagi/dayan/Games/Engine/GameEngine.java b/src/com/sagi/dayan/Games/Engine/GameEngine.java index 3591209..1cb5771 100644 --- a/src/com/sagi/dayan/Games/Engine/GameEngine.java +++ b/src/com/sagi/dayan/Games/Engine/GameEngine.java @@ -6,6 +6,7 @@ package com.sagi.dayan.Games.Engine; import com.sagi.dayan.Games.Stage.*; import com.sagi.dayan.Games.Utils.Utils; +import com.sagi.dayan.Games.Utils.WaveConfigs; import javax.swing.*; import java.awt.*; @@ -37,8 +38,12 @@ public class GameEngine { private int p1Strikes, p2Strikes, p1CurrentStrikes, p2CurentStrikes; + + private Font gameFont; + private WaveConfigs waveConfigs; + public GameEngine(int width, int height, Stage stage){ this.currentScene = 0; this.isFirstGame = true; @@ -61,6 +66,7 @@ public class GameEngine { e.printStackTrace(); gameFont = null; } + this.waveConfigs = new WaveConfigs(); startNewGame(); } @@ -83,6 +89,9 @@ public class GameEngine { } + public WaveConfigs getWaveConfigs() { + return waveConfigs; + } @@ -128,7 +137,7 @@ public class GameEngine { public void startGame(int numOfPlayers){ this.numOfPlayers = numOfPlayers; - scenes.add(new Level(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-", new int[]{5, 20})); + scenes.add(new FirstStage(pWidth, pHeight, numOfPlayers, this, "-= STAGE 1.0 =-", new int[]{5, 20})); changeScene(currentScene+1); } diff --git a/src/com/sagi/dayan/Games/Images/E1-Fire.png b/src/com/sagi/dayan/Games/Images/E1-Fire.png index a7c1dab023c053dc8df3a51cea6388f3d82501ed..9ba35319decc98dc8a67125ac9718bc0c5ed02d7 100644 GIT binary patch delta 2308 zcmV+f3H$cqBl!{`iBL{Q4GJ0x0000DNk~Le0003j0000K1Oos70L2X*GLa#62n`Ak zFvEIyJ$PuXN$FMqi$rMEn2&Q@|AtINbwiaNA}smS?`H&*k=nRy>fiP zeoq14fBX15?6>20y`_1L{dRm7SFz{WZ^x^DnRUwapB7&HB;!%*0=&zk+22?6_#M2< zjcul96m>!&7ptZ^G4mM|N-zp&;fYV6P`odl>T{+93dQL06lb3sP$*g*M%wRk5eh|U zUPN8n+4f75dYP{{B24LdNb3Wa=TQ>@lO8HcqN zAaIV+S5*5RdGKT(J+t@~^59W=bz;_Yg5E}@xcFX0&>JWu zbJxoV`U{DuXK@Zezb87X=$}N;uN=*!^o~Nb$bG!#u+%PudP@^KIJXT_g|1>*tsNWS zf5#NO%wjxl`x3L(0`T8lPkYA>uLD49%Ho7`^uTuj6yNF}+8@~R34oQCTleX@Kl&Sh z$%oQAm2C?D0-*oy{O0w>8Gi!Me0_M+tVY5g0MuL<{5CD`^E&_qr`x6mmRx=VApJz` z+m>Y zf$FI^E9;vLz-!8}mFY#-WB{5-c9R367Lfo{5qI~ubm{v8kY=V(Q&=u-1wb5rf4Lx| zblwtxP|XkN3E3kC0C-|w$A>3(sIIl}?!}~rs2Sa&nDXc_$w9K}S4rC3S`#6JMY+pF zB`(F@AluQ;=MG9rtTYl#y2ei0&xlV}+T!ZEkM0=~>(4jAl-D27Y!_`##W73o?ZQ44 zsUc$~vU9hw%7hC-n7zq48yGhQf8z~6Xr+M%> z;qu9b*7vCnKP-Ts!pcigHGUHi%tvCR#L8&AIO4%e?2Ce_g%B=u^l~JJS0Xx zzq`St%QCB7wEEQc3S6B*f6`MC+Hr+EOu2qUnK1R>atgC_tM5%Aiv5S!iEL@tD+0%N zGzB(BcIpT7AKX~wUg=-A)q~Ie>usBSw{mF*-aQ}Fj8m;j=1qTC;8uVm(Gp={Aiuu*@Kf;)k&C zkVQI-u>NlWd_-JI$X25U0|#D5Ol**}dWEVfj~O$XFfW%Uqs@(<2(%sfoU)+ArP=Fl z(lHkMPErEfXoG9(j_#ZhXH^he_j!!5*qSd1D5<^1Sqx@sTN1Z4+ry;O!CP3);*RUKP-S(XE`lI z)hbuTlt=4BT#$@mj+8c+;_Fbtg4(4yC5e?LPuq90QNxlFlU2t|Iu`>5XT{0(Rji+ zvUU-!ioVK2`~8bY;i{nL@6&b5LRLj}>P}^=BxF_4$eY(2Mj)$#8nS6t%@=3`s{%W5 zAw0W7ZLI~Y`!o^nLmr0X_o?16mykio`t-KZ%RHzBvi^Qq>7++^1X+JQ%-^eGTL@Wy z-c8k!GRc6fKdzIt=5Ps+_4|bo#bHc1Wc_wJXl0P;e+^l`o*+!NPB=r>FZ)cIiyCzy z>*t-gn#@WS$ogp=rXVq23bM9*XQrP?ol{$D0epnXzM|I8NYL2!(=#8BAwgr(T%B0d zjRXy@hIS^i9tj#u0o5n*9uhRnbc)NFTqI~F;z{N{IY`j-h7t8#E+OgI=;f$l9)+Z1 zr4tOFe*hRcLa911e5{e6A#1_#F+zeSM3L1xtd4|U&CK>bnmjGSH~Le#e&+)fcY0hNDq^`n^MYg(wBp=PkHn!B=T^Kw2CX<(!`ztciX(W= z$*`AQ-~>+YRck~m&QTrNO0?n}&|1uQ_@@OLj(z47JubU3PSKOt-OVX_;@j&v&xtAA zPU93k(dArD(G&TQ!zp^guP@DTs$5ePr}7C_1#l`Kf0{L?=<&rFaf%*qs5+-~@_5R{ e{M+(hy#5DSGYej0yJpV-0000D?hj+ZXGblDb0Z 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 QdjJ3c07*qoM6N<$f@S@(wg3PC diff --git a/src/com/sagi/dayan/Games/Stage/FirstStage.java b/src/com/sagi/dayan/Games/Stage/FirstStage.java new file mode 100644 index 0000000..a90e9ae --- /dev/null +++ b/src/com/sagi/dayan/Games/Stage/FirstStage.java @@ -0,0 +1,46 @@ +package com.sagi.dayan.Games.Stage; + +import com.sagi.dayan.Games.Elements.Wave; +import com.sagi.dayan.Games.Engine.GameEngine; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; + +/** + * Created by sagi on 3/19/16. + */ +public class FirstStage extends Level{ + + public FirstStage(int width, int height, int numOfPlayers, GameEngine engine, String stageTitle, int[] waveDelay) { + super(width, height, numOfPlayers, engine, stageTitle, waveDelay); + } + + @Override + protected void launchWave(long now) { + lastWaveTime = now; + System.out.println("New Wave!! Time: " + now); + WaveConfig wc; + int numOfEnemies = 5, numOfHits = 1; + double launchDelay = 0.5, fireDelay = 5; + switch (currentWave){ + case 0: + numOfEnemies = 5; + fireDelay = 0.2; + launchDelay = 0.5; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + case 1: + numOfEnemies = 5; + fireDelay = 5; + launchDelay = 1; + numOfHits = 1; + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + default: + wc = engine.getWaveConfigs().getWaveConfig(WaveConfigs.DEMO); + break; + } + waves.add(new Wave(numOfEnemies, wc.getMoveVector(), fireDelay, wc.getStepDelay(), launchDelay, wc.getAcc(), "L1-ES1.png", wc.getStartX(), wc.getStartY(), this, numOfHits)); + currentWave++; + } +} diff --git a/src/com/sagi/dayan/Games/Stage/Level.java b/src/com/sagi/dayan/Games/Stage/Level.java index d35e0bf..25a54ea 100644 --- a/src/com/sagi/dayan/Games/Stage/Level.java +++ b/src/com/sagi/dayan/Games/Stage/Level.java @@ -4,6 +4,8 @@ import com.sagi.dayan.Games.Elements.*; import com.sagi.dayan.Games.Engine.CollisionUtil; import com.sagi.dayan.Games.Engine.GameEngine; import com.sagi.dayan.Games.Utils.Utils; +import com.sagi.dayan.Games.Utils.WaveConfig; +import com.sagi.dayan.Games.Utils.WaveConfigs; import javax.swing.*; import javax.swing.Timer; @@ -18,7 +20,7 @@ import java.util.*; /** * Created by sagi on 2/20/16. */ -public class Level extends Scene { +public abstract class Level extends Scene { protected Vector players; protected int p1Speed = 10; protected Vector p1Missiles, p2Missiles, enemyMissiles; @@ -83,17 +85,13 @@ public class Level extends Scene { @Override public void update() { - bg.update(); movePlayers(); Vector wavesToRemove = new Vector(); long now = System.currentTimeMillis(); if(currentWave < waveDelay.length && now - lastWaveTime >= waveDelay[currentWave] * 1000){ - lastWaveTime = now; - System.out.println("New Wave!! Time: "+ now); - currentWave++; - waves.add(new Wave(5, new int[]{90,90,120, 120, 150, 150, 270, 270, 270} , 4, 1, 2, 4, "L1-ES1.png" , 500, 0, this, 1)); + launchWave(now); } if(startingAnimationIndex < 3 && !isStarted){ @@ -145,6 +143,8 @@ public class Level extends Scene { checkCollision(); } + protected abstract void launchWave(long time); + private void movePlayers() { /** * Player 1 Movement: diff --git a/src/com/sagi/dayan/Games/Utils/WaveConfig.java b/src/com/sagi/dayan/Games/Utils/WaveConfig.java new file mode 100644 index 0000000..fb1ac76 --- /dev/null +++ b/src/com/sagi/dayan/Games/Utils/WaveConfig.java @@ -0,0 +1,41 @@ +package com.sagi.dayan.Games.Utils; + +/** + * Created by sagi on 3/18/16. + */ +public class WaveConfig { + protected int[] moveVector; + protected double stepDelay; + protected int acc; + protected int startX; + protected int startY; + + public WaveConfig(int[] moveVector, double stepDelay, int acc, int staryX, int startY){ + this.moveVector = moveVector; + this.stepDelay = stepDelay; + this.acc = acc; + this.startX = staryX; + this.startY = startY; + } + + + public int[] getMoveVector() { + return moveVector; + } + + public double getStepDelay() { + return stepDelay; + } + + public int getAcc() { + return acc; + } + + public int getStartX() { + return startX; + } + + public int getStartY() { + return startY; + } +} diff --git a/src/com/sagi/dayan/Games/Utils/WaveConfigs.java b/src/com/sagi/dayan/Games/Utils/WaveConfigs.java new file mode 100644 index 0000000..d26621c --- /dev/null +++ b/src/com/sagi/dayan/Games/Utils/WaveConfigs.java @@ -0,0 +1,34 @@ +package com.sagi.dayan.Games.Utils; + +import java.util.Vector; + +/** + * Created by sagi on 3/18/16. + */ +public class WaveConfigs { + public static final int DEMO = 0; + Vector configs; + + public WaveConfigs(){ + configs = new Vector<>(); +// int[] moveVector, double stepDelay, int acc, int staryX, int startY + configs.add(new WaveConfig(new int[]{90,90,120, 120, 150, 150, 270, 270, 270} , 0.5, 8,500 , 0)); + +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); +// configs.add(new WaveConfig( , , , , )); + } + + public WaveConfig getWaveConfig(int config){ + if (config < 0 || configs.size() <= config) + throw new IllegalArgumentException("no such config..."); + return configs.get(config); + } +}