static void Main(string[] args) { dynamic test1 = new { Name = "Tim" }; //although I used the dynamic keyword here, it is NOT dynamic. dynamics are only dynamics if they support dynamically adding properties //uncommenting this line will cause an exception //test.LastName = "Jones" if (test1 is IDynamicMetaObjectProvider) { Console.WriteLine("test1"); } dynamic test2 = new MyDynamic(); if (test2 is IDynamicMetaObjectProvider) { Console.WriteLine("test2"); } dynamic test3 = new ExpandoObject(); if (test3 is IDynamicMetaObjectProvider) { Console.WriteLine("test3"); } dynamic test4 = new List <string>(); if (test4 is IDynamicMetaObjectProvider) { Console.WriteLine("test4"); } }
public static bool CanMove(MyDynamic collider, Vector2 motion) { var bounds = collider.bounds.Shift(motion); return(AllCollisions(bounds, collider.mask) .Where(c => c.Item1 != collider && (c.Item1 is MyStatic || c.Item1 is MyDynamic)) .Select(c => c.Item1 as MyDynamic) .All(d => d != null && CanMove(d, motion))); }
public static void Move(MyDynamic collider, Vector2 motion) { collider.remainder += motion * Time.fixedDeltaTime; MoveDimension(collider, 0); // X MoveDimension(collider, 1); // Y var separated = collider.touching.Select(o => (o, Physics.Distance(collider.bounds, o.bounds))) .Where(c => c.Item2.width < 0 || c.Item2.height < 0) .ToList(); foreach (var(other, d) in separated) { collider.touching.Remove(other); other.touching.Remove(collider); } }
public void Dynamic() { dynamic qualquer = new ExpandoObject(); var excel = qualquer as IDictionary<string, object>; excel["ValorTotal"] = 123.99; excel["B"] = DateTime.Now; Console.WriteLine(qualquer.ValorTotal); Console.WriteLine(qualquer.B); dynamic my = new MyDynamic(); my.Nome = "Nonono"; my.Data = DateTime.Now.Year; Console.WriteLine(my.Data); }
private static void MoveDimension(MyDynamic collider, int dim) { var objects = new List <MyDynamic> { collider }; while (true) { var totalRemainder = objects.Sum(c => c.remainder[dim]); if (Mathf.Abs(totalRemainder) < UNIT) { break; } foreach (var o in objects) { o.remainder[dim] = 0; } collider.remainder[dim] = totalRemainder; var sign = Mathf.Sign(collider.remainder[dim]) * UNIT; collider.remainder[dim] -= sign; var shift = new Vector2 { [dim] = sign }; var collision = false; foreach (var obj in objects.ToList()) { var overlaps = AllOverlaps(obj.bounds.Shift(shift), obj.mask) .Where(c => !objects.Contains(c.Item1)); foreach (var(other, overlap) in overlaps) { if (other is MyDynamic || other is MyStatic) { collision = true; } obj.touching.Add(other); other.touching.Add(obj); if (other is MyDynamic pushee && collider.grounded && pushee.pushRatio > 0) { pushee.remainder[dim] += sign * pushee.pushRatio; collider.remainder[dim] *= pushee.pushRatio; objects.Add(pushee); } } } if (!collision) { foreach (var o in objects) { o.position[dim] += sign; o.UpdatePosition(); } } } }