Пример #1
0
        private void loadZonesLayer(LayerInfo layer)
        {
            List <StaticGeometry> waterBodies = new List <StaticGeometry>();

            //Set water zones
            for (int i = 0; i < layer.Objects.Length; i++)
            {
                ObjectInfo zoneObject = layer.Objects[i];
                if (zoneObject.Type.Equals("Water", StringComparison.OrdinalIgnoreCase))
                {
                    if (zoneObject.Polygon == null)
                    {
                        continue;
                    }

                    Vertices       simGeo    = new Vertices(zoneObject.Polygon.Length);
                    StaticGeometry waterBody = new StaticGeometry(zoneObject.Polygon.Length * 2);

                    //Loop through the object's vertices (Vector2)
                    for (int k = 0; k < zoneObject.Polygon.Length; k++)
                    {
                        simGeo.Add(ConvertUnits.ToSimUnits(zoneObject.Polygon[k]));

                        waterBody.VertexData[k * 2 + 0] = zoneObject.Polygon[k].X + zoneObject.X;
                        waterBody.VertexData[k * 2 + 1] = zoneObject.Polygon[k].Y + zoneObject.Y;
                    }

                    Body geoBody = BodyFactory.CreatePolygon(world, simGeo, 1f);
                    geoBody.Position            = ConvertUnits.ToSimUnits(new Vector2(zoneObject.X, zoneObject.Y));
                    geoBody.UserData            = "Water";
                    geoBody.CollisionCategories = Category.Cat3;
                    geoBody.IsSensor            = true;
                    geoBody.OnCollision        += (a, b, contact) =>
                    {
                        b.Body.GravityScale = 0.05f;
                        return(true);
                    };
                    geoBody.OnSeparation += (a, b) =>
                    {
                        b.Body.GravityScale = 1f;
                    };

                    waterBody.PhysicsBody = geoBody;
                    waterBodies.Add(waterBody);
                }
                else if (zoneObject.Type.Equals("PlayerStart", StringComparison.OrdinalIgnoreCase))
                {
                    Vector2 playerStart = new Vector2();
                    playerStart.X = (zoneObject.X + zoneObject.X + zoneObject.Width) / 2f;
                    playerStart.Y = zoneObject.Y + zoneObject.Height; //Player height is adjusted from the bottom

                    map.PlayerStart = playerStart;
                }
            }

            map.WaterBodies = waterBodies;
        }
Пример #2
0
        private void loadEnemyLayer(LayerInfo layer)
        {
            //Load enemies
            for (int i = 0; i < layer.Objects.Length; i++)
            {
                ObjectInfo enemyObject = layer.Objects[i];

                CircleF area = new CircleF(enemyObject.X, enemyObject.Y, 6f);

                Enemy enemy = new Enemy(map);
                enemy.SetPhysicsBody(BodyFactory.CreateCircle(world, ConvertUnits.ToSimUnits(area.Radius), 88.5f));
                enemy.PhysicsBody.Position            = ConvertUnits.ToSimUnits(area.Position);
                enemy.PhysicsBody.CollisionCategories = Category.Cat1;
                enemy.Area      = area;
                enemy.MaxHealth = 10f;

                map.EnemyCount++;
            }
        }
Пример #3
0
        private void loadCollisionLayer(LayerInfo layer)
        {
            List <StaticGeometry> staticLevelGeometry = new List <StaticGeometry>();

            //Load static geometry
            for (int i = 0; i < layer.Objects.Length; i++)
            {
                ObjectInfo collisionObject = layer.Objects[i];
                if (collisionObject.Polygon == null)
                {
                    continue;
                }

                Vertices       simGeo = new Vertices(collisionObject.Polygon.Length);
                StaticGeometry disGeo = new StaticGeometry(collisionObject.Polygon.Length * 2);

                //Loop through the object's vertices (Vector2)
                for (int k = 0; k < collisionObject.Polygon.Length; k++)
                {
                    simGeo.Add(ConvertUnits.ToSimUnits(collisionObject.Polygon[k]));

                    disGeo.VertexData[k * 2 + 0] = collisionObject.Polygon[k].X + collisionObject.X;
                    disGeo.VertexData[k * 2 + 1] = collisionObject.Polygon[k].Y + collisionObject.Y;
                }

                Body geoBody = BodyFactory.CreatePolygon(world, simGeo, 1f);
                geoBody.Position            = ConvertUnits.ToSimUnits(new Vector2(collisionObject.X, collisionObject.Y));
                geoBody.UserData            = "Static Geometry";
                geoBody.CollisionCategories = Category.Cat2;

                disGeo.PhysicsBody = geoBody;
                staticLevelGeometry.Add(disGeo);
            }

            map.StaticGeometry = staticLevelGeometry;
        }
