Ignore:
Timestamp:
2013-07-23 14:56:43 (6 years ago)
Author:
dezhidki
Message:

Talletus.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/World/Level.cs

    r4550 r4581  
    99using Viewport = CastleMaster.Graphics.Viewport; 
    1010using CastleMaster.Players; 
     11using CastleMaster.Units; 
     12using CastleMaster.Units.Mobs; 
    1113 
    1214namespace CastleMaster.World 
     
    5355        private List<TileEntity> tileEntities; 
    5456        private List<Entity>[] entitiesInTiles; 
    55         private SortedSet<Entity> entitesToRender; 
     57        private List<Entity> entitesToRender; 
     58        private List<Unit>[] units; 
    5659        private int width, height; 
    5760        protected Texture2D tileMap; 
     
    7477            InitTiles(); 
    7578 
     79            units = new List<Unit>[2]; 
     80            units[0] = new List<Unit>(); 
     81            units[1] = new List<Unit>(); 
     82 
    7683            entities = new List<Entity>(); 
    7784            tileEntities = new List<TileEntity>(); 
     
    7986            for (int i = 0; i < width * height; i++) 
    8087                entitiesInTiles[i] = new List<Entity>(); 
    81             entitesToRender = new SortedSet<Entity>(comparer); 
    82  
    83             InitLevel(); 
     88            entitesToRender = new List<Entity>(); 
    8489        } 
    8590 
     
    96101        protected virtual void InitTiles() { } 
    97102 
    98         protected virtual void InitLevel() { } 
     103        public virtual void InitLevel() { } 
    99104 
    100105        public void RenderBackground(Camera camera, RenderHelper renderer) 
     
    135140            if (entitesToRender.Count > 0) 
    136141            { 
     142                entitesToRender.Sort(comparer); 
     143 
    137144                renderer.SetOffset(camera); 
    138145 
     
    168175                ent.Update(); 
    169176 
    170                 if (ent.Removed) 
    171                 { 
    172                     RemoveEntity(ent); 
    173                     TakeEntity(ent, xTile_old, zTile_old); 
    174                     continue; 
    175                 } 
     177                //if (ent.Removed) 
     178                //{ 
     179                //    RemoveEntity(ent); 
     180                //    TakeEntity(ent, xTile_old, zTile_old); 
     181                //    continue; 
     182                //} 
    176183 
    177184                int xTile = (int)(ent.X / Viewport.TILESIZE); 
     
    230237                entities.Add(ent); 
    231238 
     239            if(typeof(Unit).IsAssignableFrom(ent.GetType())) 
     240            { 
     241                Unit u = (Unit)ent; 
     242                units[u.Owner.Team.ID].Add(u); 
     243            } 
     244 
    232245            InsertEntity(ent, xTile, zTile); 
    233246        } 
     
    252265        } 
    253266 
    254         public List<BoundingRectangle> GetCollidables(Entity ent, BoundingRectangle entBR) 
     267        public List<Unit> GetUnitsWithinScreenSpace(float x0, float y0, float x1, float y1, Player player) 
     268        { 
     269            List<Unit> result = new List<Unit>(); 
     270 
     271            foreach (Unit u in units[player.Team.ID]) 
     272            { 
     273                if (u.IsSelectable && u.IntersectsWithScreenSpace(x0, y0, x1, y1)) 
     274                    result.Add(u); 
     275            } 
     276 
     277            return result; 
     278        } 
     279 
     280        public List<BoundingRectangle> GetCollidables(Entity ent, BoundingRectangle br = null) 
    255281        { 
    256282            List<BoundingRectangle> result = new List<BoundingRectangle>(); 
    257283 
    258             int x0 = (int)(entBR.XLeft / Viewport.TILESIZE); 
    259             int z0 = (int)(entBR.ZFar / Viewport.TILESIZE); 
    260             int x1 = (int)(entBR.XRight / Viewport.TILESIZE); 
    261             int z1 = (int)(entBR.ZNear / Viewport.TILESIZE); 
     284            BoundingRectangle entBR = br == null ? ent.BoundingRectangle : br; 
     285 
     286            int x0 = (int)(entBR.XLeft / Viewport.TILESIZE) - 1; 
     287            int z0 = (int)(entBR.ZFar / Viewport.TILESIZE) - 1; 
     288            int x1 = (int)(entBR.XRight / Viewport.TILESIZE) + 1; 
     289            int z1 = (int)(entBR.ZNear / Viewport.TILESIZE) + 1; 
    262290 
    263291            for (int z = z0; z <= z1; z++) 
     
    268296                    if (x < 0 || x >= width) continue; 
    269297 
    270                     foreach (Entity e in entitiesInTiles[x + z * width]) 
     298                    List<Entity> entits = entitiesInTiles[x + z * width]; 
     299 
     300                    foreach (Entity e in entits) 
    271301                    { 
    272302                        if (e != ent && entBR.Intersects(e.BoundingRectangle)) 
     
    275305 
    276306                    Tile t = registeredTiles[tiles[x + z * width]]; 
    277                     if (t.ID != TILE_VOID && t.IsSolid && t.GetBoundingRect(x, z).Intersects(entBR)) 
     307                    if (t.IsSolid && t.GetBoundingRect(x, z).Intersects(entBR)) 
    278308                        t.AddBoundingRect(ref result, x, z); 
    279309                } 
     
    287317            return (tileX >= 0 && tileZ >= 0 && tileX < width && tileZ < height); 
    288318        } 
     319 
     320        public bool[] BuildSolidnessTable(Mob mob) 
     321        { 
     322            bool[] result = new bool[tiles.Length]; 
     323 
     324            for (int i = 0; i < tiles.Length; i++) 
     325            { 
     326                result[i] = tiles[i] == TILE_VOID || registeredTiles[tiles[i]].IsSolid; 
     327 
     328                List<Entity> entInTiles = entitiesInTiles[i]; 
     329 
     330                if (entInTiles.Count > 0) 
     331                { 
     332                    TileEntity te = entInTiles[0] as TileEntity; 
     333                    result[i] = te != null && te.Blocks(mob); 
     334                } 
     335            } 
     336 
     337            return result; 
     338        } 
    289339    } 
    290340} 
Note: See TracChangeset for help on using the changeset viewer.