//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 override Animation ToAnimation(object data)
 {
     var frame = new Frame(this);
     frame.Target = data as Sprite;
     return frame;
 }
        private void LoadEnemies()
        {
            _enemies = new Collection<Character>();

            for (int i = 0; i < 30; i++)
            {
                Character enemy;
                int rand = RandomHelper.NextInt(0, 3);
                if (rand == 1)
                {
                    float size = RandomHelper.NextFloat(1.0f, 1.5f);
                    enemy = CreateCharacter(@"Data\Dan.xml", Group.PlayerTwo, RandomHelper.NextFloat(-8000, 9500), 200,
                        100, 5, 120, 400, size, size, RandomHelper.NextFloat(0.9f, 1.3f),
                        RandomHelper.NextFloat(0.5f, 1.5f), RandomHelper.NextFloat(0.9f, 1.3f));
                    enemy.Actions["Attack"].ActionStart += sender =>
                    {
                        var timer = new Timer(500);
                        timer.EventData = sender.Character;
                        timer.OnTimer += timerSender =>
                        {
                            var dan = (Character) timerSender.EventData;
                            if (dan.Actions["Attack"].IsDoing)
                            {
                                var sprite = new Sprite(_soundTex);
                                sprite.DrawRectangle = new Rectangle(0, 0, _soundTex.Width, _soundTex.Height);
                                sprite.Position = dan.Sprite.Position;
                                sprite.ScaleX = dan.Sprite.ScaleX;
                                sprite.ScaleY = dan.Sprite.ScaleY;
                                sprite.R = dan.Sprite.R;
                                sprite.G = dan.Sprite.G;
                                sprite.B = dan.Sprite.B;
                                sprite.Z += 2.0f;
                                Root.Add(sprite);
                                var soundFrame = new Frame(_soundFrameDef);
                                soundFrame.Speed = 2.0f;
                                soundFrame.OnEnd += frameSender =>
                                {
                                    var frame = (Frame) frameSender;
                                    frame.Target.Parent.Remove(frame.Target);
                                };
                                soundFrame.Target = sprite;
                                soundFrame.Start();
                            }
                        };
                        timer.Start();
                    };
                }
                else if (rand == 2)
                {
                    float size = RandomHelper.NextFloat(1.0f, 1.5f);
                    enemy = CreateCharacter(@"Data\Dan1.xml", Group.PlayerTwo, RandomHelper.NextFloat(-8000, 9500), 200,
                        100, 5, 150, 500, size, size, RandomHelper.NextFloat(0.9f, 1.3f),
                        RandomHelper.NextFloat(0.5f, 1.5f), RandomHelper.NextFloat(0.9f, 1.3f));
                }
                else //if (rand == 3)
                {
                    float size = RandomHelper.NextFloat(1.0f, 1.5f);
                    enemy = CreateCharacter(@"Data\Hua.xml", Group.PlayerTwo, RandomHelper.NextFloat(-8000, 9500), 200,
                        100, 5, 100, 450, size, size, RandomHelper.NextFloat(-0.1f, 0.3f),
                        RandomHelper.NextFloat(0.5f, 1.5f), RandomHelper.NextFloat(0.9f, 1.3f));
                }

                enemy.AI.LoadAIScript(@"AI\Enemy.py");
                _enemies.Add(enemy);

                Root.Add(enemy.Sprite);
                EventManager.Register(enemy.AI);
            }
        }