Пример #4
0
        private void loadObjectivesLayer(LayerInfo layer)
        {
            //Load objectives
            for (int i = 0; i < layer.Objects.Length; i++)
            {
                ObjectInfo areaInfo = layer.Objects[i];
                RectangleF area     = new RectangleF(areaInfo.X, areaInfo.Y, areaInfo.Width, areaInfo.Height);

                const int scientistCount = 5;
                for (int k = 0; k < scientistCount; k++)
                {
                    Vector2   position  = new Vector2(RNG.NextFloat(area.Left, area.Right), area.Bottom - 2f);
                    Scientist scientist = new Scientist(map, position, area);

                    scientist.SetPhysicsBody(BodyFactory.CreateCircle(world, ConvertUnits.ToSimUnits(1f), 5f));
                    scientist.PhysicsBody.Position = ConvertUnits.ToSimUnits(position);
                    //scientist.PhysicsBody.BodyType = BodyType.Dynamic;
                    scientist.PhysicsBody.IsSensor = true;
                    scientist.IsImmortal           = true; //TODO: Consider killable scientists
                }

                map.ScientistCount += scientistCount;
            }
        }
Пример #5
0
        private void loadGateLayer(LayerInfo layer)
        {
            //Load Gates and Sensors
            for (int i = 0; i < layer.Objects.Length; i++)
            {
                ObjectInfo mapObject = layer.Objects[i];

                RectangleF area        = new RectangleF(mapObject.X, mapObject.Y, mapObject.Width, mapObject.Height);
                Vector2    simPosition = ConvertUnits.ToSimUnits(area.Position + new Vector2(area.Width, area.Height) / 2f);
                Vector2    simSize     = ConvertUnits.ToSimUnits(area.Size);

                Body physicsBody = BodyFactory.CreateRectangle(world, simSize.X, simSize.Y, 1f, simPosition);
                physicsBody.BodyType = BodyType.Static;

                if (mapObject.Type.Equals("Gate"))
                {
                    physicsBody.CollisionCategories = Category.Cat2;

                    Gate gate = new Gate(map, area);
                    gate.Name          = mapObject.Name;
                    gate.StartPosition = simPosition;
                    gate.SetPhysicsBody(physicsBody);
                    gate.IsImmortal = true;

                    //Gate end positions based on how it slides
                    if (mapObject.Properties["Slide"].Equals("Left"))
                    {
                        gate.EndPosition = simPosition - new Vector2(simSize.X, 0f);
                    }
                    else if (mapObject.Properties["Slide"].Equals("Right"))
                    {
                        gate.EndPosition = simPosition + new Vector2(simSize.X, 0f);
                    }
                    else if (mapObject.Properties["Slide"].Equals("Up"))
                    {
                        gate.EndPosition = simPosition - new Vector2(0f, simSize.Y);
                    }
                    else if (mapObject.Properties["Slide"].Equals("Down"))
                    {
                        gate.EndPosition = simPosition + new Vector2(0f, simSize.Y);
                    }

                    gate.Timer    = 0f;
                    gate.OpenTime = mapObject.Properties.ContainsKey("OpenTime") ? Convert.ToSingle(mapObject.Properties["OpenTime"]) : 5f;

                    map.Entities.Add(gate);
                }
                else if (mapObject.Type.Equals("Sensor"))
                {
                    physicsBody.IsSensor            = true;
                    physicsBody.CollisionCategories = Category.Cat3;

                    Sensor sensor = new Sensor(map);
                    sensor.SetPhysicsBody(physicsBody);
                    sensor.TargetGateName = mapObject.Properties.ContainsKey("Gate") ? (string)mapObject.Properties["Gate"] : "None";
                    sensor.DisplayArea    = area;
                    sensor.IsImmortal     = true;
                }
            }

            //Pair sensors with gates
            var gates = (from entity in map.Entities
                         where entity.GetType() == typeof(Gate)
                         select(Gate) entity).ToList();
            var sensors = (from entity in map.Entities
                           where entity.GetType() == typeof(Sensor)
                           select(Sensor) entity).ToList();

            for (int i = 0; i < sensors.Count; i++)
            {
                if (sensors[i].TargetGateName.Equals("None"))
                {
                    continue;
                }

                for (int k = 0; k < gates.Count; k++)
                {
                    if (gates[k].Name == sensors[i].TargetGateName)
                    {
                        //Set target gate and setup event trigger
                        Sensor sensor = sensors[i];
                        sensor.TargetGate = gates[k];

                        break;
                    }
                }
            }
        }