public MapSquare(IScreenLayer layer, Tile tile, int x, int y, int tilesize) { this.layer = layer; Tile = tile; X = x; Y = y; screenX = x * tilesize; screenY = y * tilesize; var commonBox = Tile.Sprite.BoundBox; blockBox = new RectangleF(commonBox.X, commonBox.Y, commonBox.Width, commonBox.Height); blockBox.Offset(-Tile.Sprite.HotSpot.X, -Tile.Sprite.HotSpot.Y); }
private void LoadLadderBoxes() { var tilesize = Tile.Width; MapSquare below = layer.SquareAt(ScreenX, ScreenY + tilesize); if (below != null && !below.Tile.Properties.Climbable) { flipLadderBox = blockBox; flipLadderBox.Offset(0, flipLadderBox.Height - 4); flipLadderBox.Height = 4; } else flipLadderBox = RectangleF.Empty; MapSquare above = layer.SquareAt(ScreenX, ScreenY - tilesize); if (above != null && !above.Tile.Properties.Climbable) { ladderBox = blockBox; ladderBox.Height = 4; } else ladderBox = RectangleF.Empty; ladderBoxesLoaded = true; }
private RectangleF CheckEntityCollisions(List<Collision> blockEntities, CollisionBox hitbox, RectangleF boundbox) { foreach (var entity in Parent.Entities.GetAll()) { if (entity == Parent) continue; CollisionComponent coll = entity.GetComponent<CollisionComponent>(); if (coll == null) continue; foreach (CollisionBox targetBox in coll.HitByBoxes(hitbox).Where(box => box.Properties.Blocking)) { // if he's blocking, check for collision and maybe push me away RectangleF rect = targetBox.BoxAt(coll.PositionSrc.Position); RectangleF adjustrect = rect; adjustrect.X -= Const.PixelEpsilon; adjustrect.Y -= Const.PixelEpsilon; adjustrect.Width += 2 * Const.PixelEpsilon; adjustrect.Height += 2 - Const.PixelEpsilon; RectangleF intersection = RectangleF.Intersect(boundbox, adjustrect); if (intersection.Width != 0 || intersection.Height != 0) { blockEntities.Add(new Collision(hitbox, targetBox, coll)); if (hitbox.PushAway) { float vx, vy; MovementComponent mov = entity.GetComponent<MovementComponent>(); vx = MovementSrc.VelocityX; vy = MovementSrc.VelocityY; if (mov != null) { vx -= mov.VelocityX; vy -= mov.VelocityY; } PointF offset = hitbox.GetIntersectionOffset(rect, boundbox, vx, vy, false, false); if (offset.X != 0 || offset.Y != 0) { PositionSrc.Offset(offset.X, offset.Y); boundbox.Offset(offset.X, offset.Y); } } } } } return boundbox; }