Subversion Repositories AndroidProjects

Rev

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

package com.gebauz.burutaru.game;

import java.util.Vector;

import com.gebauz.bauzoid.game.Game;
import com.gebauz.bauzoid.game.GameObject;
import com.gebauz.bauzoid.game.entities.EntityManager;
import com.gebauz.bauzoid.graphics.renderstates.RenderStates;
import com.gebauz.bauzoid.graphics.sprite.SpriteTransform;
import com.gebauz.bauzoid.math.Matrix4;
import com.gebauz.bauzoid.math.collision.AABoundingBox;
import com.gebauz.burutaru.BurutaruCustomServices;
import com.gebauz.burutaru.GameConsts;
import com.gebauz.burutaru.game.entities.CollisionWorld;
import com.gebauz.burutaru.game.entities.Entity;
import com.gebauz.burutaru.game.entities.Hud;
import com.gebauz.burutaru.game.entities.IntroOutroTextDisplay;
import com.gebauz.burutaru.game.entities.LightManager;
import com.gebauz.burutaru.game.entities.PowerUps;
import com.gebauz.burutaru.game.entities.Ship;
import com.gebauz.burutaru.game.entities.StarField;
import com.gebauz.burutaru.game.entities.VirtualPad;
import com.gebauz.burutaru.game.entities.effects.Explosions;
import com.gebauz.burutaru.game.entities.effects.Lightning;
import com.gebauz.burutaru.game.entities.effects.WeaponsImpact;
import com.gebauz.burutaru.game.entities.enemies.BasicShots;
import com.gebauz.burutaru.game.entities.enemies.Enemy;
import com.gebauz.burutaru.game.entities.enemies.EnemyInstance;
import com.gebauz.burutaru.game.entities.enemies.LargeShots;
import com.gebauz.burutaru.game.entities.level.Level;
import com.gebauz.burutaru.game.entities.weapons.Bombs;
import com.gebauz.burutaru.game.entities.weapons.Missiles;
import com.gebauz.burutaru.game.entities.weapons.PlasmaShots;
import com.gebauz.burutaru.game.entities.weapons.BeamShots;
import com.gebauz.burutaru.game.ShipParameters;

public class GameLogic extends GameObject
{

        // Constants========================================================================================

        // Embedded Types===================================================================================

        // Fields===========================================================================================
       
        private EntityManager mEntities = new EntityManager();
        private Vector<Enemy> mEnemies = new Vector<Enemy>();
       
        private Ship mShip = null;
        private VirtualPad mVirtualPad = null;
        private Hud mHud = null;
       
        private StarField mStarField = null;
        private LightManager mLightManager = null;
       
        private PlasmaShots mPlasmaShots = null;
        private BeamShots mBeamShots = null;
        private Missiles mMissiles = null;
        private Bombs mBombs = null;
       
        private BasicShots mBasicShots = null;
        private LargeShots mLargeShots = null;
       
        private PowerUps mPowerUps = null;
       
        private Explosions mExplosions = null;
        private WeaponsImpact mWeaponsImpact = null;
        private Lightning mLightning = null;
       
        private ShipController mShipController = null;
        private ShipParameters mShipParameters = null;
       
        private Level mLevel = null;
       
        private CollisionWorld mCollisionWorld = null;
       
        private IntroOutroTextDisplay mIntroOutroTextDisplay = null;
       
        /** The timer used as a reference for spawning and scripting. */
        private float mLevelTimer = 0.0f;
       
        private String mLevelFile = "data/levels/stage01.level";
       
        // Methods==========================================================================================

        public GameLogic(Game game)
        {
                super(game);
        }
       
        public void initAsync()
        {
                createEntities();
               
                mEntities.initAsync();
        }
       
