From 3c921531d8b703e5ae3fc7da01dd2395b274c864 Mon Sep 17 00:00:00 2001 From: "janetho@stud.ntnu.no" <janeinartho@gmail.com> Date: Sun, 26 Mar 2023 19:42:41 +0200 Subject: [PATCH] #26 Added terrain rendering --- .../tankwars/controller/GameController.java | 3 +- .../src/com/game/tankwars/model/Bullet.java | 16 +++++----- .../src/com/game/tankwars/model/Tank.java | 22 +++++++------- .../src/com/game/tankwars/model/Terrain.java | 29 +++++++++++++++++-- .../com/game/tankwars/view/GameScreen.java | 21 ++++++++++---- 5 files changed, 63 insertions(+), 28 deletions(-) diff --git a/frontend/core/src/com/game/tankwars/controller/GameController.java b/frontend/core/src/com/game/tankwars/controller/GameController.java index 81849c9..b085ce2 100644 --- a/frontend/core/src/com/game/tankwars/controller/GameController.java +++ b/frontend/core/src/com/game/tankwars/controller/GameController.java @@ -6,6 +6,8 @@ import com.game.tankwars.TankWarsGame; import com.game.tankwars.model.Bullet; import com.game.tankwars.model.Tank; +import java.util.Arrays; + public class GameController { TankWarsGame tankWarsGame; Tank tank; @@ -32,7 +34,6 @@ public class GameController { if(Gdx.input.justTouched()) { bullet = new Bullet(tank); - System.out.println(tank.getPosition()); bullet.shoot(); } } diff --git a/frontend/core/src/com/game/tankwars/model/Bullet.java b/frontend/core/src/com/game/tankwars/model/Bullet.java index 8bb9d78..70fe72f 100644 --- a/frontend/core/src/com/game/tankwars/model/Bullet.java +++ b/frontend/core/src/com/game/tankwars/model/Bullet.java @@ -12,19 +12,17 @@ public class Bullet { BodyDef bodyDef = new BodyDef(); FixtureDef fixtureDef = new FixtureDef(); - World world; Body body; Tank tank; - Vector2 position; + private Vector2 position; public Bullet(Tank tank) { - this.position = tank.getPosition(); - position.y += 0.5f; this.tank = tank; + //this.position = new Vector2(tank.getPosition().add(0, 1f)); world = Box2dWorld.getWorld(); bodyDef.type = BodyDef.BodyType.DynamicBody; - bodyDef.position.set(this.position); + bodyDef.position.set(new Vector2(tank.getPosition().add(0, 1f))); body = world.createBody(bodyDef); CircleShape shape = new CircleShape(); @@ -40,8 +38,12 @@ public class Bullet { } public void shoot() { - body.applyLinearImpulse(0.4f, 0.3f, position.x-1, position.y-2, true); - System.out.println(this.position); + body.applyLinearImpulse( + 0.2f, + 0.3f, + new Vector2(tank.getPosition()).x-1, + new Vector2(tank.getPosition()).y-2, + false); } } diff --git a/frontend/core/src/com/game/tankwars/model/Tank.java b/frontend/core/src/com/game/tankwars/model/Tank.java index 95418f5..fb2a7ed 100644 --- a/frontend/core/src/com/game/tankwars/model/Tank.java +++ b/frontend/core/src/com/game/tankwars/model/Tank.java @@ -22,6 +22,7 @@ public class Tank { int VIEWPORT_WIDTH; int VIEWPORT_HEIGHT; private Vector2 position; + private Vector2 cannonPosition; private Rectangle bounds; private Texture chassisTexture; private Texture cannonTexture; @@ -34,7 +35,7 @@ public class Tank { FixtureDef fixtureDef = new FixtureDef(); RevoluteJoint joint; Terrain terrain; - Vector2[] vertices; + private Vector2[] vertices; int posInVertArr; float cannonAngle = 90; @@ -78,19 +79,18 @@ public class Tank { cannon = world.createBody(bodyDef); cannon.setUserData(cannonSprite); - shape.dispose(); } public void moveRight() { - Vector2 curPos = vertices[posInVertArr]; - Vector2 newPos = vertices[posInVertArr + 1]; + Vector2 curPos = new Vector2(vertices[posInVertArr]); + Vector2 newPos = new Vector2(vertices[posInVertArr + 1]); float angle = new Vector2(newPos.x - curPos.x, newPos.y - curPos.y).angleRad(); if (chassis.getPosition().x <= VIEWPORT_WIDTH - TANK_WIDTH){ + setPosition(newPos); chassis.setTransform(newPos.x, newPos.y + 0.11f, angle); chassisSprite.setRotation(angle); - position.set(newPos); updateCannonPos(); posInVertArr++; } @@ -100,14 +100,14 @@ public class Tank { } public void moveLeft() { - Vector2 curPos = vertices[posInVertArr]; - Vector2 newPos = vertices[posInVertArr - 1]; + Vector2 curPos = new Vector2(vertices[posInVertArr]); + Vector2 newPos = new Vector2(vertices[posInVertArr - 1]); float angle = new Vector2(newPos.x - curPos.x, newPos.y - curPos.y).angleRad(); if (chassis.getPosition().x >= TANK_WIDTH){ + setPosition(newPos); chassis.setTransform(newPos.x, newPos.y + 0.11f, angle); chassisSprite.setRotation(angle); - position.set(newPos); updateCannonPos(); posInVertArr--; } @@ -144,20 +144,18 @@ public class Tank { return cannonAngle; } public Vector2 getPosition() { - return position; + return new Vector2(position); } - + public Vector2 getCannonPosition(){ return new Vector2(cannonPosition); } public Rectangle getBounds() { return bounds; } - public Texture getChassisTexture() { return chassisTexture; } public Texture getCannonTexture() { return cannonTexture; } - public Sprite getChassisSprite() {return chassisSprite;} public Sprite getCannonSprite() {return cannonSprite;} diff --git a/frontend/core/src/com/game/tankwars/model/Terrain.java b/frontend/core/src/com/game/tankwars/model/Terrain.java index 860cb64..dcd5ff9 100644 --- a/frontend/core/src/com/game/tankwars/model/Terrain.java +++ b/frontend/core/src/com/game/tankwars/model/Terrain.java @@ -1,5 +1,12 @@ package com.game.tankwars.model; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Mesh; +import com.badlogic.gdx.graphics.VertexAttribute; +import com.badlogic.gdx.graphics.VertexAttributes; +import com.badlogic.gdx.graphics.glutils.ShaderProgram; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; @@ -15,7 +22,7 @@ public class Terrain { final Vector2[] vertices; Vector2 position; - public Terrain(){ + public Terrain() { float xStart = -5; float xEnd = 100; @@ -27,7 +34,7 @@ public class Terrain { this.world = Box2dWorld.getWorld(); BodyDef bodyDef = new BodyDef(); bodyDef.type = BodyDef.BodyType.StaticBody; - bodyDef.position.set(0,0); + vertices = new TerrainGenerator(xStart, xEnd, yMin, yMax, points).generateVertices(vertNumber); @@ -46,6 +53,22 @@ public class Terrain { } public Vector2[] getVertices() { - return vertices; + return this.vertices.clone(); + } + + public void draw(ShapeRenderer sp) { + sp.setColor(Color.GREEN); + + for (int i = 0; i < vertices.length-1; i++) { + sp.triangle(vertices[i].x, vertices[i].y, + vertices[i + 1].x, vertices[i + 1].y, + vertices[i].x, 0); + + sp.triangle(vertices[i + 1].x, vertices[i + 1].y, + vertices[i].x, 0, + vertices[i + 1].x, 0); + } } } + + diff --git a/frontend/core/src/com/game/tankwars/view/GameScreen.java b/frontend/core/src/com/game/tankwars/view/GameScreen.java index 878d5ba..83bcae5 100644 --- a/frontend/core/src/com/game/tankwars/view/GameScreen.java +++ b/frontend/core/src/com/game/tankwars/view/GameScreen.java @@ -4,11 +4,13 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.Mesh; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; @@ -29,6 +31,7 @@ public class GameScreen implements Screen { int horizontalScaling; int verticalScaling; SpriteBatch batch; + ShapeRenderer shapeRender; Tank tank; Box2dWorld model; World world; @@ -37,6 +40,7 @@ public class GameScreen implements Screen { Box2DDebugRenderer debugRenderer; Bullet bullet; GameController controller; + Mesh groundMesh; public GameScreen(final TankWarsGame tankWarsGame){ this.tankWarsGame = tankWarsGame; @@ -45,6 +49,7 @@ public class GameScreen implements Screen { VIEWPORT_WIDTH = tankWarsGame.getViewportWidth(); batch = new SpriteBatch(); + shapeRender = new ShapeRenderer(); model = new Box2dWorld(); world = Box2dWorld.getWorld(); cam = new OrthographicCamera(VIEWPORT_WIDTH, VIEWPORT_HEIGHT); @@ -64,9 +69,10 @@ public class GameScreen implements Screen { @Override public void render(float delta) { model.logicStep(Gdx.graphics.getDeltaTime()); - Gdx.gl.glClearColor(0f, 0f, 0f, 1); + Gdx.gl.glClearColor(0, 0, 100, 100); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); debugRenderer.render(world, cam.combined); + shapeRender.setProjectionMatrix(cam.combined); controller.checkKeyInput(); @@ -78,17 +84,21 @@ public class GameScreen implements Screen { Sprite s = (Sprite) b.getUserData(); if (s != null) { - s.setPosition(b.getPosition().x * (float) horizontalScaling - s.getWidth()/2 , b.getPosition().y * (float) verticalScaling); - if(s.equals(tank.getChassisSprite())){ + s.setPosition(b.getPosition().x * (float) horizontalScaling - s.getWidth() / 2, (b.getPosition().y + 0.25f) * (float) verticalScaling); + if (s.equals(tank.getChassisSprite())) { s.setRotation(tank.getAngle()); } - if(s.equals(tank.getCannonSprite())){ - s.setOrigin(s.getWidth()/2, 0); + if (s.equals(tank.getCannonSprite())) { + s.setOrigin(s.getWidth() / 2, 0); s.setRotation(tank.getCannonAngle()); } } } + shapeRender.begin(ShapeRenderer.ShapeType.Filled); + terrain.draw(shapeRender); + shapeRender.end(); + batch.begin(); tank.getChassisSprite().draw(batch); tank.getCannonSprite().draw(batch); @@ -124,5 +134,6 @@ public class GameScreen implements Screen { tank.getChassisTexture().dispose(); tank.getCannonTexture().dispose(); batch.dispose(); + shapeRender.dispose(); } } -- GitLab