package com.gebauz.burutaru.game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.gebauz.bauzoid.input.Input;
import com.gebauz.bauzoid.input.Input.Finger;
import com.gebauz.burutaru.GameConsts;
import com.gebauz.burutaru.game.entities.Ship;
import com.gebauz.burutaru.game.entities.VirtualPad;
public class ShipController
{
// Constants========================================================================================
public static final float MOVE_THRESHOLD = 20.0f
;
public static final float MOVE_THRESHOLD_SQR = MOVE_THRESHOLD
*MOVE_THRESHOLD
;
public static final float CHANGE_DIR_THRESHOLD = 10.0f
;
public static final float CHANGE_DIR_THRESHOLD_SQR = CHANGE_DIR_THRESHOLD
*CHANGE_DIR_THRESHOLD
;
public static final float MOVE_SPEED = 100.0f
;
public static final float AUTO_FIRE_INTERVAL = 0.2f
;
// Embedded Types===================================================================================
enum MoveState
{
NOT_MOVING,
TOUCHED_NOT_MOVING,
TOUCHED_MOVING
}
// Fields===========================================================================================
private GameLogic mGameLogic =
null;
private Ship mShip =
null;
private VirtualPad mVirtualPad =
null;
private float mStartX =
0;
private float mStartY =
0;
private float mCurrentMoveX =
0;
private float mCurrentMoveY =
0;
private int mMoveFingerId = -
1;
private MoveState mMoveState = MoveState.
NOT_MOVING;
private float mAutoFireTimer = 0.0f
;
private boolean mShootKeyPressed =
false;
private float mMoveX = 0.0f
;
private float mMoveY = 0.0f
;
// Methods==========================================================================================
public ShipController
(GameLogic gameLogic
)
{
mGameLogic = gameLogic
;
mShip = gameLogic.
getShip();
mVirtualPad = gameLogic.
getVirtualPad();
}
public void handleInput
(float deltaTime
)
{
mVirtualPad.
setVisible(false);
mMoveX = 0.0f
;
mMoveY = 0.0f
;
Input input = mShip.
getInput();
mShip.
resetNoUpDownMovement();
//Finger finger = input.getFinger(0);
Finger finger = input.
getFingerInsideVirtual(0,
0, GameConsts.
VIRTUAL_SCREEN_WIDTH/
2, GameConsts.
VIRTUAL_SCREEN_HEIGHT);
if (finger
!=
null)
{
handleMovement
(finger, deltaTime
);
}
else
{
// finger released
mMoveState = MoveState.
NOT_MOVING;
mMoveFingerId = -
1;
mVirtualPad.
setVisible(false);
}
finger = input.
getFingerInsideVirtual(GameConsts.
VIRTUAL_SCREEN_WIDTH/
2,
0, GameConsts.
VIRTUAL_SCREEN_WIDTH, GameConsts.
VIRTUAL_SCREEN_HEIGHT);
if (finger
!=
null)
{
if (finger.
isJustTouched())
{
mShip.
shoot();
mAutoFireTimer =
0;
}
else if (finger.
isTouched())
{
mAutoFireTimer += deltaTime
;
if (mAutoFireTimer
> AUTO_FIRE_INTERVAL
)
{
mAutoFireTimer -= AUTO_FIRE_INTERVAL
;
mShip.
shoot();
}
}
}
handleKeys
(deltaTime
);
// modify move speed by speed up levels
mMoveX = mGameLogic.
getShipParameters().
modifySpeed(mMoveX
);
mMoveY = mGameLogic.
getShipParameters().
modifySpeed(mMoveY
);
mShip.
moveBy(mMoveX, mMoveY, deltaTime
);
}
public void handleKeys
(float deltaTime
)
{
//float dx = 0.0f;
//float dy = 0.0f;
if (Gdx.
input.
isKeyPressed(Keys.
D))
{
mMoveX += MOVE_SPEED
;
//dx += MOVE_SPEED;
}
if (Gdx.
input.
isKeyPressed(Keys.
A))
{
mMoveX -= MOVE_SPEED
;
//dx -= MOVE_SPEED;
}
if (Gdx.
input.
isKeyPressed(Keys.
S))
{
mMoveY += MOVE_SPEED
;
//dy += MOVE_SPEED;
}
if (Gdx.
input.
isKeyPressed(Keys.
W))
{
mMoveY -= MOVE_SPEED
;
//dy -= MOVE_SPEED;
}
//if ((dx != 0.0f) || (dy != 0.0f))
//mShip.moveBy(dx, dy, deltaTime);
if (Gdx.
input.
isKeyPressed(Keys.
SPACE) || Gdx.
input.
isKeyPressed(Keys.
CONTROL_RIGHT))
{
if (!mShootKeyPressed
)
{
mShootKeyPressed =
true;
mShip.
shoot();
mAutoFireTimer = 0.0f
;
}
else
{
mAutoFireTimer += deltaTime
;
if (mAutoFireTimer
> AUTO_FIRE_INTERVAL
)
{
mAutoFireTimer -= AUTO_FIRE_INTERVAL
;
mShip.
shoot();
}
}
}
else
{
mShootKeyPressed =
false;
}
}
public void performMove
(float deltaTime
)
{
// get direction and normalize
float dx = mCurrentMoveX - mStartX
;
float dy = mCurrentMoveY - mStartY
;
float length =
(float)Math.
sqrt(dx
*dx + dy
*dy
);
dx /= length
;
dy /= length
;
//mShip.moveBy(dx * MOVE_SPEED, dy * MOVE_SPEED, deltaTime);
mMoveX += dx
* MOVE_SPEED
;
mMoveY += dy
* MOVE_SPEED
;
}
private void handleMovement
(Finger finger,
float deltaTime
)
{
switch(mMoveState
)
{
case NOT_MOVING:
if (finger.
isJustTouched())
{
mStartX = finger.
getVirtualX();
mStartY = finger.
getVirtualY();
mMoveState = MoveState.
TOUCHED_NOT_MOVING;
mMoveFingerId = finger.
getIndex();
mVirtualPad.
setVisible(true);
mVirtualPad.
setPositions(mStartX, mStartY, mStartX, mStartY
);
//Gdx.app.log(GameConsts.LOG_TAG, "NOT_MOVING->TOUCHED_NOT_MOVING");
}
break;
case TOUCHED_NOT_MOVING:
if (finger.
isTouched() && (finger.
getIndex() == mMoveFingerId
))
{
float x = finger.
getVirtualX();
float y = finger.
getVirtualY();
mVirtualPad.
setVisible(true);
mVirtualPad.
setPositions(mStartX, mStartY, x, y
);
if (checkMoveThreshold
(x, y
))
{
mCurrentMoveX = x
;
mCurrentMoveY = y
;
mMoveState = MoveState.
TOUCHED_MOVING;
//Gdx.app.log(GameConsts.LOG_TAG, "TOUCHED_NOT_MOVING->TOUCHED_MOVING");
}
}
break;
case TOUCHED_MOVING:
if (finger.
isTouched() && (finger.
getIndex() == mMoveFingerId
))
{
performMove
(deltaTime
);
float x = finger.
getVirtualX();
float y = finger.
getVirtualY();
mVirtualPad.
setVisible(true);
mVirtualPad.
setPositions(mStartX, mStartY, x, y
);
if (checkChangeDirThreshold
(x, y
))
{
mStartX = mCurrentMoveX
;
mStartY = mCurrentMoveY
;
mCurrentMoveX = x
;
mCurrentMoveY = y
;
}
}
break;
}
/* if (finger.isJustReleased())
{
//Gdx.app.log(GameConsts.LOG_TAG, "*->NOT_MOVING");
}*/
}
private boolean checkMoveThreshold
(float x,
float y
)
{
float dx = x - mStartX
;
float dy = y - mStartY
;
float d = dx
*dx + dy
*dy
;
return (d
> MOVE_THRESHOLD_SQR
);
}
private boolean checkChangeDirThreshold
(float x,
float y
)
{
float dx = x - mCurrentMoveX
;
float dy = y - mCurrentMoveY
;
float d = dx
*dx + dy
*dy
;
return (d
> CHANGE_DIR_THRESHOLD_SQR
);
}
// Getters/Setters==================================================================================
}