diff --git a/frontend/assets/bullet.png b/frontend/assets/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3738673768d778c97c07c961024bc1de9788ce Binary files /dev/null and b/frontend/assets/bullet.png differ diff --git a/frontend/core/src/com/game/tankwars/controller/GameController.java b/frontend/core/src/com/game/tankwars/controller/GameController.java index 78b7051e1c2ca304cc7b27635e5571f066b24672..d5625eff6c193fc24c7a7e63385db0bf91dd1244 100644 --- a/frontend/core/src/com/game/tankwars/controller/GameController.java +++ b/frontend/core/src/com/game/tankwars/controller/GameController.java @@ -2,9 +2,14 @@ package com.game.tankwars.controller; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.game.tankwars.TankWarsGame; import com.game.tankwars.model.Bullet; @@ -20,21 +25,27 @@ public class GameController { private Tank tank; private Bullet bullet; + private Vector3 touchPos; private boolean moveRightTouched; private boolean moveLeftTouched; + private boolean aimUpTouched; + private boolean aimDownTouched; + + public GameController(Tank tank, TankWarsGame tankWarsGame, GameHud hud) { this.hud = hud; this.tank = tank; this.tankWarsGame = tankWarsGame; + this.touchPos = new Vector3(); } public void checkKeyInput(Tank tank){ - if(Gdx.input.isKeyPressed(Input.Keys.Q)) { + if(aimUpTouched) { tank.rotateCannonLeft(); } - else if (Gdx.input.isKeyPressed(Input.Keys.E)) { + else if (aimDownTouched) { tank.rotateCannonRight(); } @@ -50,7 +61,8 @@ public class GameController { hud.getFireButton().addListener(new ChangeListener() { public void changed (ChangeEvent event, Actor actor) { bullet = new Bullet(tank); - bullet.shoot(); + float power = hud.getPowerSlider().getValue(); + bullet.shoot(power); //actor.setTouchable(Touchable.disabled); // TODO: send turn to server + enable touchable when it is players turn endPlayerTurn(); @@ -61,7 +73,7 @@ public class GameController { @Override public void changed(ChangeEvent event, Actor actor) { - System.out.println(hud.getPowerSlider().getValue()); + //System.out.println(hud.getPowerSlider().getValue()); tank.setPower(Math.round(hud.getPowerSlider().getValue())); } }); @@ -79,6 +91,37 @@ public class GameController { } }); + hud.getAimUp().addListener(new InputListener() { + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + System.out.println("Aim up start"); + aimUpTouched = true; + return true; + } + + @Override + public void touchUp(InputEvent event, float x, float y, int pointer, int button) { + System.out.println("Aim up stop"); + aimUpTouched = false; + } + }); + + hud.getAimDown().addListener(new InputListener() { + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + System.out.println("Aim down start"); + aimDownTouched = true; + return true; + } + + @Override + public void touchUp(InputEvent event, float x, float y, int pointer, int button) { + System.out.println("Aim down stop"); + aimDownTouched = false; + } + }); + + hud.getMoveRight().addListener(new InputListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { @@ -94,12 +137,23 @@ public class GameController { }); + + } + public boolean endPlayerTurn() { - System.out.println(tank.getPower()); - System.out.println(tank.getPosition()); + //System.out.println(tank.getPower()); + //System.out.println(tank.getPosition()); // end turn for player and send data to server return true; } + + public Bullet getBullet() { + if (bullet != null) { + return bullet; + } + return null; + } + } diff --git a/frontend/core/src/com/game/tankwars/model/Bullet.java b/frontend/core/src/com/game/tankwars/model/Bullet.java index 70fe72fc1da4f94551be6fd26c4daaae0de24972..23dd7c38a2a004c34c0c892f65864430807365ae 100644 --- a/frontend/core/src/com/game/tankwars/model/Bullet.java +++ b/frontend/core/src/com/game/tankwars/model/Bullet.java @@ -1,49 +1,87 @@ package com.game.tankwars.model; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.CircleShape; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.physics.box2d.World; +import com.game.tankwars.TankWarsGame; public class Bullet { - - BodyDef bodyDef = new BodyDef(); - FixtureDef fixtureDef = new FixtureDef(); - World world; - Body body; - Tank tank; + private static final Vector2 IMPULSE = new Vector2(0.7f, 0.8f); + private BodyDef bodyDef = new BodyDef(); + private FixtureDef fixtureDef = new FixtureDef(); + private World world; + private Body body; + private Tank tank; private Vector2 position; + private Sprite bulletSprite; + + private float angle; + public Bullet(Tank tank) { this.tank = tank; - //this.position = new Vector2(tank.getPosition().add(0, 1f)); + this.angle = tank.getCannonAngle(); world = Box2dWorld.getWorld(); bodyDef.type = BodyDef.BodyType.DynamicBody; - bodyDef.position.set(new Vector2(tank.getPosition().add(0, 1f))); + bodyDef.position.set(new Vector2(tank.getCannonPosition().add(Tank.CANNON_WIDTH + 1, Tank.CANNON_HEIGHT + 1))); body = world.createBody(bodyDef); CircleShape shape = new CircleShape(); shape.setRadius(0.1f); fixtureDef.shape = shape; fixtureDef.density = 0.5f; - fixtureDef.restitution = 0.6f; - fixtureDef.friction = 0.4f; + fixtureDef.restitution = 0.0f; + fixtureDef.friction = 1f; body.createFixture(fixtureDef); + shape.dispose(); + bulletSprite = new Sprite(new Texture("bullet.png")); + bulletSprite.setScale(0.5f); + body.setUserData(bulletSprite); + + position = new Vector2(body.getPosition()); } - public void shoot() { + public void shoot(float power) { + Vector2 impulsePower = calculatePower(power); body.applyLinearImpulse( - 0.2f, - 0.3f, - new Vector2(tank.getPosition()).x-1, - new Vector2(tank.getPosition()).y-2, + impulsePower.x, + impulsePower.y, + position.x, + position.y, false); } + private Vector2 calculatePower(float power) { + + float scale = power / 100; + double radAngle = (angle * MathUtils.degRad) - (Math.PI / 2); + float impulseX = IMPULSE.x * (float) Math.cos(radAngle); + float impulseY = IMPULSE.y * (float) Math.sin(radAngle); + + Vector2 impulse = new Vector2(impulseX, impulseY).scl(scale); + return impulse; + } + + public Sprite getBulletSprite() { return bulletSprite; } + + + public void removeBullet() { + world.destroyBody(body); + bulletSprite.getTexture().dispose(); + } + + public Body getBody() { return body; } + + + } diff --git a/frontend/core/src/com/game/tankwars/model/Tank.java b/frontend/core/src/com/game/tankwars/model/Tank.java index 41236a44780eddebace7003c89c0f97de416d9af..6ed7c6d5990ac24705ebf81e4dd4cedaeb24016a 100644 --- a/frontend/core/src/com/game/tankwars/model/Tank.java +++ b/frontend/core/src/com/game/tankwars/model/Tank.java @@ -3,8 +3,10 @@ package com.game.tankwars.model; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.FixtureDef; @@ -71,6 +73,8 @@ public class Tank { PolygonShape shape = new PolygonShape(); shape.setAsBox(TANK_WIDTH, TANK_HEIGHT); fixtureDef.shape = shape; + fixtureDef.isSensor = true; + cannonPosition = new Vector2(bodyDef.position.add(1, -1)); //Chassis chassis = world.createBody(bodyDef); @@ -80,11 +84,15 @@ public class Tank { //Cannon shape.setAsBox(CANNON_WIDTH, CANNON_HEIGHT); + FixtureDef canonFixture = new FixtureDef(); + canonFixture.shape = shape; + canonFixture.isSensor = true; + bodyDef.position.set(cannonPosition); cannonSprite.setOrigin(1, cannonSprite.getHeight()/2); cannon = world.createBody(bodyDef); cannon.setUserData(cannonSprite); - + cannon.createFixture(canonFixture); shape.dispose(); updateCannonPos(); moveLeft(); @@ -151,6 +159,7 @@ public class Tank { Vector2 chassisPos = chassis.getPosition(); chassisPos.add(0, 0.35f); cannon.setTransform(chassisPos, cannon.getAngle()); + cannonPosition.set(cannon.getPosition()); } public void rotateCannonRight(){ @@ -202,5 +211,7 @@ public class Tank { } public void setCannonTexture(Texture texture) { this.cannonTexture = texture; + } + } diff --git a/frontend/core/src/com/game/tankwars/view/GameHud.java b/frontend/core/src/com/game/tankwars/view/GameHud.java index 634dab2dc3094b246758616f5fb906251a9610d8..2d2974bc41d5292ec6b0a19540150bf9e92ecc81 100644 --- a/frontend/core/src/com/game/tankwars/view/GameHud.java +++ b/frontend/core/src/com/game/tankwars/view/GameHud.java @@ -1,6 +1,7 @@ package com.game.tankwars.view; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Button; @@ -38,7 +39,11 @@ public class GameHud { private Button moveLeft; private Button moveRight; + + private Button aimUp; + private Button aimDown; private HorizontalGroup moveContainer; + private HorizontalGroup aimContainer; public GameHud(Viewport viewport, SpriteBatch batch) { this.viewport = viewport; @@ -86,7 +91,23 @@ public class GameHud { moveContainer.addActor(moveLeft); moveContainer.addActor(moveRight); + + aimUp = new Button(skin.get("move-right", Button.ButtonStyle.class)); + aimDown = new Button(skin.get("move-left", Button.ButtonStyle.class)); + aimUp.setTransform(true); + aimDown.setTransform(true); + aimUp.setOrigin(aimUp.getWidth() / 2, aimUp.getHeight() / 2); + aimUp.setRotation(90); + aimDown.setOrigin(aimDown.getWidth() / 2, aimDown.getHeight() / 2); + aimDown.setRotation(90); + + aimContainer = new HorizontalGroup().space(10); + moveContainer.addActor(aimUp); + moveContainer.addActor(aimDown); + + table.add(moveContainer).expand().bottom().right().padBottom(10).padRight(10); + table.add(aimContainer).expand().bottom().padBottom(10); } @@ -118,6 +139,10 @@ public class GameHud { return moveRight; } + public Button getAimUp() { return aimUp; } + + public Button getAimDown() { return aimDown; } + /** * Set visible health of player * @param health new health of player diff --git a/frontend/core/src/com/game/tankwars/view/GameScreen.java b/frontend/core/src/com/game/tankwars/view/GameScreen.java index 5f52edb7565c25c0226c12e830463de393343db7..fa81a9ebb9f1154883e4a368c7131f0f709ade48 100644 --- a/frontend/core/src/com/game/tankwars/view/GameScreen.java +++ b/frontend/core/src/com/game/tankwars/view/GameScreen.java @@ -47,6 +47,8 @@ public class GameScreen implements Screen { Box2DDebugRenderer debugRenderer; GameController controller; + private Bullet bullet; + public GameScreen(final TankWarsGame tankWarsGame){ this.tankWarsGame = tankWarsGame; @@ -109,9 +111,12 @@ public class GameScreen implements Screen { controller.checkKeyInput(myTank); + //controller.handleTouchInput(worldCam); + Array<Body> bodies = new Array<Body>(); world.getBodies(bodies); + //Rendering Bullet bodies for (Body b : bodies) { Sprite s = (Sprite) b.getUserData(); @@ -137,12 +142,15 @@ public class GameScreen implements Screen { } } } - shapeRender.begin(ShapeRenderer.ShapeType.Filled); terrain.draw(shapeRender); shapeRender.end(); + updateBullet(); batch.begin(); + if (bullet != (null)) { + bullet.getBulletSprite().draw(batch); + } myTank.getChassisSprite().draw(batch); myTank.getCannonSprite().draw(batch); opponentTank.getChassisSprite().draw(batch); @@ -189,4 +197,11 @@ public class GameScreen implements Screen { private float scale(float value) { return value / TankWarsGame.SCALE; } + + private void updateBullet() { + Bullet bullet = controller.getBullet(); + if (bullet != (null)) { + this.bullet = bullet; + } + } }