Ignore:
Timestamp:
2013-07-22 22:52:24 (8 years ago)
Author:
dezhidki
Message:

Uusi versio:

  • Tason luonti valmis
  • Piirtojärjestys toimii
  • Palikoiden lisääminen ja muokkaus toimii
  • Esivalmistelut liikkumista varten
File:
1 edited

Legend:

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

    r4521 r4535  
    1 using System; 
     1using CastleMaster.Entities; 
     2using CastleMaster.Entities.TileEntities; 
     3using CastleMaster.Graphics; 
     4using CastleMaster.Physics; 
     5using CastleMaster.World.Tiles; 
     6using Microsoft.Xna.Framework; 
     7using Microsoft.Xna.Framework.Graphics; 
    28using System.Collections.Generic; 
    3 using System.Linq; 
    4 using System.Text; 
    5 using CastleMaster.World.Tiles; 
    6 using CastleMaster.Graphics; 
    7 using Microsoft.Xna.Framework; 
     9using Viewport = CastleMaster.Graphics.Viewport; 
    810 
    911namespace CastleMaster.World 
    1012{ 
     13 
     14    public class EntityComprarer : Comparer<Entity> 
     15    { 
     16        /// <summary> 
     17        /// Compares entities between them. 
     18        /// </summary> 
     19        /// <param name="e1">Entity 1.</param> 
     20        /// <param name="e2">Entity 2.</param> 
     21        /// <returns>-1 = e1 render before e2 (e1 -> e2). +1 = e1 render after e2 (e2 -> e1).</returns> 
     22        public override int Compare(Entity e1, Entity e2) 
     23        { 
     24            BoundingRectangle br1 = e1.BoundingRectangle; 
     25            BoundingRectangle br2 = e2.BoundingRectangle; 
     26 
     27            if (br1.ZFar >= br2.ZNear) 
     28            { 
     29                if ((e1.Z + e1.X - e1.RenderOffset.Y) - e1.RenderOffset.Y < (e2.Z + e2.X - e2.RenderOffset.Y) - e2.RenderOffset.Y) return -1; 
     30                return +1; 
     31            } 
     32            if (br1.ZNear <= br2.ZFar) 
     33                return -1; 
     34            if (br1.XRight <= br2.XLeft) 
     35                return -1; 
     36            if (br1.XLeft >= br2.XRight) 
     37                return +1; 
     38 
     39            return 0; 
     40        } 
     41    } 
     42 
    1143    public class Level 
    1244    { 
    1345        public const int TILE_VOID = 0; 
     46        public const int UPDATES_IN_TICK = 50; 
    1447        protected List<Tile> registeredTiles; 
    1548        protected int[] tiles; 
    1649        protected byte[] data; 
     50 
     51        private List<Entity> entities; 
     52        private List<TileEntity> tileEntities; 
     53        private List<Entity>[] entitiesInTiles; 
     54        private SortedSet<Entity> entitesToRender; 
    1755        private int width, height; 
    18  
    19         public Level(int width, int height) 
    20         { 
    21             this.width = width; 
    22             this.height = height; 
     56        protected Texture2D tileMap; 
     57        private EntityComprarer comparer = new EntityComprarer(); 
     58        private AnimationHelper waterAnimation = new AnimationHelper(10, 2); 
     59 
     60        public Level(Texture2D tileMap) 
     61        { 
     62            this.tileMap = tileMap; 
     63            width = tileMap.Width; 
     64            height = tileMap.Height; 
    2365 
    2466            tiles = new int[width * height]; 
     
    2971            InitTiles(); 
    3072 
     73            entities = new List<Entity>(); 
     74            tileEntities = new List<TileEntity>(); 
     75            entitiesInTiles = new List<Entity>[width * height]; 
     76            for (int i = 0; i < width * height; i++) 
     77                entitiesInTiles[i] = new List<Entity>(); 
     78            entitesToRender = new SortedSet<Entity>(comparer); 
     79 
    3180            InitLevel(); 
    3281        } 
     
    3786 
    3887        public List<Tile> RegisteredTiles { get { return registeredTiles; } } 
     88 
     89        public int WaterTimer { get { return waterAnimation.CurrentFrame; } } 
    3990 
    4091        protected virtual void InitTiles() { } 
     
    66117                        Tile t = registeredTiles[tiles[tp]]; 
    67118                        if (t.ID != TILE_VOID) 
    68                             t.Render(renderer, new Vector2((x * Viewport.FLOOR_TILE_WIDTH + (y & 1) * Viewport.X_STEP) * Viewport.ZOOM, (y * Viewport.Y_STEP + Viewport.Y_STEP) * Viewport.ZOOM), xTile, zTile, data[tp]); 
     119                            t.Render(renderer, this, new Vector2((x * Viewport.FLOOR_TILE_WIDTH + (y & 1) * Viewport.X_STEP) * Viewport.ZOOM, (y * Viewport.Y_STEP + Viewport.Y_STEP) * Viewport.ZOOM), xTile, zTile, data[tp]); 
     120                        entitiesInTiles[tp].ForEach(ent => entitesToRender.Add(ent)); 
    69121                    } 
    70122                } 
     
    74126        } 
    75127 
     128        public void RenderEntities(Camera camera, RenderHelper renderer) 
     129        { 
     130            if (entitesToRender.Count > 0) 
     131            { 
     132                renderer.SetOffset(camera); 
     133 
     134                foreach (Entity ent in entitesToRender) 
     135                    ent.Render(renderer); 
     136 
     137                renderer.SetOffset(); 
     138 
     139                entitesToRender.Clear(); 
     140            } 
     141        } 
     142 
     143        public void Update() 
     144        { 
     145            waterAnimation.UpdateStep(); 
     146 
     147            for (int i = 0; i < UPDATES_IN_TICK; i++) 
     148            { 
     149                int xTile = Game.Random.Next(width); 
     150                int zTile = Game.Random.Next(height); 
     151 
     152                registeredTiles[tiles[xTile + zTile * width]].Update(this, xTile, zTile); 
     153 
     154                if (tileEntities.Count > 0) 
     155                    tileEntities[Game.Random.Next(tileEntities.Count)].Update(); 
     156            } 
     157 
     158            foreach (Entity ent in entities) 
     159            { 
     160                int xTile_old = (int)(ent.X / Viewport.TILESIZE); 
     161                int zTile_old = (int)(ent.Z / Viewport.TILESIZE); 
     162 
     163                ent.Update(); 
     164 
     165                if (ent.Removed) 
     166                { 
     167                    RemoveEntity(ent); 
     168                    TakeEntity(ent, xTile_old, zTile_old); 
     169                    continue; 
     170                } 
     171 
     172                int xTile = (int)(ent.X / Viewport.TILESIZE); 
     173                int zTile = (int)(ent.Z / Viewport.TILESIZE); 
     174 
     175                if (xTile != xTile_old || zTile != zTile_old) 
     176                { 
     177                    TakeEntity(ent, xTile_old, zTile_old); 
     178                    InsertEntity(ent, xTile, zTile); 
     179                } 
     180            } 
     181        } 
     182 
    76183        public void SetTile(int tileX, int tileZ, int tileID) 
    77184        { 
     
    96203        } 
    97204 
     205        public void AddEntity(Entity ent, float xPos, float zPos) 
     206        { 
     207            int xTile = (int)(xPos / Viewport.TILESIZE); 
     208            int zTile = (int)(zPos / Viewport.TILESIZE); 
     209 
     210            if (!IsValidPos(xTile, zTile)) return; 
     211 
     212            ent.X = xPos; 
     213            ent.Z = zPos; 
     214 
     215            ent.Init(); 
     216 
     217            if (typeof(TileEntity).IsAssignableFrom(ent.GetType())) 
     218                tileEntities.Add((TileEntity)ent); 
     219            else 
     220                entities.Add(ent); 
     221 
     222            InsertEntity(ent, xTile, zTile); 
     223        } 
     224 
     225        private void InsertEntity(Entity ent, int xTile, int zTile) 
     226        { 
     227            entitiesInTiles[xTile + zTile * width].Add(ent); 
     228        } 
     229 
     230        private void TakeEntity(Entity ent, int xTile, int zTile) 
     231        { 
     232            entitiesInTiles[xTile + zTile * width].Remove(ent); 
     233        } 
     234 
     235        private void RemoveEntity(Entity ent) 
     236        { 
     237            ent.OnRemoved(); 
     238 
     239            entities.Remove(ent); 
     240 
     241            TakeEntity(ent, (int)(ent.X / Viewport.TILESIZE), (int)(ent.Z / Viewport.TILESIZE)); 
     242        } 
     243 
    98244        private bool IsValidPos(int tileX, int tileZ) 
    99245        { 
Note: See TracChangeset for help on using the changeset viewer.