        public void init()
        {
                mEntities.init();
               
                mShipController = new ShipController(this);
                mShipParameters = new ShipParameters(this);
                /*
                mPowerUps.spawn(600, 40, PowerUps.Type.SPEED_UP);
                mPowerUps.spawn(600, 140, PowerUps.Type.MISSILE);
                mPowerUps.spawn(600, 240, PowerUps.Type.BOMB);
                mPowerUps.spawn(600, 340, PowerUps.Type.BEAM_SHOT);
                mPowerUps.spawn(600, 440, PowerUps.Type.SPEED_UP);
                */

               
                mLevel.start();
        }
         
        public void createEntities()
        {
                mShip = mEntities.addEntity(new Ship(this));
                mVirtualPad = mEntities.addEntity(new VirtualPad(this));
                mHud = mEntities.addEntity(new Hud(this));
               
                mPlasmaShots = mEntities.addEntity(new PlasmaShots(this));
                mBeamShots = mEntities.addEntity(new BeamShots(this));
                mMissiles = mEntities.addEntity(new Missiles(this));
                mBombs = mEntities.addEntity(new Bombs(this));
               
                mBasicShots = mEntities.addEntity(new BasicShots(this));
                mLargeShots = mEntities.addEntity(new LargeShots(this));
               
                mExplosions = mEntities.addEntity(new Explosions(this));
                mWeaponsImpact = mEntities.addEntity(new WeaponsImpact(this));
                mLightning = mEntities.addEntity(new Lightning(this));
               
                mPowerUps = mEntities.addEntity(new PowerUps(this));
               
                /*mPlasmaShots = mEntities.addEntity(new PlasmaShots(this));
                mBeamShots = mEntities.addEntity(new BeamShots(this));
                mBlobEnemies = mEntities.addEntity(new BlobEnemies(this));
                mCarrotEnemies = mEntities.addEntity(new CarrotEnemies(this));
               
               

                mPowerUpMissile = mEntities.addEntity(new PowerUpMissile(this));
                mPowerUpBomb = mEntities.addEntity(new PowerUpBomb(this));
                mImpactExplosions = mEntities.addEntity(new ImpactExplosions(this));*/

               
                mStarField = mEntities.addEntity(new StarField(this));
                mLightManager = mEntities.addEntity(new LightManager(this));
               
                mCollisionWorld = mEntities.addEntity(new CollisionWorld(this));
               
                mIntroOutroTextDisplay = mEntities.addEntity(new IntroOutroTextDisplay(this));
               
                mLevel = mEntities.addEntity(new Level(this));
        }
       
        public Entity findEntity(Class<? extends Entity> classType)
        {
                for (int i = 0; i < mEntities.getNumEntities(); i++)
                {
                        Entity e = (Entity)mEntities.getEntity(i);
                       
                        //if (e instanceof classType)
                        if (classType.isInstance(e))
                                return e;
                }
               
                return null;
        }
       
        /** Retrieve the instance of an Entity of a certain class type. Instantiates the entity if it doesn't exist yet. */
        public Entity initializeEntity(Class<? extends Entity> classType)
        {      
                // if entity already exists, it already has been initialized, just return it then
                Entity newEntity = findEntity(classType);
               
                if (newEntity != null)
                        return newEntity;
               
                try
                {
                        newEntity = classType.getDeclaredConstructor(GameLogic.class).newInstance(this);
                }
                catch (Exception ex)
                {
                        getGame().log("Cannot instantiate '" + classType.getName() + "'");
                }
               
                mEntities.addEntity(newEntity, true);
                newEntity.initAsync();
               
                // if enemy type, add to list
                if (newEntity instanceof Enemy)
                {
                        getGame().log("Added Enemy Entity '" + classType.getName() + "'");
                        mEnemies.add((Enemy)newEntity);
                }
                else
                        getGame().log("Added Entity '" + classType.getName() + "'");
               
                return newEntity;
        }
       
        public void exit()
        {
                mEntities.exit();
                mEnemies.clear();
               
                mShipController = null;
        }
       
