private void onChangeRegionHandler(ActiveObject target, Point source, Point destination) { IEnumerable<Point> enterRegions = Region.GetRegionRectangleDifference(new Rectangle(destination.X - 1, destination.Y - 1, 3, 3), new Rectangle(source.X - 1, source.Y - 1, 3, 3)); // enable blocks. foreach (Point enterRegion in enterRegions) { if (GameModel.Instance.Grid.HasRegionByCoordinate(enterRegion)) { Region region = GameModel.Instance.Grid.GetRegion(enterRegion); region.ActivateMembers(target); } } IEnumerable<Point> leaveRegions = Region.GetRegionRectangleDifference(new Rectangle(source.X - 1, source.Y - 1, 3, 3), new Rectangle(destination.X - 1, destination.Y - 1, 3, 3)); // disable blocks. foreach (Point leaveRegion in leaveRegions) { if (GameModel.Instance.Grid.HasRegionByCoordinate(leaveRegion)) { Region region = GameModel.Instance.Grid.GetRegion(leaveRegion); region.DeactivateMembers(target); } } }
public void OnActive(ActiveObject target, Vector2 coordinates) { Vector2 diff = coordinates - _master.Position; if (diff.Length() < _distance) { _master.ApproachTo(target.Position, _force); } }
public void OnActive(ActiveObject target, Vector2 coordinates) { Vector2 diff = coordinates - _master.Position; if (diff.Length() < _distance) { // TODO pick up item. _master.Destroy(); } }
public override void Enable(ActiveObject caller) { if (caller is Character) { GameModel.Instance.Character.OnMove += OnActive; } base.Enable(caller); }
public void DeactivateMembers(ActiveObject caller) { foreach (ActiveObject member in _members) { if (member != caller) { member.Deactivate(caller); } } }
public override void Deactivate(ActiveObject caller) { if (caller == this || caller is Character) { foreach (Behavior behavior in Behaviors) { if (behavior.Enabled) { behavior.Disable(); } } } }
private void onEnterRegionHandler(ActiveObject caller, Point destination) { for (int x = destination.X - 1; x < destination.X + 2; ++x) { for (int y = destination.Y - 1; y < destination.Y + 2; ++y) { if (GameModel.Instance.Grid.HasRegionByCoordinate(new Point(x, y))) { Region region = GameModel.Instance.Grid.GetRegion(new Point(x, y)); region.ActivateMembers(caller); } } } }
private void onLeaveRegionHandler(ActiveObject caller, Point source) { for (int x = source.X - 1; x < source.X + 2; ++x) { for (int y = source.Y - 1; y < source.Y + 2; ++y) { if (GameModel.Instance.Grid.HasRegionByCoordinate(new Point(x, y))) { Region region = GameModel.Instance.Grid.GetRegion(new Point(x, y)); region.DeactivateMembers(caller); } } } }
/** * Update object position on grid. */ public void MoveTo(ActiveObject target, Vector2 coordinates) { Point destinationRegion = DetermineRegion(coordinates); // assert. if (!ValidateRegion(destinationRegion)) { return; } if (IsOnMap(target)) { Point sourceRegion = GetCurrentRegion(target); if (sourceRegion != destinationRegion) { Replace(target, sourceRegion, destinationRegion); } } else { Put(target, destinationRegion); } }
/** * Replace already existed object from one region to another. */ private void Replace(ActiveObject target, Point source, Point destination) { _regions[source.X, source.Y].RemoveMember(target); _regions[destination.X, destination.Y].AddMember(target); _objectMap[target] = destination; OnChangeRegion(target, source, destination); }
public virtual void Enable(ActiveObject caller) { _enabled = true; }
/** * Checks whether object already placed on map. */ private bool IsOnMap(ActiveObject target) { return _objectMap.ContainsKey(target); }
/** * Create new object on region map. */ private void Put(ActiveObject target, Point destination) { _regions[destination.X, destination.Y].AddMember(target); _objectMap.Add(target, destination); OnEnterRegion(target, destination); }
/** * Delete object from region map. */ private void Drop(ActiveObject target, Point source) { _regions[source.X, source.Y].RemoveMember(target); _objectMap.Remove(target); OnLeaveRegion(target, source); }
/** * Returns object current region. */ private Point GetCurrentRegion(ActiveObject target) { return _objectMap[target]; }
public void RemoveMember(ActiveObject member) { _members.Remove(member); }
/** * Remove object from region map. */ public void Remove(ActiveObject target) { Point sourceRegion = GetCurrentRegion(target); Drop(target, sourceRegion); }
public abstract void Deactivate(ActiveObject caller);
public override void Activate(ActiveObject caller) { caller.Activate(this); }
public void AddMember(ActiveObject member) { _members.Add(member); }
public Pickup(ActiveObject master, float distance) { _master = master; _distance = distance; }
public override void Deactivate(ActiveObject caller) { //caller.Deactivate(this); }