package com.spaceshooter;
import com.badlogic.gdx.Application.ApplicationType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.ParticleEffect;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
//Player class.
public class Player extends Sprite {
public ParticleEffect particle;
public boolean isBlinking;
private float blinkTimer;
private Sprite playerSprite;
private boolean isDead;
private int weaponLevel;
private boolean hasMissile;
private float missileTimer;
private float bulletTimer;
private boolean hideHitbox;
private Sound shootSound;
private float hasMissileTimer; //when this reaches a peak, the player loses missile ability until the player acquires the powerup again.
private static final int MAX_LEVEL = 4;
private float levelTimer; //After some time, decrement the player's level to promote pick-ups.
Player(float x, float y,boolean justDied) {
super(ResourceManager.getAssetManager().get(ResourceManager.Hitbox,Texture.class));
playerSprite = new Sprite(ResourceManager.getAssetManager().get(ResourceManager.Player,Texture.class));
shootSound = ResourceManager.getAssetManager().get(ResourceManager.PlayerShootSound,Sound.class);
bulletTimer = 0f;
missileTimer = 0f;
levelTimer = 0f;
hasMissileTimer = 0f;
setOrigin(4,4);
setPosition(x, y);
Gdx.input.setCursorPosition((int)x, (int)y);
hideHitbox = false;
particle = ResourceManager.getAssetManager().get(ResourceManager.Thrusters,
ParticleEffect.class);
isDead = false;
weaponLevel = 1;
hasMissile = false;
if (justDied) {
blinkTimer = 0.50f;
isBlinking = true;
}
else {
blinkTimer = 0.0f;
isBlinking = false;
}
playerSprite.setPosition(getX()-27,getY()-10);
particle.setPosition(playerSprite.getX() + 30, playerSprite.getY() - 5);
}
public Sprite getShowSprite() {
return playerSprite;
}
public void update(BulletManager bulletManager) {
System.out.println("XPos: " + getX() + " YPos:" + getY());
if (getX() >= SpaceShooter.getRightBound())
setX(SpaceShooter.getRightBound());
else if (getY() >= SpaceShooter.getTopBound())
setY(SpaceShooter.getTopBound());
else if (getX() <= SpaceShooter.getLeftBound())
setX(SpaceShooter.getLeftBound());
else if (getY() <= SpaceShooter.getBottomBound())
setY(SpaceShooter.getBottomBound());
bulletTimer += Gdx.graphics.getDeltaTime() / 5;
if (weaponLevel > 1)
levelTimer += Gdx.graphics.getDeltaTime();
System.out.println(levelTimer);
if (hasMissile) {
missileTimer += Gdx.graphics.getDeltaTime() / 5;
hasMissileTimer += Gdx.graphics.getDeltaTime();
}
translate(Gdx.input.getDeltaX()*1.5f+(Gdx.graphics.getDeltaTime()),-Gdx.input.getDeltaY()*1.5f+(Gdx.graphics.getDeltaTime()));
if (Gdx.app.getType() == ApplicationType.Desktop) {
if (Gdx.input.isButtonPressed(Buttons.LEFT) && bulletTimer > 0.02f) {
shootSound.play(0.1f);
bulletManager.getList().add(new PlayerBullet(getX() - 20,getY(),0,600f,weaponLevel));
bulletManager.getList().add(new PlayerBullet(getX() + 25,getY(),0,600f,weaponLevel));
bulletTimer = 0.0f;
}
}
else if (Gdx.app.getType() == ApplicationType.Android) {
if (Gdx.input.isTouched() && bulletTimer > 0.04f) {
shootSound.play(0.1f);
bulletManager.getList().add(new PlayerBullet(getX() - 20,getY(),0,600f,weaponLevel));
bulletManager.getList().add(new PlayerBullet(getX() + 25,getY(),0,600f,weaponLevel));
bulletTimer = 0.0f;
}
}
if (hasMissileTimer > 10f) {
hasMissile = false;
hasMissileTimer = 0f;
}
if (levelTimer > 20f) {
decrementLevel();
}
if (missileTimer > 0.2f && hasMissile) {
bulletManager.getList().add(new PlayerMissile(getX() - 20,getY()));
bulletManager.getList().add(new PlayerMissile(getX() + 20,getY()));
bulletManager.getList().add(new PlayerMissile(getX() - 40,getY()));
bulletManager.getList().add(new PlayerMissile(getX() + 40,getY()));
missileTimer = 0f;
}
playerSprite.setPosition(getX()-27,getY()-10);
particle.setPosition(playerSprite.getX() + 30, playerSprite.getY() - 5);
if (blinkTimer > 0.0f && isBlinking) {
blinkTimer -= Gdx.graphics.getDeltaTime() / 5;
if (blinkTimer > 0.42f && blinkTimer < 0.50f) {
setColor(Color.CLEAR);
playerSprite.setColor(Color.CLEAR);
}
else if (blinkTimer > 0.17f && blinkTimer < 0.25f) {
setColor(Color.CLEAR);
playerSprite.setColor(Color.CLEAR);
}
else if (blinkTimer > 0.0f && blinkTimer < 0.08f) {
setColor(Color.CLEAR);
playerSprite.setColor(Color.CLEAR);
}
else {
setColor(Color.WHITE);
playerSprite.setColor(Color.WHITE);
}
if (blinkTimer <= 0.0f) {
blinkTimer = 0;
isBlinking = false;
}
}
if (!isBlinking) {
setColor(Color.WHITE);
playerSprite.setColor(Color.WHITE);
}
}
public void killPlayer() {
if (!isBlinking)
isDead = true;
}
public boolean isDead() {
return isDead;
}
public void decrementLevel() {
levelTimer = 0f;
weaponLevel--;
if (weaponLevel < 1)
weaponLevel = 1;
}
public void incrementLevel() {
levelTimer = 0f; //reset the level timer.
weaponLevel++;
if (weaponLevel > MAX_LEVEL)
weaponLevel = MAX_LEVEL;
}
public int getWeaponLevel() {
return weaponLevel;
}
public void giveMissile() {
hasMissile = true;
}
public void hideHitbox() {
hideHitbox = true;
}
public void draw(SpriteBatch batch) {
particle.draw(batch,Gdx.graphics.getDeltaTime());
playerSprite.draw(batch);
if (!hideHitbox)
super.draw(batch);
}
}