Subversion Repositories AndroidProjects

Rev

Rev 882 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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==================================================================================

}