        public void update(float deltaTime)
        {
                //deltaTime /= 5.0f;
               
                /*try
                {
                        Thread.sleep(250);
                }
                catch (Exception ex)
                {
                }
               
                deltaTime = 0.12f;*/

               
                mLightManager.clearLightSources();
               
                mEntities.update(deltaTime);
               
                mShip.update(deltaTime);
                mVirtualPad.update(deltaTime);
               
                mBasicShots.update(deltaTime);
                mLargeShots.update(deltaTime);
               
                mPlasmaShots.update(deltaTime);
                mBeamShots.update(deltaTime);
                mMissiles.update(deltaTime);
                mBombs.update(deltaTime);
               
                mPowerUps.update(deltaTime);
               
                mExplosions.update(deltaTime);
                mWeaponsImpact.update(deltaTime);
                mLightning.update(deltaTime);
               
                if (!mLevel.hasLevelEnded())
                {
                        mLevel.update(deltaTime);
                       
                        if (mLevel.hasLevelEnded())
                        {
                                getGame().log("Stage Clear!");
                                mIntroOutroTextDisplay.startOutro("Stage Clear!");
                                mShip.resetNoUpDownMovement();
                        }
                }
               
                mStarField.update(deltaTime);
               
                if (!mLevel.hasLevelEnded())
                        mShipController.handleInput(deltaTime);
               
                // update last because it can accumulate the data before rendering
                mLightManager.update(deltaTime);
               
                mIntroOutroTextDisplay.update(deltaTime);
               
                mHud.update(deltaTime);
               
                mLevelTimer += deltaTime;
        }
       
        public void render()
        {
                // render level background
                //mLevel.renderBackground();
               
                RenderStates rs = getGraphics().renderStates;
               
                rs.pushViewMatrix();
                {              
                       
                        Matrix4 t1 = Matrix4.createTranslation(GameConsts.VIRTUAL_SCREEN_WIDTH/2, GameConsts.VIRTUAL_SCREEN_HEIGHT/2, 0);
                        Matrix4 t2 = Matrix4.createTranslation(-GameConsts.VIRTUAL_SCREEN_WIDTH/2, -GameConsts.VIRTUAL_SCREEN_HEIGHT/2, 0);
                        /*Matrix4 t1 = Matrix4.createTranslation(getShip().getPositionX(), getShip().getPositionY(), 0);
                        Matrix4 t2 = Matrix4.createTranslation(-getShip().getPositionX(), -getShip().getPositionY(), 0);*/

                        Matrix4 r = Matrix4.createRotationZ(-getShip().getAngle());
                        rs.view.identity();
                        rs.view.multiply(t2);
                        rs.view.multiply(r);
                        rs.view.multiply(t1);
                       
                        //rs.view.setLookAt(500, 0, -1000, 400, 240, 0, 0, 1, 0);
                        //rs.view.multiply(Matrix4.createRotationZ(180));
                       
                        mLevel.render(Level.BACKGROUND_LAYER1);
                       
                        mStarField.render();
                       
                        mLevel.render(Level.BACKGROUND_LAYER2);
                       
                        // render level main layer
                        mLevel.render(Level.MAIN_LAYER);
       
                        // render powerup pickups
                        mPowerUps.render();

                        // render enemy weapons
                        mBasicShots.render();
                        mLargeShots.render();
                       
                        // render entities             
                        mEntities.render();
                       
                        // render weapons
                        mPlasmaShots.render();
                        mBeamShots.render();
                        mMissiles.render();
                        mBombs.render();               
       
                       
                        // render ship
                        mShip.render();

               
                        // explosions and effects
                        mWeaponsImpact.render();
                        mLightning.render();
                        mExplosions.render();
                       
                        for (int i = 0; i < mEntities.getNumEntities(); i++)
                        {
                                Entity e = (Entity)mEntities.getEntity(i);
                                e.renderForeground();
                        }
                       
                        mLevel.render(Level.FOREGROUND_LAYER);
                }
                rs.popViewMatrix();
               
                // render HUD and UI
                mIntroOutroTextDisplay.render();
               
                mVirtualPad.render();
                mHud.render();
               
                //getGraphics().getFont().drawText(String.format("%.3fs", mLevel.getCurrentTime()) + " HP: " + getShipParameters().getHealth(), 10, 10);
               
                BurutaruCustomServices s = ((BurutaruCustomServices)getGame().getCustomServices());
                s.getPrettyFont().drawText(String.format("%.03fs", mLevel.getCurrentTime()), 10, 40, 0.5f);
               
                mLevel.render();
        }
       
