コード例 #1
0
        bool TickCore(long elapsedTicks, RealmTime time)
        {
            Position pos = GetPosition(elapsedTicks);

            Move(pos.X, pos.Y);

            if (pos.X < 0 || pos.X > Owner.Map.Width)
            {
                Destroy(true);
                return(false);
            }
            else if (pos.Y < 0 || pos.Y > Owner.Map.Height)
            {
                Destroy(true);
                return(false);
            }
            else if (Owner.Map[(int)pos.X, (int)pos.Y].TileId == 0xff)
            {
                Destroy(true);
                return(false);
            }
            else
            {
                bool penetrateObsta = Descriptor.PassesCover;
                bool penetrateEnemy = Descriptor.MultiHit;

                var objId = Owner.Map[(int)pos.X, (int)pos.Y].ObjType;
                if (objId != 0 &&
                    XmlDatas.ObjectDescs[objId].OccupySquare &&
                    !penetrateObsta)
                {
                    Destroy(true);
                    return(false);
                }

                double nearestRadius = double.MaxValue;
                Entity entity        = null;
                foreach (var i in collisionMap.HitTest(pos.X, pos.Y, 2))
                {
                    if (i == ProjectileOwner.Self)
                    {
                        continue;
                    }
                    if (i is Container)
                    {
                        continue;
                    }
                    if (hitted.Contains(i))
                    {
                        continue;
                    }
                    double xSide = (i.X - pos.X) * (i.X - pos.X);
                    double ySide = (i.Y - pos.Y) * (i.Y - pos.Y);
                    if (xSide <= 0.5 * 0.5 && ySide <= 0.5 * 0.5 && xSide + ySide <= nearestRadius)
                    {
                        nearestRadius = xSide + ySide;
                        entity        = i;
                    }
                }
                if (entity != null && entity.HitByProjectile(this, time))
                {
                    if ((entity is Enemy && penetrateEnemy) ||
                        (entity is StaticObject && (entity as StaticObject).Static && !(entity is Wall) && penetrateObsta))
                    {
                        hitted.Add(entity);
                    }
                    else
                    {
                        Destroy(true);
                        return(false);
                    }
                    ProjectileOwner.Self.ProjectileHit(this, entity);
                }
            }
            return(true);
        }