public void Start(World world) { var entities = world.entities; var enemyEntities = world.enemyEntities; // add randomized velocity to all player entities that have positions for (var i = 0; i < entities.flags.Count; i++) { if (entities.flags[i].HasFlag(EntityFlags.kFlagPosition)) { entities.AddComponent(new PlayerEntity(i), EntityFlags.kFlagForce); var forceComponent = new ForceComponent() { massInverse = Random.Range(0f, 5f), force = Vector2.zero }; entities.forceComponents[i] = forceComponent; } } for (var i = 0; i < enemyEntities.enemyFlags.Count; i++) { if (enemyEntities.enemyFlags[i].HasFlag(EnemyEntityFlags.kFlagPosition)) { enemyEntities.AddEnemyComponent(new EnemyEntity(i), EnemyEntityFlags.kFlagForce); var enemyForceComponent = new EnemyForceComponent() { massInverse = Random.Range(0f, 5f), force = Vector2.zero }; enemyEntities.enemyForceComponents[i] = enemyForceComponent; } } }
private void CheckCollision(Entity entity1, Entity entity2) { ObjectComponent objectComponent1 = entity1.GetComponent <ObjectComponent>(), objectComponent2 = entity2.GetComponent <ObjectComponent>(); if (objectComponent1.IsHeld || objectComponent2.IsHeld || !objectComponent1.IsSolid || !objectComponent2.IsSolid) { return; } PositionComponent positionComponent1 = entity1.GetComponent <PositionComponent>(), positionComponent2 = entity2.GetComponent <PositionComponent>(); ForceComponent forceComponent1 = entity1.GetComponent <ForceComponent>(), forceComponent2 = entity2.GetComponent <ForceComponent>(); Vector2 difference = positionComponent1.Position - positionComponent2.Position; float touchingDistance = objectComponent1.Radius + objectComponent2.Radius; float distance = difference.LengthSquared(); if (distance == 0f || distance > touchingDistance * touchingDistance) { return; } distance = (float)Math.Sqrt(distance); float strength = 1000f / distance; Vector2 force = (difference / distance) * strength; forceComponent1.Force += force; forceComponent2.Force -= force; }
public override void Process(Entity entity) { ForceComponent forceComponent = entity.GetComponent <ForceComponent>(); VelocityComponent velocityComponent = entity.GetComponent <VelocityComponent>(); velocityComponent.Velocity += forceComponent.Force / forceComponent.Mass; forceComponent.Force = Vector2.Zero; }
void ShootEntity() { int id = entities.Shoot(); if (entities.flags[id].HasFlag(EntityFlags.kFlagPosition)) { entities.AddComponent(new Entity(id), EntityFlags.kFlagGravity); entities.AddComponent(new Entity(id), EntityFlags.kFlagForce); entities.AddComponent(new Entity(id), EntityFlags.kFlagMove); entities.AddComponent(new Entity(id), EntityFlags.kFlagCollision); entities.AddComponent(new Entity(id), EntityFlags.kFlagWorldBounds); //gravity - empty //force var forceComponent = new ForceComponent() { massInverse = Random.Range(1f, 5f), force = Vector2.zero }; entities.forceComponents[id] = forceComponent; //movement var moveComponent = entities.moveComponents[id]; moveComponent.velocity = new Vector2(mouseClickDirection.x, mouseClickDirection.y) * force; //moveComponent.velocity = new Vector2(Random.Range(-3f, 3f), Random.Range(-3f, 3f)); entities.moveComponents[id] = moveComponent; //collition var collisionComponent = new CollisionComponent(); if (entities.forceComponents[id].massInverse > 1e-6f) { collisionComponent.radius = 1.0f / entities.forceComponents[id].massInverse; } collisionComponent.coeffOfRestitution = Random.Range(0.1f, 0.9f); entities.collisionComponents[id] = collisionComponent; //worldboudns - empty // add force in selected direction } }
public override void Process(Entity entity) { ObjectComponent objectComponent = entity.GetComponent <ObjectComponent>(); if (objectComponent.IsHeld) { return; } PositionComponent positionComponent = entity.GetComponent <PositionComponent>(); ForceComponent forceComponent = entity.GetComponent <ForceComponent>(); Vector2 worldForce = Vector2.Zero; worldForce.X -= Math.Max(0f, positionComponent.Position.X + objectComponent.Radius - _world.Right); worldForce.X += Math.Max(0f, _world.Left - positionComponent.Position.X + objectComponent.Radius); worldForce.Y -= Math.Max(positionComponent.Position.Y + objectComponent.Radius - _world.Bottom, 0f); worldForce.Y += Math.Max(_world.Top - positionComponent.Position.Y + objectComponent.Radius, 0f); if (worldForce.X != 0f || worldForce.Y != 0f) { forceComponent.Force += Vector2.Normalize(worldForce) * 100f; } Vector2 wallForce = Vector2.Zero; foreach (Rectangle wall in _walls) { if (wall.Contains(positionComponent.Position - new Vector2(0f, objectComponent.Radius)) || wall.Contains(positionComponent.Position + new Vector2(0f, objectComponent.Radius)) || wall.Contains(positionComponent.Position - new Vector2(objectComponent.Radius, 0f)) || wall.Contains(positionComponent.Position + new Vector2(objectComponent.Radius, 0f))) { wallForce += positionComponent.Position - wall.Center.ToVector2(); } } if (wallForce.X != 0f || wallForce.Y != 0f) { forceComponent.Force += Vector2.Normalize(wallForce) * 80f; } }
public override void Process(Entity entity) { PositionComponent positionComponent = entity.GetComponent <PositionComponent>(); ForceComponent forceComponent = entity.GetComponent <ForceComponent>(); ObjectComponent objectComponent = entity.GetComponent <ObjectComponent>(); MinionComponent minionComponent = entity.GetComponent <MinionComponent>(); float speed = _musicBox.IsActive ? 20f : 18f; if (_random.Next(1000) < 100) { minionComponent.Offset = new Vector2(64f * ((float)_random.NextDouble() * 2f - 1f), 64f * ((float)_random.NextDouble() * 2f - 1f)); } if (objectComponent.IsHeld || positionComponent.Depth != 0f) { return; } if (minionComponent.TargetItem != null) { if (minionComponent.TargetItem.DeletingState) { minionComponent.TargetItem = null; } else { PositionComponent itemPositionComponent = minionComponent.TargetItem.GetComponent <PositionComponent>(); if (itemPositionComponent == null || itemPositionComponent.Depth < 0f || itemPositionComponent.Position.Y <= _furnace.Region.Bottom - 4f) { ObjectComponent itemObjectComponent = minionComponent.TargetItem.GetComponent <ObjectComponent>(); if (itemObjectComponent != null) { itemObjectComponent.IsMarked = false; } minionComponent.TargetItem = null; } } } if (minionComponent.TargetItem == null) { float closestDistance = float.MaxValue; Entity closestObject = null; foreach (Entity item in EntityWorld.EntityManager.GetEntities(Aspect.All(typeof(ObjectComponent), typeof(PositionComponent)))) { ObjectComponent itemObjectComponent = item.GetComponent <ObjectComponent>(); if (itemObjectComponent.IsMarked || !WantsItem(itemObjectComponent.Type, minionComponent.Intelligence)) { continue; } PositionComponent itemPositionComponent = item.GetComponent <PositionComponent>(); float checkDistance = 0f; if (minionComponent.Intelligence < 30) { checkDistance = 20f; } if (itemPositionComponent.Depth < 0f || itemPositionComponent.Position.Y <= _furnace.Region.Bottom - checkDistance) { continue; } float distance = (itemPositionComponent.Position - positionComponent.Position).LengthSquared(); if (distance < closestDistance) { closestDistance = distance; closestObject = item; } } minionComponent.TargetItem = closestObject; if (closestObject != null) { ObjectComponent itemObjectComponent = closestObject.GetComponent <ObjectComponent>(); itemObjectComponent.IsMarked = true; } } float safetyDistance = 20f; if (minionComponent.Intelligence > 90) { safetyDistance = 40f; } else if (minionComponent.Intelligence > 80) { safetyDistance = 30f; } if (minionComponent.Intelligence > 50 && (positionComponent.Position.Y <= _furnace.Region.Bottom + safetyDistance && _furnace.Timer > Furnace.ClosedTime - 1f)) { Vector2 target = GetNowhereTarget(minionComponent.Offset, minionComponent.Leftie); forceComponent.Force += Vector2.Normalize(target - positionComponent.Position) * speed; } else if (minionComponent.TargetItem != null) { PositionComponent itemPositionComponent = minionComponent.TargetItem.GetComponent <PositionComponent>(); Vector2 difference = itemPositionComponent.Position - positionComponent.Position; float distance = difference.Length(); if (distance > 32f) { Vector2 target = itemPositionComponent.Position + minionComponent.Offset * Math.Min((distance - 32f) / 100f, 1f); forceComponent.Force += Vector2.Normalize(target - positionComponent.Position) * speed; } else { float xTarget = _furnace.Region.Left + 100f * minionComponent.Tendency; if (positionComponent.Position.X > _furnace.Region.Center.X) { xTarget = _furnace.Region.Right - 100f * minionComponent.Tendency; } float hDir = xTarget - positionComponent.Position.X; forceComponent.Force += new Vector2(hDir / 30f, -speed); ForceComponent itemForceComponent = minionComponent.TargetItem.GetComponent <ForceComponent>(); itemForceComponent.Force += new Vector2(hDir / 30f, -speed); } } else { Vector2 target = GetNowhereTarget(minionComponent.Offset, minionComponent.Leftie); forceComponent.Force += Vector2.Normalize(target - positionComponent.Position) * speed; } }