From 9bc8b487ae80d362baba04aaa6a7bdf9e8a27947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 9 Apr 2021 11:57:52 +0200 Subject: [PATCH] refactor!: Created BaseScreen and BaseGame the game runs now, still kinda broken Entity was redundant of Actor --- core/src/sagittarius/SagittariusGame.java | 76 +---------- core/src/sagittarius/model/Arrow.java | 20 +-- core/src/sagittarius/model/Bow.java | 23 ++-- core/src/sagittarius/model/Entity.java | 37 ----- core/src/sagittarius/model/Planet.java | 4 +- core/src/sagittarius/model/Player.java | 9 +- core/src/sagittarius/view/BaseGame.java | 16 +++ core/src/sagittarius/view/BaseScreen.java | 52 +++++++ core/src/sagittarius/view/GameScreen.java | 150 +++------------------ core/src/sagittarius/view/StartScreen.java | 54 ++++---- 10 files changed, 142 insertions(+), 299 deletions(-) delete mode 100644 core/src/sagittarius/model/Entity.java create mode 100644 core/src/sagittarius/view/BaseGame.java create mode 100644 core/src/sagittarius/view/BaseScreen.java diff --git a/core/src/sagittarius/SagittariusGame.java b/core/src/sagittarius/SagittariusGame.java index 7fd1eb9..f69aaf1 100644 --- a/core/src/sagittarius/SagittariusGame.java +++ b/core/src/sagittarius/SagittariusGame.java @@ -1,86 +1,18 @@ package sagittarius; -import java.util.ArrayList; -import java.util.Iterator; - -import com.badlogic.gdx.Game; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.math.Vector3; - import sagittarius.view.*; -import sagittarius.model.*; -public class SagittariusGame extends Game { +public class SagittariusGame extends BaseGame { -// ---------- ATTRIBUTEs ---------- +// ---------- CONSTANTs ---------- - // Constants - static final int G = 100; - - // Vectors - static Vector2 screenCursor; - static Vector2 worldCursor; - - // Entities - static ArrayList planetList; - static ArrayList moonList; - static ArrayList playerList; - static ArrayList arrowList; - // TODO : fix this shit, too many for loops + public static final float G = 100; // ---------- METHODs ---------- @Override public void create() { - setScreen(new StartScreen(this)); - - planetList = new ArrayList(); - planetList.add( new Planet(new Vector2(400, 400), 1000, 50) ); - planetList.add( new Planet(new Vector2(1400, 700), 1000, 100, Color.CYAN) ); - - moonList = new ArrayList(); - moonList.add( new Moon(planetList.get(1), 100, 20, 300) ); - - playerList = new ArrayList(); - playerList.add( new Player(planetList.get(0)) ); - // playerList.add( new Player(planetList.get(1)) ); - - arrowList = new ArrayList(); - } - - /** - * Main update loop. - * - * @param deltaTime time elapsed between 2 frames. - */ - static void update(float deltaTime) { - - // cursors - screenCursor = new Vector2(Gdx.input.getX(), Gdx.input.getY()); - Vector3 unprojectedCursor = GameScreen.camera.unproject(new Vector3(screenCursor, 0)); - worldCursor = new Vector2(unprojectedCursor.x, unprojectedCursor.y); - - // players - for (Player player : playerList) { - player.update(deltaTime); - } - - // moons - for (Moon moon : moonList) { - moon.update(deltaTime); - } - - // arrows - for (Iterator it = arrowList.iterator(); it.hasNext(); ) { - Arrow arrow = it.next(); - arrow.update(deltaTime); - if (arrow.TTL <= 0) { - it.remove(); - } - } - + this.setScreen(new StartScreen()); } } diff --git a/core/src/sagittarius/model/Arrow.java b/core/src/sagittarius/model/Arrow.java index 253b1c2..8c71f26 100644 --- a/core/src/sagittarius/model/Arrow.java +++ b/core/src/sagittarius/model/Arrow.java @@ -6,8 +6,11 @@ import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; -public class Arrow extends Entity { +import sagittarius.Sagittarius; + +public class Arrow extends Actor { // ---------- ATTRIBUTEs ---------- @@ -32,7 +35,8 @@ public class Arrow extends Entity { * @param shooter Bow's shooter. */ Arrow(float angle, float power, Player shooter) { - super(shooter.position, 1); + super(); + this.setPosition(shooter.getX(), shooter.getY()); this.velocity = new Vector2(power, 0).setAngleDeg(angle); this.acceleration = new Vector2(); this.force = computeForce(); @@ -47,14 +51,14 @@ public class Arrow extends Entity { */ private Vector2 computeForce() { Vector2 force = new Vector2(); - for (Planet attractor : SagittariusGame.planetList) { + for (Planet attractor : Sagittarius.planetList) { Vector2 diff = attractor.position.cpy().sub(this.position); - Vector2 attraction = diff.scl( SagittariusGame.G * attractor.mass / diff.len2() ); + Vector2 attraction = diff.scl( Sagittarius.G * attractor.mass / diff.len2() ); force.add(attraction); } - for (Moon attractor : SagittariusGame.moonList) { + for (Moon attractor : Sagittarius.moonList) { Vector2 diff = attractor.position.cpy().sub(this.position); - Vector2 attraction = diff.scl( SagittariusGame.G * attractor.mass / diff.len2() ); + Vector2 attraction = diff.scl( Sagittarius.G * attractor.mass / diff.len2() ); force.add(attraction); } return force; @@ -64,14 +68,14 @@ public class Arrow extends Entity { * Verify whether or not the Arrow contacts an Entity. */ private void verifyActivity() { - for (Planet planet : SagittariusGame.planetList) { + for (Planet planet : Sagittarius.planetList) { if (this.distanceTo(planet) < planet.getRadius()) { this.active = false; this.crash = planet; this.offset = this.position.cpy().sub(planet.position); } } - for (Moon moon : SagittariusGame.moonList) { + for (Moon moon : Sagittarius.moonList) { if (this.distanceTo(moon) < moon.getRadius()) { this.active = false; this.crash = moon; diff --git a/core/src/sagittarius/model/Bow.java b/core/src/sagittarius/model/Bow.java index 57d2c59..6bfa5f4 100644 --- a/core/src/sagittarius/model/Bow.java +++ b/core/src/sagittarius/model/Bow.java @@ -5,10 +5,11 @@ import com.badlogic.gdx.Input.Buttons; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; -import sagittarius.SagittariusGame; +import sagittarius.Sagittarius; -class Bow { +class Bow extends Actor { // ---------- ATTRIBUTEs ---------- @@ -25,27 +26,23 @@ class Bow { // ---------- CONSTRUCTORs ---------- Bow(Player shooter, boolean aimAssist) { + super(); this.shooter = shooter; this.aimAssist = aimAssist; } // ---------- METHODs ---------- - /** - * Updates the physical attributes of the Bow, - * wich are later used to generate an Arrow. - * - * @param deltaTime time elapsed between 2 frames. - */ - void update(double deltaTime) { + @Override + public void act(float deltaTime) { if (Gdx.input.isButtonJustPressed(Buttons.LEFT) && !pressed) { - this.anchor = SagittariusGame.worldCursor.cpy(); + this.anchor = Sagittarius.worldCursor.cpy(); pressed = true; } else if (Gdx.input.isButtonPressed(Buttons.LEFT) && pressed) { computeArrow(); } else if (pressed) { - SagittariusGame.arrowList.add(getArrow()); + Sagittarius.arrowList.add(getArrow()); pressed = false; } @@ -65,14 +62,14 @@ class Bow { * to the Arrow's constructor. */ private void computeArrow() { - aim = this.anchor.cpy().sub(SagittariusGame.worldCursor); + aim = this.anchor.cpy().sub(Sagittarius.worldCursor); angle = aim.angleDeg(); power = MathUtils.clamp(aim.len(), 0, 1000); } void render(ShapeRenderer shapeRenderer) { if (pressed) { - shapeRenderer.line(this.anchor, SagittariusGame.worldCursor); + shapeRenderer.line(this.anchor, Sagittarius.worldCursor); if (aimAssist) { float[] traj = Arrow.traj(angle, power, shooter, 400, 0.05f); if (traj.length > 2) { diff --git a/core/src/sagittarius/model/Entity.java b/core/src/sagittarius/model/Entity.java deleted file mode 100644 index ed2a202..0000000 --- a/core/src/sagittarius/model/Entity.java +++ /dev/null @@ -1,37 +0,0 @@ -package sagittarius.model; - -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.math.Vector2; - -abstract class Entity { - -// ---------- ATTRIBUTEs ---------- - - protected Vector2 position; - - protected float mass = 1.0f; - protected float angle; - protected Color color = Color.WHITE; - -// ---------- CONSTRUCTORs ---------- - - // TODO : reorganize all constructors - - protected Entity(Vector2 position, float mass) { - this.position = position.cpy(); - this.mass = mass; - } - -// ---------- METHODs ---------- - - /** - * Returns the euclidian distance to another entity. - * - * @param entity the other Entity whose distance we wish to evaluate. - * @return distance to Entity. - */ - float distanceTo(Entity entity) { - return this.position.cpy().sub(entity.position).len(); - } - -} diff --git a/core/src/sagittarius/model/Planet.java b/core/src/sagittarius/model/Planet.java index 341e42b..9682143 100644 --- a/core/src/sagittarius/model/Planet.java +++ b/core/src/sagittarius/model/Planet.java @@ -11,7 +11,7 @@ public class Planet extends Actor { // ---------- ATTRIBUTEs ---------- - private BitmapFont fontDebug; + private BitmapFont fontDebug = new BitmapFont(); private float radius; private float mass; @@ -48,6 +48,4 @@ public class Planet extends Actor { return this.radius; } - - } diff --git a/core/src/sagittarius/model/Player.java b/core/src/sagittarius/model/Player.java index e04f645..61c5267 100644 --- a/core/src/sagittarius/model/Player.java +++ b/core/src/sagittarius/model/Player.java @@ -1,13 +1,10 @@ package sagittarius.model; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; public class Player extends Actor { @@ -16,7 +13,7 @@ public class Player extends Actor { private Planet home; private Bow bow; - private BitmapFont fontDebug; + private BitmapFont fontDebug = new BitmapFont(); // ---------- CONSTRUCTORs ---------- @@ -27,7 +24,7 @@ public class Player extends Actor { this.setColor(color); this.setOrigin(25, 50); this.home = home; - this.bow = new Bow(this, true); + //this.bow = new Bow(this, true); } // ---------- METHODs ---------- @@ -50,7 +47,7 @@ public class Player extends Actor { this.setX(home.getX() + this.home.getRadius()*MathUtils.cosDeg(this.getRotation())); this.setY(home.getY() + this.home.getRadius()*MathUtils.cosDeg(this.getRotation())); - this.bow.act(deltaTime); + //this.bow.act(deltaTime); } /** diff --git a/core/src/sagittarius/view/BaseGame.java b/core/src/sagittarius/view/BaseGame.java new file mode 100644 index 0000000..c9c4950 --- /dev/null +++ b/core/src/sagittarius/view/BaseGame.java @@ -0,0 +1,16 @@ +package sagittarius.view; + +import com.badlogic.gdx.Game; + +public abstract class BaseGame extends Game { + + private static BaseGame game; + + public BaseGame() { + game = this; + } + + public static void setActiveScreen(BaseScreen s) { + game.setScreen(s); + } +} \ No newline at end of file diff --git a/core/src/sagittarius/view/BaseScreen.java b/core/src/sagittarius/view/BaseScreen.java new file mode 100644 index 0000000..6f7e852 --- /dev/null +++ b/core/src/sagittarius/view/BaseScreen.java @@ -0,0 +1,52 @@ +package sagittarius.view; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.Screen; + +public abstract class BaseScreen implements Screen { + + protected Stage mainStage; + protected Stage uiStage; + + public BaseScreen() { + mainStage = new Stage(); + uiStage = new Stage(); + initialize(); + } + + public abstract void initialize(); + public abstract void update(float dt); + + @Override + public void render(float dt) { + + // update actors + uiStage.act(dt); + mainStage.act(dt); + + // update + update(dt); + + // clear screen + Gdx.gl.glClearColor(0,0,0,1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + // draw actors on screnn + mainStage.draw(); + uiStage.draw(); + } + + @Override public void dispose() { + uiStage.dispose(); + mainStage.dispose(); + } + + // methods required by Screen interface + @Override public void resize(int width, int height) {} + @Override public void pause() {} + @Override public void resume(){} + @Override public void show() {} + @Override public void hide() {} +} \ No newline at end of file diff --git a/core/src/sagittarius/view/GameScreen.java b/core/src/sagittarius/view/GameScreen.java index abc650f..fe72817 100644 --- a/core/src/sagittarius/view/GameScreen.java +++ b/core/src/sagittarius/view/GameScreen.java @@ -1,146 +1,38 @@ package sagittarius.view; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.ScreenAdapter; -import com.badlogic.gdx.graphics.Camera; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.graphics.glutils.ShapeRenderer; -import com.badlogic.gdx.utils.viewport.FitViewport; -import com.badlogic.gdx.utils.viewport.Viewport; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Stage; -class GameScreen extends ScreenAdapter { +import sagittarius.model.*; -// ---------- ATTRIBUTES ---------- +public class GameScreen extends BaseScreen { - // screen size - static final int WIDTH = 1920; - static final int HEIGHT = 1080; +// ---------- ATTRIBUTEs ---------- - // drawing stuff - private SpriteBatch batch; - private ShapeRenderer shapeRenderer; - private BitmapFont font; + // Constants + public static final int G = 100; - // camera stuff - static Viewport viewport; // TODO : useless ? - protected static Camera camera; +// ---------- METHODs ---------- - // TODO: categorize better ? - private HUD hud = new HUD(); + @Override + public void initialize() { -// ---------- METHODS ---------- + mainStage = new Stage(); + + Planet planet1 = new Planet(new Vector2(400, 400), 1000, 200, Color.WHITE); + planet1.setDebug(true); + mainStage.addActor(planet1); - private void clearScreen() { - Gdx.gl.glClearColor(Color.BLACK.r, Color.BLACK.g, Color.BLACK.b, Color.BLACK.a); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - } - - private void update(float deltaTime) { - SagittariusGame.update(deltaTime); - hud.update(); - camera.position.set(WIDTH / 2, HEIGHT / 2, 0); - camera.update(); + Player player1 = new Player(planet1, Color.WHITE); + player1.setDebug(true); + mainStage.addActor(player1); + } @Override - public void render(float deltaTime) { - - update(deltaTime); - - clearScreen(); - - // ---------- batch ---------- - batch.setProjectionMatrix(camera.projection); - batch.setTransformMatrix(camera.view); - batch.begin(); - - // planets - for (Planet planet : SagittariusGame.planetList) { - planet.renderDebug(batch, font); - } - - // moons - for (Moon moon : SagittariusGame.moonList) { - moon.renderDebug(batch, font); - } - - // players - for (Player player : SagittariusGame.playerList) { - player.renderDebug(batch, font); - } - - // arrows - for (Arrow arrow : SagittariusGame.arrowList) { - arrow.renderDebug(batch, font); - } - - batch.end(); - - // ---------- shapeRenderer ---------- - shapeRenderer.setProjectionMatrix(camera.combined); - shapeRenderer.begin(ShapeRenderer.ShapeType.Line); - - // planets - for (Planet planet : SagittariusGame.planetList) { - planet.render(shapeRenderer); - } - - // players - for (Player player : SagittariusGame.playerList) { - player.render(shapeRenderer); - } - - // arrows - for (Arrow arrow : SagittariusGame.arrowList) { - arrow.render(shapeRenderer); - } - - // moons - for (Moon moon : SagittariusGame.moonList) { - moon.render(shapeRenderer); - } - - // float[] vertices = {100, 100, 200, 200, 1000, 500}; - // shapeRenderer.polyline(vertices); - - shapeRenderer.end(); - - // HUD - hud.render(); - - } - - @Override - public void show() { - camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - camera.position.set(WIDTH / 2, HEIGHT / 2, 0); - camera.update(); - - viewport = new FitViewport(WIDTH, HEIGHT, camera); - - shapeRenderer = new ShapeRenderer(); - batch = new SpriteBatch(); - font = new BitmapFont(); - } - - @Override - public void resize(int width, int height) { - viewport.update(width, height); - camera.update(); - batch.setProjectionMatrix(camera.combined); - shapeRenderer.setProjectionMatrix(camera.combined); - hud.resize(); - } - - @Override - public void dispose() { - batch.dispose(); - font.dispose(); - shapeRenderer.dispose(); + public void update(float dt) { + // todo ? } } diff --git a/core/src/sagittarius/view/StartScreen.java b/core/src/sagittarius/view/StartScreen.java index d583bb2..2b834fa 100644 --- a/core/src/sagittarius/view/StartScreen.java +++ b/core/src/sagittarius/view/StartScreen.java @@ -1,46 +1,38 @@ package sagittarius.view; -import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.scenes.scene2d.InputEvent; -import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener; -import com.badlogic.gdx.utils.viewport.FitViewport; import com.kotcrab.vis.ui.VisUI; import com.kotcrab.vis.ui.widget.VisTable; import com.kotcrab.vis.ui.widget.VisTextButton; -public class StartScreen extends ScreenAdapter { +import sagittarius.SagittariusGame; - private static final float WORLD_WIDTH = 1600; - private static final float WORLD_HEIGHT = 900; +public class StartScreen extends BaseScreen { - private final Game game; - private Stage stage; + @Override + public void initialize() { - public StartScreen(Game game) { - this.game = game; - } - - public void show() { - stage = new Stage(new FitViewport(WORLD_WIDTH, WORLD_HEIGHT)); - Gdx.input.setInputProcessor(stage); + Gdx.input.setInputProcessor(mainStage); + // Table creation VisUI.load(); - VisTable root = new VisTable(true); - root.setFillParent(true); - stage.addActor(root); + VisTable table = new VisTable(true); + table.setFillParent(true); + mainStage.addActor(table); + // Start Button VisTextButton startButton = new VisTextButton("start"); startButton.addListener(new ActorGestureListener() { @Override public void tap(InputEvent event, float x, float y, int count, int button) { super.tap(event, x, y, count, button); - game.setScreen(new GameScreen()); + SagittariusGame.setActiveScreen( new GameScreen() ); } }); + // Quit button VisTextButton quitButton = new VisTextButton("quit"); quitButton.addListener(new ActorGestureListener() { @Override @@ -50,25 +42,25 @@ public class StartScreen extends ScreenAdapter { } }); - root.add(startButton); - root.row(); - root.add(quitButton); - root.row(); + // Table structure + table.add(startButton); + table.row(); + table.add(quitButton); + table.row(); + } + + @Override + public void update(float deltaTime) { + // } public void resize(int width, int height) { - stage.getViewport().update(width, height, true); - } - - public void render(float deltaTime) { - stage.act(deltaTime); - stage.draw(); + mainStage.getViewport().update(width, height, true); } @Override public void dispose() { VisUI.dispose(); - stage.dispose(); super.dispose(); }