public DrawUnit(Sprite sprite, Body body, World world)
            : base(body, world)
        {
            _sprite = sprite;
            _eventManager = world.EventManager;

            _listener = new EventListener(Constants.TIME_TICKS_EVENT);
            _listener.Handler = e => Update();
            _eventManager.Register(_listener);
        }
        public override void Dispose()
        {
            _eventManager.UnRegister(_listener);

            if (_sprite != null)
            {
                _sprite.Parent.Remove(_sprite);
                _sprite = null;
            }
            base.Dispose();
        }
        //for detecting enemies
        public Character(Sprite sprite, Body body, World world, CharacterDef charDef)
            : base(sprite, body, world)
        {
            _width = charDef.Width;
            _height = charDef.Height;
            _moveSpeed = charDef.MoveSpeed;

            //create surface sensor
            float xtmp = _width*CHAR_SENSOR_WIDTH_FACTOR*0.5f;
            float x1 = World.B2Value(-xtmp);
            float x2 = World.B2Value(xtmp);
            float ytmp = -_height*0.5f - 2.0f;
            float y1 = World.B2Value(ytmp - 1.0f);
            float y2 = World.B2Value(ytmp);
            var vertices = new Vector2[4];
            vertices[0].X = x2;
            vertices[0].Y = y2;
            vertices[1].X = x1;
            vertices[1].Y = y2;
            vertices[2].X = x1;
            vertices[2].Y = y1;
            vertices[3].X = x2;
            vertices[3].Y = y1;
            _surfaceSense = AttachPolygonSensor(vertices);
            _surfaceSense.SensorName = Constants.SURFACE_SENSOR;

            //create visual sensor
            _visualSense = AttachCircleSensor(Vector2.Zero, _width*VISUAL_RANGE);
            _visualSense.SensorName = Constants.VISUAL_SENSOR;

            HP = charDef.HP;
            MaxHP = charDef.MaxHP;

            //Load animation
            if (charDef.FrameDefs != null)
            {
                for (int i = 0; i < charDef.FrameDefs.Length; i++)
                {
                    FrameDef frameDef = charDef.FrameDefs[i];
                    var frame = new Frame(frameDef);
                    frame.Target = sprite;

                    _animations.Add(frame.Name, frame);
                }
            }

            //Load actions
            if (charDef.Actions != null)
            {
                for (int i = 0; i < charDef.Actions.Length; i++)
                {
                    AttachAction(Activator.CreateInstance(Type.GetType(charDef.Actions[i])) as IAction);
                }
            }

            //Load sound effects
            if (charDef.SoundEffects != null)
            {
                foreach (var i in charDef.SoundEffects)
                {
                    _soundEffects.Add(i.Key, AuditionManager.Instance.SoundEffects[i.Value]);
                }
            }

            //Load AI
            if (!string.IsNullOrEmpty(charDef.AI))
            {
                _ai = new AI.AI(charDef.AI, this);
            }
        }
 public TargetCamera(Sprite target)
     : base(Constants.TIME_TICKS_EVENT)
 {
     _target = target;
 }