- Timestamp:
- 2013-07-22 22:52:24 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/World/Level.cs
r4521 r4535 1 using System; 1 using CastleMaster.Entities; 2 using CastleMaster.Entities.TileEntities; 3 using CastleMaster.Graphics; 4 using CastleMaster.Physics; 5 using CastleMaster.World.Tiles; 6 using Microsoft.Xna.Framework; 7 using Microsoft.Xna.Framework.Graphics; 2 8 using 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; 9 using Viewport = CastleMaster.Graphics.Viewport; 8 10 9 11 namespace CastleMaster.World 10 12 { 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 11 43 public class Level 12 44 { 13 45 public const int TILE_VOID = 0; 46 public const int UPDATES_IN_TICK = 50; 14 47 protected List<Tile> registeredTiles; 15 48 protected int[] tiles; 16 49 protected byte[] data; 50 51 private List<Entity> entities; 52 private List<TileEntity> tileEntities; 53 private List<Entity>[] entitiesInTiles; 54 private SortedSet<Entity> entitesToRender; 17 55 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; 23 65 24 66 tiles = new int[width * height]; … … 29 71 InitTiles(); 30 72 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 31 80 InitLevel(); 32 81 } … … 37 86 38 87 public List<Tile> RegisteredTiles { get { return registeredTiles; } } 88 89 public int WaterTimer { get { return waterAnimation.CurrentFrame; } } 39 90 40 91 protected virtual void InitTiles() { } … … 66 117 Tile t = registeredTiles[tiles[tp]]; 67 118 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)); 69 121 } 70 122 } … … 74 126 } 75 127 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 76 183 public void SetTile(int tileX, int tileZ, int tileID) 77 184 { … … 96 203 } 97 204 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 98 244 private bool IsValidPos(int tileX, int tileZ) 99 245 {
Note: See TracChangeset
for help on using the changeset viewer.