Subversion Repositories AndroidProjects

Rev

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

using BauzoidNET.math;
using BauzoidNET.parser;
using BauzoidNET.graphics.sprite;

using BurutaruEditor.view;

namespace BurutaruEditor.file.enemies
{
    public abstract class EnemySpawner : LevelObject
    {
        public const float SPAWNER_SIZE = 32;

        public const int PART_SPAWN_TRIGGER = 0;
        public const int PART_SPAWN_POSITION = 32;

        public static readonly Vector4 ARROW_COLOR = new Vector4(1, 0, 0, 0.5f);

        private Vector2 mSpawnTrigger = new Vector2();

        [TypeConverter(typeof(ExpandableObjectConverter))]
        public Vector2 SpawnTrigger { get { return mSpawnTrigger; } }

        private Vector2 mSpawnPosition = new Vector2();
       
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public Vector2 SpawnPosition { get { return mSpawnPosition; } }

        public EnemySpawner(Document doc, string name)
            : base(doc, name)
        {
        }

        public virtual void Render()
        {
            SpriteTransform t = DocumentView.Resources.Spawner.getSpriteTransform();
            t.x = SpawnTrigger.x + Doc.View.CurrentPosition.x;
            t.y = SpawnTrigger.y + Doc.View.CurrentPosition.y;
            t.w = SPAWNER_SIZE;
            t.h = SPAWNER_SIZE;
            t.centerPivot();
            DocumentView.Resources.Spawner.render();
        }

        public override void RenderSelected(int selectedPart, bool forHover = false)
        {
            float triggerX = SpawnTrigger.x + Doc.View.CurrentPosition.x;
            float triggerY = SpawnTrigger.y + Doc.View.CurrentPosition.y;

            float halfSize = (SPAWNER_SIZE / 2 + DocumentView.SELECTION_FRAME_OFFSET);

            if (forHover)
                Doc.View.RenderSelectionFrame(triggerX - halfSize, triggerY - halfSize, triggerX + halfSize, triggerY + halfSize, DocumentView.SELECTION_FRAME_HOVER_ALPHA);
            else
                Doc.View.RenderSelectionFrame(triggerX - halfSize, triggerY - halfSize, triggerX + halfSize, triggerY + halfSize);
        }

        public override bool IsInside(float x, float y, out int selectedPart)
        {
            selectedPart = -1;
            float px = SpawnTrigger.x + Doc.View.CurrentPosition.x;
            float py = SpawnTrigger.y + Doc.View.CurrentPosition.y;

            if ((Math.Abs(px - x) <= (SPAWNER_SIZE / 2)) && (Math.Abs(py - y) < (SPAWNER_SIZE / 2)))
            {
                selectedPart = PART_SPAWN_TRIGGER;
                return true;
            }

            return false;
        }

        public override bool ReadParameter(Tokenizer t, string id)
            {
                    if (id.Equals("spawnTrigger", StringComparison.OrdinalIgnoreCase))
                    {
                mSpawnTrigger = ParseUtil.readVector2(t);
                    }
            else if (id.Equals("spawnPosition", StringComparison.OrdinalIgnoreCase))
                    {
                mSpawnPosition = ParseUtil.readVector2(t);
                    }
                    else
                    {
                            return false;
                    }
               
                    t.readToken(";");
                    return true;
            }

        public static EnemySpawner createSpawner(Document doc, string enemyType, string enemyName)
        {
            if (enemyType.Equals("BlobEnemy"))
            {
                return new BlobEnemySpawner(doc, enemyName);
            }

            return null;
        }
    }
}