package com.igorcrevar.goingunder.objects.obstacles;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Rectangle;
import com.igorcrevar.goingunder.GameData;
import com.igorcrevar.goingunder.GameManager;
import com.igorcrevar.goingunder.ObstacleTypeEnum;
// Sizes for 800x480 385 x 49, 297 x 49, 190 x 49, 139 x 49, 68 x 49
// 0.845 , 1.69 , 2.2995 , 3.5 , 3.745 , 4.66
public class ObstacleObject {
private static final int MaxParts = 3;
private static final float DefaultYPos = 20000.0f;
private ObstacleTypeEnum obstacleType;
private Sprite[] partsObject;
private boolean doesPlayerPassObstacle;
private boolean isEnabled;
private IObstaclePool obstaclePool;
private int partsCount;
private float[] tmp = new float[MaxParts];
public ObstacleObject(IObstaclePool obstaclePool) {
this.obstaclePool = obstaclePool;
this.obstacleType = ObstacleTypeEnum.LeftHole;
this.partsObject = new Sprite[MaxParts];
for (int i = 0; i < MaxParts; ++i) {
this.partsObject[i] = new Sprite();
this.partsObject[i].setPosition(0.0f, DefaultYPos);
}
partsCount = 1;
this.setIsEnabled(false);
}
private void initOnePart(float posY, float cameraHalfWidth, float sizeY,
float emptySpaceSizeInTheMiddle, float emptySpaceSizeOnTheEnd) {
float availableWidth = 0.0f;
float posX = 0.0f;
switch (this.obstacleType) {
// case RightHole:
default:
availableWidth = cameraHalfWidth * 2 - emptySpaceSizeOnTheEnd;
posX = availableWidth / 2 - cameraHalfWidth;
break;
case LeftHole:
availableWidth = cameraHalfWidth * 2 - emptySpaceSizeOnTheEnd;
posX = availableWidth / 2 - cameraHalfWidth + emptySpaceSizeOnTheEnd;
break;
case LeftRightHoles:
availableWidth = (cameraHalfWidth - emptySpaceSizeOnTheEnd) * 2;
posX = availableWidth / 2 - cameraHalfWidth + emptySpaceSizeOnTheEnd;
break;
}
Sprite part = partsObject[0];
part.setSize(availableWidth, sizeY);
part.setPosition(posX - availableWidth / 2.0f, posY);
}
private void initMoreThanOnePart(float posY, float cameraHalfWidth,
float sizeY, float emptySpaceSizeInTheMiddle, float emptySpaceSizeOnTheEnd) {
float availableWidth = cameraHalfWidth * 2;
float[] width = tmp;
int widths = 0;
float size = 0.0f;
switch (obstacleType) {
//case LeftMiddleHole:
default:
size = (availableWidth / 2 - emptySpaceSizeInTheMiddle) / 2;
width[0] = size;
width[1] = availableWidth - emptySpaceSizeInTheMiddle - size;
widths = 2;
break;
case RightMiddleHole:
size = (availableWidth / 2 - emptySpaceSizeInTheMiddle) / 2;
width[0] = availableWidth - emptySpaceSizeInTheMiddle - size;
width[1] = size;
widths = 2;
break;
case MiddleHole:
size = (availableWidth - emptySpaceSizeInTheMiddle) / 2;
width[0] = size;
width[1] = size;
widths = 2;
break;
case LeftRightMiddleHoles:
size = (availableWidth / 2 - emptySpaceSizeInTheMiddle) / 2;
width[0] = size;
width[1] = availableWidth - 2 * emptySpaceSizeInTheMiddle - 2 * size;
width[2] = size;
widths = 3;
break;
case Left4Hole:
size = (availableWidth / 2 - emptySpaceSizeInTheMiddle) / 4;
width[0] = size;
width[1] = availableWidth - size - emptySpaceSizeInTheMiddle;
widths = 2;
break;
case Left4MiddleHole:
size = (availableWidth / 2 - emptySpaceSizeInTheMiddle) * 0.75f;
width[0] = size;
width[1] = availableWidth - size - emptySpaceSizeInTheMiddle;
widths = 2;
break;
case Right4Hole:
size = (availableWidth / 2 - emptySpaceSizeInTheMiddle) / 4;
width[0] = availableWidth - size - emptySpaceSizeInTheMiddle;
width[1] = size;
widths = 2;
break;
case Right4MiddleHole:
size = (availableWidth / 2 - emptySpaceSizeInTheMiddle) * 0.75f;
width[0] = availableWidth - size - emptySpaceSizeInTheMiddle;
width[1] = size;
widths = 2;
break;
}
float posX = -cameraHalfWidth;
for (int i = 0; i < widths; ++i) {
Sprite part = partsObject[i];
part.setSize(width[i], sizeY);
part.setPosition(posX, posY);
posX += emptySpaceSizeInTheMiddle + width[i];
}
}
public int getPartsCount() {
return partsCount;
}
private void initPartsCount() {
switch (obstacleType) {
case LeftHole: case RightHole: case LeftRightHoles:
partsCount = 1;
break;
case LeftRightMiddleHoles:
partsCount = 3;
break;
default:
//case MiddleHole: case LeftMiddleHole: case RightMiddleHole:
//case Left4Hole: case Right4Hole: case Left4MiddleHole: case Right4MiddleHole
partsCount = 2;
break;
}
}
public void init(ObstacleTypeEnum obstacleType, GameData gameData, GameManager gameManager) {
this.obstacleType = obstacleType;
this.initPartsCount();
float positionY = gameData.getCameraBottom() - gameData.ObstacleScaleY;
switch (partsCount) {
case 1:
initOnePart(positionY, gameData.CameraHalfWidth,
gameData.ObstacleScaleY,
gameData.EmptySpaceSizeInTheMiddle, gameData.EmptySpaceSizeOnTheEnd);
break;
default:
initMoreThanOnePart(positionY, gameData.CameraHalfWidth, gameData.ObstacleScaleY,
gameData.EmptySpaceSizeInTheMiddle, gameData.EmptySpaceSizeOnTheEnd);
break;
}
// init textures
for (int i = 0; i < partsCount; ++i) {
Sprite part = partsObject[i];
gameData.resolveObstacleTexture(part, gameManager);
}
// enable obstacle
this.setIsEnabled(true);
}
public void draw(SpriteBatch spriteBatch) {
for (int i = 0; i < partsCount; ++i) {
partsObject[i].draw(spriteBatch);
}
}
public boolean isEnabled() {
return isEnabled;
}
public void setIsEnabled(boolean value) {
if (!value) {
setYPosition(DefaultYPos);
// remove from visible obstacles pool
obstaclePool.removeFromVisibles(this);
}
isEnabled = value;
doesPlayerPassObstacle = false;
}
public float getBottom() {
Sprite part = partsObject[0];
return part.getY() - part.getHeight();
}
public boolean isPassed() {
return doesPlayerPassObstacle;
}
public void markAsPassed() {
doesPlayerPassObstacle = true;
}
public Rectangle getBoundRectangle(int i) {
return partsObject[i].getBoundingRectangle();
}
private void setYPosition(float y) {
for (int i = 0; i < partsCount; ++i) {
Sprite part = partsObject[i];
part.setY(y);
}
}
}