diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index c14274b..1d00a7e 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,13 +4,17 @@
-
-
-
+
+
+
+
+
+
+
@@ -18,57 +22,64 @@
-
-
-
- 1751025906004
+
+ 1750944458954
- 1751025906004
+ 1750944458954
+
+
+ 1750955205362
+
+
+
+ 1750955205362
+
+
@@ -76,10 +87,26 @@
+
+
+
+
\ No newline at end of file
diff --git a/Engine/gameEngine.java b/Engine/gameEngine.java
index 5767f32..314e927 100644
--- a/Engine/gameEngine.java
+++ b/Engine/gameEngine.java
@@ -105,8 +105,14 @@ public void run() {
long [] enemy1_nextShoot = new long[10]; // instantes do próximo tiro
double enemy1_radius = 9.0; // raio (tamanho do inimigo 1)
long nextEnemy1 = currentTime + 2000; // instante em que um novo inimigo 1 deve aparecer
-
- ArrayList enemy1List = new ArrayList<>(10);
+
+ //utiliza as clases criadas -- y está fora da tela ---tem que descomentar as outras partes para funcinar
+ int NumEnemys = 10;
+ ArrayList enemy1List = new ArrayList<>();
+ for(int i = 0; i < NumEnemys; i++){
+ enemy1List.add(new Enemy1(Math.random() * (GameLib.WIDTH - 20.0) + 10.0, -10, 0, currentTime));
+ }
+ enemy1List.add(null);
/* variáveis dos inimigos tipo 2 */
@@ -126,7 +132,7 @@ public void run() {
ArrayList enemy2List = new ArrayList<>(10);
/* variáveis dos projéteis lançados pelos inimigos (tanto tipo 1, quanto tipo 2) */
-
+
int [] e_projectile_states = new int[200]; // estados
double [] e_projectile_X = new double[200]; // coordenadas x
double [] e_projectile_Y = new double[200]; // coordenadas y
@@ -342,9 +348,15 @@ public void run() {
}
}
}
-
+
+
/* inimigos tipo 1 */
-
+
+ //Utilizando as clases criadas
+ /*for (int i = 0; i < enemy1List.size(); i++){
+ enemy1List.get(i).update(delta);
+ }*/
+
for(int i = 0; i < enemy1_states.length; i++){
if(enemy1_states[i] == EXPLODING){
@@ -357,7 +369,7 @@ public void run() {
if(enemy1_states[i] == ACTIVE){
- /* verificando se inimigo saiu da tela */
+ /* verificando se inimigo saiu da tela*/
if(enemy1_Y[i] > GameLib.HEIGHT + 10) {
enemy1_states[i] = INACTIVE;
@@ -472,8 +484,8 @@ public void run() {
if(free < enemy1_states.length){
- enemy1List.add(new Enemy1(Math.random() * (GameLib.WIDTH - 20.0) + 10.0,-10.0,10));
- enemy1List.get(0).draw();
+ //enemy1List.add(new Enemy1(Math.random() * (GameLib.WIDTH - 20.0) + 10.0,-10.0,10));
+ enemy1List.get(0).draw(0);
enemy1_X[free] = Math.random() * (GameLib.WIDTH - 20.0) + 10.0;
enemy1_Y[free] = -10.0;
enemy1_V[free] = 0.20 + Math.random() * 0.15;
@@ -571,11 +583,13 @@ public void run() {
/* desenhando plano fundo distante */
+ backGround.draw(delta); //função que desenha o plano de fundo
+
//GameLib.setColor(Color.DARK_GRAY);
//background2_count += background2_speed* delta;
//for(int i = 0; i < background2_X.length; i++){
- backGround.draw(delta);
+
//GameLib.fillRect(background2_X[i], (background2_Y[i] + background2_count) % GameLib.HEIGHT, 2, 2);
//}
@@ -627,7 +641,13 @@ public void run() {
}
/* desenhando inimigos (tipo 1) */
-
+
+ /*utiliza as classes criadas
+ for(int i = 0; i < enemy1List.size(); i++){
+ enemy1List.get(i).draw();
+ }*/
+
+
for(int i = 0; i < enemy1_states.length; i++){
if(enemy1_states[i] == EXPLODING){
diff --git a/Entities/BackGround.java b/Entities/BackGround.java
index 681afa6..a06bdd1 100644
--- a/Entities/BackGround.java
+++ b/Entities/BackGround.java
@@ -30,12 +30,12 @@ public void draw(long delta){
star2.getFirst().count += star2.getFirst().VY * delta;
for(int i = 0; i < star2.size(); i++){
star2.get(i).count += star2.get(i).VY * delta;
- star2.get(i).draw();
+ star2.get(i).draw(0);
}
GameLib.setColor(star1.getFirst().getColor());
for(int i = 0; i < star1.size(); i++){
star1.get(i).count += star1.get(i).VY * delta;
- star1.get(i).draw();
+ star1.get(i).draw(0);
}
}
}
diff --git a/Entities/Enemy.java b/Entities/Enemy.java
index 2781db1..a10620c 100644
--- a/Entities/Enemy.java
+++ b/Entities/Enemy.java
@@ -20,6 +20,11 @@ public void spaw(long currentTime){
}
}
+ //Sobreescrita do metodo canShoot de Entity
+ public boolean canShoot(long currentTime, GameElement ent){
+ return currentTime > nextShot && getY() < ent.getY() && getState() == EntityState.ACTIVE;
+ }
+
public void collide(GameElement element, long currentTime){
if(getState() == EntityState.ACTIVE){
@@ -32,9 +37,9 @@ public void collide(GameElement element, long currentTime){
}
}
- public void draw(){
+ public void draw(long currentTime){
if(getState() == EntityState.EXPLODING){
- explode(10);
+ explode(10, currentTime);
}
if(getState() == EntityState.ACTIVE){
GameLib.setColor(color);
diff --git a/Entities/EnemyModels/Enemy1.java b/Entities/EnemyModels/Enemy1.java
index f213041..9df3695 100644
--- a/Entities/EnemyModels/Enemy1.java
+++ b/Entities/EnemyModels/Enemy1.java
@@ -2,44 +2,47 @@
import Engine.GameLib;
import Entities.Enemy;
+import Entities.GameElement;
import Entities.Projectile;
import utils.EntityState;
+import javax.lang.model.type.NullType;
import java.awt.*;
public class Enemy1 extends Enemy {
- public Enemy1(double x, double y, long when){
+ public Enemy1(double x, double y, long when, long currentTime){
super(x, y, when, 9.0);
VX = 0;
VY = 0.20 + Math.random() * 0.15;
angle = (3 * Math.PI) / 2;
RV = 0;
- nextShot = now + 500;
+ ShootingSpeed = 500;
+ nextShot = currentTime + ShootingSpeed;
color= Color.CYAN;
- setState(EntityState.INACTIVE);
+ setState(EntityState.ACTIVE);
}
- public void update(long delta/*, Player player*/){
+ public void update(long delta, long currentTime){
if(getState() == EntityState.EXPLODING){
- if(now > explosionEnd){
+ if(currentTime > explosionEnd){
setState(EntityState.DESTROY);
}
}
- if(getState() == EntityState.ACTIVE){
+ if(getState() == EntityState.ACTIVE) {
/* verificando se inimigo saiu da tela */
- if(getY() > GameLib.HEIGHT + 10) {
+ if (getY() > GameLib.HEIGHT + 10) {
setState(EntityState.DESTROY);
- }
- else {
+ } else {
setX(getX() + VX * Math.cos(angle) * delta);
- setY(getY() + VX * Math.sin(angle) * delta * (-1.0) );
+ setY(getY() + VY * Math.sin(angle) * delta * (-1.0));
angle += RV * delta;
-
- if(now > nextShot/* && Y < player.getY()*/){
+ }
+ }
+ //if(now > nextShot/* && Y < player.getY()*/){
//efetua o proximo disparo
@@ -56,24 +59,25 @@ public void update(long delta/*, Player player*/){
enemy1_nextShoot[i] = (long) (currentTime + 200 + Math.random() * 500);
}
*/
- }
- }
- }
+
+
+
}
//Provavlemente esse metodo retornara alguma coisa
- public void shot(){
-
- Projectile project = new Projectile(getX(),getY(), radius, Math.cos(angle) * 0.45,Math.sin(angle) * 0.45 * (-1.0) );
+ public Projectile shot(long currentTime, GameElement ent){
+ if(canShoot(currentTime, ent)){
+ nextShot = currentTime + ShootingSpeed;
+ return new Projectile(getX(),getY(), 2.0, Math.cos(angle) * 0.45,Math.sin(angle) * 0.45 * (-1.0), Color.RED );
+ }
+ return null;
//Inimigo1 e Inimigo2: super(enemy.getX(), enemy.getY(), radius);
// Inimigo1: VX = Math.cos(enemy.getAngle()) * 0.45; VY = Math.sin(enemy.getAngle()) * 0.45 * (-1.0);
// o tiro vai ser parte do inimigo, mas o inimigo vai chamar/criar uma classe de projétil c o construtor de projetil. Se vc quiser, pode criar 2 subclasses de projetil, uma o projetil base e uma outra q quando chega em um pedaco da tela (o fim se pa) explode em outros projeteis (pro boss e pros powerup w vo usa). mas ai e opcional sepa, tu escolhe, so acho q vale a pena ter mais q 1 tipo de projetil
//teoricamente quem vai controlar porjetil seria GameEnge
//mas a arrayList ficaria aonde ?
//no codigo original ele não controla isso, pra ele todos os projeteis são a mesma coisa
-
-
}
}
diff --git a/Entities/EnemyModels/Enemy2.java b/Entities/EnemyModels/Enemy2.java
index 1a0a2a7..211541a 100644
--- a/Entities/EnemyModels/Enemy2.java
+++ b/Entities/EnemyModels/Enemy2.java
@@ -1,4 +1,89 @@
package Entities.EnemyModels;
-public class Enemy2 {
+import Engine.GameLib;
+import Entities.Enemy;
+import Entities.GameElement;
+import Entities.Projectile;
+import utils.EntityState;
+
+import java.awt.*;
+import java.util.ArrayList;
+
+public class Enemy2 extends Enemy {
+ protected static long same;
+
+ public Enemy2(double x, double y, long when, long currentTime){
+ super(x,y,when,12.0);
+ same = when;
+ VX = 0.42;
+ angle = (3 * Math.PI) / 2;
+ RV = 0;
+ setState(EntityState.INACTIVE);
+ //teoricamente -- para um mesmo inimigo 2 só que vai spownar depois
+ if(when == same){
+ spawTime = when + 120;
+ }
+ }
+
+
+ public void update(long delta, long currentTime) {
+ if(getState() == EntityState.EXPLODING){
+
+ if(currentTime > explosionEnd){
+ setState(EntityState.DESTROY);
+ }
+ }
+ if(getState() == EntityState.ACTIVE){
+ if (getY() > GameLib.HEIGHT + 10) {
+ setState(EntityState.DESTROY);
+ } else {
+
+ double previousY = getY();
+
+ setX(getX() + VX * Math.cos(angle) * delta);
+ setY(getY() + VY * Math.sin(angle) * delta * (-1.0));
+ angle += RV * delta;
+
+ double threshold = GameLib.HEIGHT * 0.30;
+
+ if(previousY < threshold && getY() >= threshold) {
+
+ if(getX() < GameLib.WIDTH / 2) RV = 0.003;
+ else RV = -0.003;
+ }
+ }
+ }
+
+ }
+
+ public boolean canShoot(long currentTime, GameElement ent){
+
+ if(RV > 0 && Math.abs(angle - 3 * Math.PI) < 0.05){
+
+ RV = 0.0;
+ angle = 3 * Math.PI;
+ return true;
+ }
+
+ if(RV < 0 && Math.abs(angle) < 0.05){
+
+ RV = 0.0;
+ angle = 0.0;
+ return true;
+ }
+
+ return false;
+ // return currentTime > nextShot && getY() < ent.getY() && getState() == EntityState.ACTIVE;
+ }
+
+ public Projectile shot(long currentTime, GameElement ent,double angles){
+
+ double a = angles + Math.random() * Math.PI/6 - Math.PI/12;
+ double vx = Math.cos(a) * 0.3;
+ double vy = Math.sin(a) * 0.3;
+
+ return new Projectile(getX(),getY(),2.0,vx,vy, Color.RED);
+ }
+
}
+
diff --git a/Entities/Entity.java b/Entities/Entity.java
index 5e5e392..f39e887 100644
--- a/Entities/Entity.java
+++ b/Entities/Entity.java
@@ -6,6 +6,7 @@
public abstract class Entity extends GameElement {
protected double explosionStart; // instante do início da explosão
protected double explosionEnd; // instante do final da explosão
+ protected int ShootingSpeed = 100;
protected long nextShot; // instante a partir do qual pode haver um próximo tiro
@@ -13,13 +14,12 @@ public Entity(double x, double y, double radius) {
super(x,y,radius);
explosionStart = 0;
explosionEnd = 0;
- nextShot = now;
}
- public void explode(int explosionTime){
+ public void explode(int explosionTime, long currentTime){
setState(EntityState.EXPLODING);
- explosionStart = now;
- explosionEnd = now + 2000;
+ explosionStart = currentTime;
+ explosionEnd = currentTime + 2000;
double alpha = (System.currentTimeMillis() - explosionStart) / (explosionEnd - explosionStart);
GameLib.drawExplosion(getX(), getY(), alpha);
}
@@ -29,21 +29,11 @@ public double collideTo(GameElement collider) {
double dy = this.getY() - collider.getY();
return Math.sqrt(dx * dx + dy * dy);
}
- public abstract void update(long delta);
-
- //Somente uma ideia de como vai ficar
- public void collide(){
-
- }
-
- private void collideShot(){
-
- }
-
- private void collideEnemy(){
+ public boolean canShoot(long currentTime){
+ return currentTime > nextShot && getState() == EntityState.ACTIVE;
}
- //talvez eu coloque o shot aqui
+ public abstract void update(long delta, long currentTime);
}
\ No newline at end of file
diff --git a/Entities/GameElement.java b/Entities/GameElement.java
index 50e00e7..4d9311d 100644
--- a/Entities/GameElement.java
+++ b/Entities/GameElement.java
@@ -21,7 +21,7 @@ public abstract class GameElement extends Point2D {
protected double angle; // ângulos (indicam direção do movimento)
protected double RV; // velocidades de rotação
- protected long now = System.currentTimeMillis();
+// protected long now = System.currentTimeMillis();
protected Color color;
public GameElement(double x, double y, double radius){
@@ -49,5 +49,5 @@ public void setColor(Color color){
}
public Color getColor(){return color;}
- public abstract void draw();
+ public abstract void draw(long currentTime);
}
diff --git a/Entities/Player.java b/Entities/Player.java
index 40315aa..f3bb0b3 100644
--- a/Entities/Player.java
+++ b/Entities/Player.java
@@ -8,7 +8,6 @@
public class Player extends Entity{
- protected int playerShootingSpeed = 100;
public Player(double x, double y, double radius){
super(x, y, radius);
@@ -18,10 +17,10 @@ public Player(double x, double y, double radius){
}
public void setShootingSpeed(int shootingSpeed){
- playerShootingSpeed = shootingSpeed;
+ ShootingSpeed = shootingSpeed;
}
- public void update(long delta) {
+ public void update(long delta, long currentTime) {
if (getState() != EntityState.EXPLODING) {
if (GameLib.iskeyPressed(GameLib.KEY_UP)) setY(getY() - delta * VY);
if (GameLib.iskeyPressed(GameLib.KEY_DOWN)) setY(getY() + delta * VY);
@@ -29,18 +28,30 @@ public void update(long delta) {
if (GameLib.iskeyPressed(GameLib.KEY_RIGHT)) setX(getX()+- delta * VX);
if (GameLib.iskeyPressed(GameLib.KEY_CONTROL)) {
- if (now > nextShot) {
+ if (currentTime > nextShot) {
// DAR TIRO
- nextShot = now + playerShootingSpeed;
+ nextShot = currentTime + ShootingSpeed;
}
}
} else {
- if (now > explosionEnd) {
+ if (currentTime > explosionEnd) {
setState(EntityState.ACTIVE);
}
}
}
+ public Projectile shoot(long currentTime){
+ if (GameLib.iskeyPressed(GameLib.KEY_CONTROL) && canShoot(currentTime)){
+ nextShot = currentTime + ShootingSpeed;
+ //não sei se esta certo os valores
+ return new ProjectilePlayer(getX(),getY() - 2 * radius, radius, VX, VY, Color.GREEN);
+ }
+ return null;
+
+ //Player: super(player.getX(), player.getY() - 2 * player.getRadius(), radius);
+ // Player: VX = vx; VY = vy;
+ }
+
public void collide(GameElement element, long currentTime){
if(getState() == EntityState.ACTIVE){
double dist = collideTo(element);
@@ -52,9 +63,9 @@ public void collide(GameElement element, long currentTime){
}
}
- public void draw() {
+ public void draw(long currentTime) {
if (getState() == EntityState.EXPLODING) {
- explode(2000);
+ explode(2000, currentTime);
} else {
GameLib.setColor(color);
GameLib.drawPlayer(getX(), getY(), radius);
diff --git a/Entities/Projectile.java b/Entities/Projectile.java
index c031fbf..4edd90b 100644
--- a/Entities/Projectile.java
+++ b/Entities/Projectile.java
@@ -1,13 +1,17 @@
package Entities;
import java.awt.Color;
+
+import Engine.GameLib;
import Entities.Entity;
import utils.EntityState;
public class Projectile extends Entity{
//disparo do player
- public Projectile(double x, double y, double radius, double vx, double vy) {
+ //Implementar
+ public Projectile(double x, double y, double radius, double vx, double vy, Color cor) {
super(x, y, radius);
+ color = cor;
//variações de super:
//Player: super(player.getX(), player.getY() - 2 * player.getRadius(), radius);
//Inimigo1 e Inimigo2: super(enemy.getX(), enemy.getY(), radius);
@@ -23,21 +27,23 @@ public Projectile(double x, double y, double radius, double vx, double vy) {
}
- public void update(long delta) {
+ public void update(long delta, long currentTime) {
if(state == EntityState.ACTIVE){
/* verificando se projétil saiu da tela */
if(getY() < 0) {
-
- //projectile_states[i] = INACTIVE;
+ setState(EntityState.DESTROY);
}
else {
setX(getX() + VX * delta);
setY(getY() + VY * delta);
}
}
- } //tentantdo comitar/
- public void draw() {
-
+ }
+ public void draw(long currentTime) {
+ if(getState() == EntityState.ACTIVE){
+ GameLib.setColor(color);
+ GameLib.drawCircle(getX(), getY(), radius);
+ }
}
}
\ No newline at end of file
diff --git a/Entities/ProjectilePlayer.java b/Entities/ProjectilePlayer.java
new file mode 100644
index 0000000..e87f856
--- /dev/null
+++ b/Entities/ProjectilePlayer.java
@@ -0,0 +1,24 @@
+package Entities;
+
+import Engine.GameLib;
+import utils.EntityState;
+
+import java.awt.*;
+
+public class ProjectilePlayer extends Projectile{
+
+ public ProjectilePlayer(double x, double y, double radius, double vx, double vy, Color cor) {
+ super(x, y, radius, vx ,vy, cor);
+ }
+
+ //sobreescrita do draw de Projectile
+ public void draw(long currentTime) {
+ if(getState() == EntityState.ACTIVE){
+
+ GameLib.setColor(color);
+ GameLib.drawLine(getX(), getY() - 5, getX(), getY() + 5);
+ GameLib.drawLine(getX() - 1, getY() - 3, getX()- 1, getY() + 3);
+ GameLib.drawLine(getX() + 1, getY() - 3, getX() + 1, getY() + 3);
+ }
+ }
+}
diff --git a/Entities/Star.java b/Entities/Star.java
index fbfead3..6d0090c 100644
--- a/Entities/Star.java
+++ b/Entities/Star.java
@@ -14,7 +14,7 @@ public Star(double speed, Color cor ){
color = cor;
}
- public void draw(){
+ public void draw(long currentTime){
GameLib.fillRect(getX(), (getY() + count) % GameLib.HEIGHT, 2, 2);
}
}
diff --git a/utils/Point2D.java b/utils/Point2D.java
index a9bd522..186847a 100644
--- a/utils/Point2D.java
+++ b/utils/Point2D.java
@@ -28,7 +28,7 @@ public Point2D() {
}
// Methods
- public abstract void draw();
+ public abstract void draw(long currentTime);
// Getters e Setters