        public boolean isOutOfScreen(SpriteTransform transform, float offset)
        {
                AABoundingBox box = transform.getApproximateBoundingBox();
               
                return ((box.min.x > (GameConsts.VIRTUAL_SCREEN_WIDTH + offset)) ||
                                (box.min.y > (GameConsts.VIRTUAL_SCREEN_HEIGHT + offset)) ||
                                (box.max.x < -offset) ||
                                (box.max.y < -offset));
        }
       
        public boolean isOutOfScreen(SpriteTransform transform)
        {
                return isOutOfScreen(transform, 0);
        }
       
        public EnemyInstance findClosestEnemy(float x, float y)
        {
                float closestDistanceSqr = Float.MAX_VALUE;
                EnemyInstance result = null;
               
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        //EnemyInstance e = mEnemies.get(i).getNearestEnemy(x, y, closestDistanceSqr);
                        Enemy.SearchResult searchResult = mEnemies.get(i).getNearestEnemy(x, y, closestDistanceSqr);
                       
                        if ((searchResult.enemyInstance != null) && (searchResult.distanceSqr < closestDistanceSqr))
                        {
                                result = searchResult.enemyInstance;
                                closestDistanceSqr = searchResult.distanceSqr;
                        }
                }
               
                return result;
        }
       
        /** Find all enemies within a certain radius. */
        public void findEnemiesInRange(Vector<EnemyInstance> enemyList, float x, float y, float radius)
        {
                float radiusSqr = radius*radius;
               
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        //EnemyInstance e = mEnemies.get(i).getNearestEnemy(x, y, closestDistanceSqr);
                        mEnemies.get(i).getEnemiesInRange(enemyList, x, y, radiusSqr);
                }
        }
       
        /** Find all enemies with the given name. */
        public void findEnemyInstancesByName(Vector<EnemyInstance> result, String name)
        {
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        for (int j = 0; j < mEnemies.get(i).getNumInstances(); j++)
                        {
                                EnemyInstance e = mEnemies.get(i).getInstance(j);
                                if (name.equalsIgnoreCase(e.name))
                                        result.add(e);
                        }
                }
        }
       
        // Getters/Setters==================================================================================
       
        public final Ship getShip() { return mShip; }
        public final VirtualPad getVirtualPad() { return mVirtualPad; }
       
        public final PlasmaShots getPlasmaShots() { return mPlasmaShots; }
        public final BeamShots getBeamShots() { return mBeamShots; }
        public final Missiles getMissiles() { return mMissiles; }
        public final Bombs getBombs() { return mBombs; }
       
        public final BasicShots getBasicShots() { return mBasicShots; }
        public final LargeShots getLargeShots() { return mLargeShots; }
       
        public final PowerUps getPowerUps() { return mPowerUps; }
       
        public final Explosions getExplosions() { return mExplosions; }
        public final WeaponsImpact getWeaponsImpact() { return mWeaponsImpact; }
        public final Lightning getLightning() { return mLightning; }
       
        public final ShipParameters getShipParameters() { return mShipParameters; }
       
        public final Level getLevel() { return mLevel; }
       
        public final StarField getStarField() { return mStarField; }
       
       
        public final CollisionWorld getCollisionWorld() { return mCollisionWorld; }
       
        public final IntroOutroTextDisplay getIntroOutroTextDisplay() { return mIntroOutroTextDisplay; }
       
        public final EntityManager getEntities() { return mEntities; }
       
        public final float getLevelTimer() { return mLevelTimer; }

        public String getCurrentLevelFile() { return mLevelFile; }
       
        public final Hud getHud() { return mHud; }

        public final LightManager getLightManager() { return mLightManager; }

       
}