Subversion Repositories AndroidProjects

Rev

Rev 1540 | Rev 1648 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.burutaru.game.entities.enemies;

import java.util.Vector;

import com.gebauz.burutaru.game.GameLogic;
import com.gebauz.burutaru.game.entities.Entity;

/** Implementation of an enemy type. */
public abstract class Enemy extends Entity
{

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

        // Embedded Types===================================================================================
       
        public static class SearchResult
        {
                public EnemyInstance enemyInstance = null;
                public float distanceSqr = Float.MAX_VALUE;
               
                void reset()
                {
                        enemyInstance = null;
                        distanceSqr = Float.MAX_VALUE;
                }
        }

        // Fields===========================================================================================
       
        protected Vector<EnemyInstance> mEnemies = new Vector<EnemyInstance>();
       
        protected SearchResult mSearchResult = new SearchResult();

        // Methods==========================================================================================
       
        public Enemy(GameLogic gameLogic)
        {
                super(gameLogic);

        }

        @Override
        public void initAsync()
        {

        }

        @Override
        /** Call this after the derived class has set up everything (sprites, shapes, etc.)!. */
        public void init()
        {              
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        mEnemies.get(i).init();
                }
        }

        @Override
        public void exit()
        {
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        mEnemies.get(i).exit();
                }
        }

        @Override
        public void update(float deltaTime)
        {
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        EnemyInstance e = mEnemies.get(i);
                       
                        // check for spawn event
                        //float lt = getLevelTimer();
                       
                        /*if ((lt <= e.spawnAt) && ((lt + deltaTime) > e.spawnAt))
                                e.spawn();*/

                       
                        boolean hasSpawned = e.hasSpawned;
                       
                        if (!hasSpawned && !getGameLogic().isOutOfScreen(e.getShape().transform) && !e.hasAlreadySpawned)
                                e.spawn();
                       
                        if (e.hasSpawned)
                                e.update(deltaTime);
                        else
                                e.updateScroll(deltaTime);
                       
                        if (hasSpawned && !e.hasSpawned)
                        {
                                getGame().log("Enemy unspawned: " + e.name);
                        }
                }
        }

        @Override
        public void render()
        {
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        EnemyInstance e = mEnemies.get(i);
                       
                        if (e.hasSpawned)
                                e.render();
                }
        }
       
        public abstract EnemyInstance newInstance(String name);
       
        public SearchResult getNearestEnemy(float x, float y, float closestDistanceSqr)
        {
                mSearchResult.reset();
               
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        EnemyInstance e = mEnemies.get(i);
                       
                        if (e.isAlive())
                        {
                                float dx = e.getShape().transform.x - x;
                                float dy = e.getShape().transform.y - y;
                                float distanceSqr = dx*dx + dy*dy;
                               
                                if (distanceSqr < mSearchResult.distanceSqr)
                                {
                                        mSearchResult.enemyInstance = e;
                                        mSearchResult.distanceSqr = distanceSqr;
                                }
                        }
                }
               
                return mSearchResult;
        }      
       
        public void getEnemiesInRange(Vector<EnemyInstance> enemyList, float x, float y, float radiusSqr)
        {
                for (int i = 0; i < mEnemies.size(); i++)
                {
                        EnemyInstance e = mEnemies.get(i);
                       
                        if (e.isAlive())
                        {
                                if (e.getShape().intersectsCircleSqr(x, y, radiusSqr))
                                        enemyList.add(e);
                        }
                }
        }

       
        // Getters/Setters==================================================================================
       
        public final void addInstance(EnemyInstance instance)
        {
                mEnemies.add(instance);
        }
       
        public final EnemyInstance getInstance(int i)
        {
                return mEnemies.get(i);
        }
       
        public final int getNumInstances()
        {
                return mEnemies.size();
        }

       
}