/*******************************************************************************
* Copyright 2013 Pawel Pastuszak
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package pl.kotcrab.gdxcombat;
import pl.kotcrab.gdxcombat.arenas.AbstractArena;
import pl.kotcrab.gdxcombat.core.AbstractScene;
import pl.kotcrab.gdxcombat.core.AnimationUtils;
import pl.kotcrab.gdxcombat.core.Touch;
import pl.kotcrab.gdxcombat.fighters.AbstractFighter;
import pl.kotcrab.gdxcombat.fighters.ai.RandomBot;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.World;
public class GameScene extends AbstractScene {
private AbstractArena arena;
private AbstractFighter player;
private AbstractFighter enemy;
private World world;
private OrthographicCamera camera;
private SpriteBatch hudBatch;
private static int GAMETIME = 99;
private int time;
private long startTime;
private boolean gameover = false;
private Animation fightTextAnim;
private Animation nameWinsAnim;
private int nameWinAnimRenderX;
private float stateTime;
// Debug box2d
private boolean box2dDebug = false;
private Box2DDebugRenderer debugRenderer;
private Matrix4 box2dRenderMatrix;
public GameScene(AbstractArena arena, AbstractFighter player, AbstractFighter enemy) {
this.arena = arena;
this.player = player;
this.enemy = enemy;
world = new World(new Vector2(0, -20), true);
camera = Touch.getCamera();
Matrix4 hudMatrix = new Matrix4();
hudMatrix.setToOrtho2D(0, 0, 480, 320);
hudBatch = new SpriteBatch();
hudBatch.setProjectionMatrix(hudMatrix);
fightTextAnim = new Animation(0.03f, AnimationUtils.loadAnim(Assets.getTextureAtlas(), "fight", 21));
startTime = System.currentTimeMillis();
player.setPosition(30, 150 - player.getHeight());
enemy.setPosition(350, 150 - enemy.getHeight());
player.setGroundLevel(arena.getGroundLevel());
enemy.setGroundLevel(arena.getGroundLevel());
player.setOponent(enemy);
enemy.setOponent(player);
enemy.initAi(new RandomBot());
arena.initPhys(world);
player.initPhys(world);
enemy.initPhys(world);
createHUD();
debugRenderer = new Box2DDebugRenderer();
box2dRenderMatrix = new Matrix4();
Assets.fight.play();
}
private HealthBar playerHealthBar;
private HealthBar enemyHealthBar;
private void createHUD() {
playerHealthBar = new HealthBar(Assets.getTextureRegion("healthbar_full"), Assets.getTextureRegion("healthbar_bg"), Assets.getTextureRegion(player.getName()), 100, 300, false);
enemyHealthBar = new HealthBar(Assets.getTextureRegion("healthbar_full"), Assets.getTextureRegion("healthbar_bg"), Assets.getTextureRegion(enemy.getName()), 375, 300, true);
}
@Override
public void update() {
stateTime += Gdx.graphics.getDeltaTime();
if (box2dDebug) {
box2dRenderMatrix.set(camera.combined);
box2dRenderMatrix.scale(10, 10, 0);
}
camera.position.x = player.getX() + 180;
if (camera.position.x < -200)
camera.position.x = -200;
if (camera.position.x > 440)
camera.position.x = 440;
arena.update();
player.update();
enemy.update();
if (!gameover) {
playerHealthBar.setPercent(player.getHealth());
enemyHealthBar.setPercent(enemy.getHealth());
time = GAMETIME - (int) ((System.currentTimeMillis() - startTime) / 1000);
}
if (time == 0 && !gameover) {
gameover = true;
if (player.getHealth() == enemy.getHealth()) {
createWinsText("draw");
return;
}
if (player.getHealth() > enemy.getHealth())
playerWins();
else
enemyWins();
}
if (player.getHealth() <= 0 && !gameover) {
enemyWins();
}
if (enemy.getHealth() <= 0 && !gameover) {
playerWins();
}
}
private void enemyWins() {
gameover = true;
createWinsText(enemy.getName() + "wins");
enemy.getWinsSound().play();
}
private void playerWins() {
gameover = true;
createWinsText(player.getName() + "wins");
player.getWinsSound().play();
}
private void createWinsText(String animNane) {
nameWinsAnim = new Animation(0.1f, AnimationUtils.loadAnim(Assets.getTextureAtlas(), animNane, 2));
nameWinsAnim.setPlayMode(Animation.LOOP);
nameWinAnimRenderX = (480 - nameWinsAnim.getKeyFrame(0).getRegionWidth()) / 2;
}
@Override
public void render(SpriteBatch batch) {
batch.begin();
arena.render(batch);
player.render(batch);
enemy.render(batch);
world.step(1 / 60f, 6, 2); // przy box2d lepiej zrobic krok po wyrenderowaniu wszystkiego
batch.end();
if (box2dDebug) {
debugRenderer.render(world, box2dRenderMatrix);
}
hudBatch.begin(); // HUD
if (!fightTextAnim.isAnimationFinished(stateTime))
hudBatch.draw(fightTextAnim.getKeyFrame(stateTime), 165, 220);
if (gameover)
hudBatch.draw(nameWinsAnim.getKeyFrame(stateTime), nameWinAnimRenderX, 240);
playerHealthBar.draw(hudBatch);
enemyHealthBar.draw(hudBatch);
Assets.timerFont.draw(hudBatch, Integer.toString(time), 228, 325);
hudBatch.end();
}
@Override
public void dispose() {
arena.dispose();
player.dispose();
enemy.dispose();
world.dispose();
}
@Override
public boolean keyDown(int key) {
if (!gameover)
player.keyDown(key);
if (key == Keys.F12)
box2dDebug = !box2dDebug;
return false;
}
@Override
public boolean keyUp(int key) {
if (!gameover)
player.keyUp(key);
return false;
}
}