private void CreateGameOfLifeBoard()
        {
            BasicEffect effect = new BasicEffect(SystemCore.GraphicsDevice);

            effect.LightingEnabled = false;
            effect.SpecularPower   = 0;
            ProceduralCuboid cubeoid = new ProceduralCuboid(0.5f, 0.5f, 2);

            cubeoid.SetColor(Color.Gray);
            gameObjectArray = new GameObject[boardSize, boardSize];
            for (int i = 0; i < boardSize; i++)
            {
                for (int j = 0; j < boardSize; j++)
                {
                    var gameObject = GameObjectFactory.CreateRenderableGameObjectFromShape(cubeoid, EffectLoader.LoadSM5Effect("flatshaded"));
                    gameObject.Transform.SetPosition(new Vector3(i, 0, j));
                    //gameObject.AddComponent(new ShadowCasterComponent());
                    gameObject.AddComponent(new LineRenderComponent(effect));
                    gameObject.AddComponent(new GameOfLifeComponent());
                    gameObject.AddComponent(new PhysicsComponent(true, false, PhysicsMeshType.box));
                    SystemCore.GameObjectManager.AddAndInitialiseGameObject(gameObject);
                    gameObjectArray[i, j] = gameObject;

                    if (RandomHelper.CoinToss())
                    {
                        gameObject.GetComponent <GameOfLifeComponent>().ActivateCell();
                    }
                }
            }

            //gameObjectArray[5, 5].GetComponent<GameOfLifeComponent>().ActivateCell();
            // gameObjectArray[5, 6].GetComponent<GameOfLifeComponent>().ActivateCell();
            //gameObjectArray[5, 7].GetComponent<GameOfLifeComponent>().ActivateCell();
        }
Example #2
0
        private static void AddCube(ProceduralCube shape, Effect effect, Vector3 position)
        {
            var gameObject = new GameObject();

            gameObject.AddComponent(new RenderGeometryComponent(BufferBuilder.VertexBufferBuild(shape),
                                                                BufferBuilder.IndexBufferBuild(shape), shape.PrimitiveCount));
            gameObject.AddComponent(new EffectRenderComponent(effect));
            gameObject.AddComponent(new ShadowCasterComponent());
            gameObject.AddComponent(new PhysicsComponent(true, true, PhysicsMeshType.box));
            gameObject.Transform.SetPosition(position);
            gameObject.GetComponent <PhysicsComponent>().Simulated = RandomHelper.CoinToss();
            SystemCore.GetSubsystem <GameObjectManager>().AddAndInitialiseGameObject(gameObject);
        }
 private void Randomise()
 {
     for (int i = 0; i < boardSize; i++)
     {
         for (int j = 0; j < boardSize; j++)
         {
             if (RandomHelper.CoinToss())
             {
                 gameObjectArray[i, j].GetComponent <GameOfLifeComponent>().ActivateCell();
             }
             else
             {
                 gameObjectArray[i, j].GetComponent <GameOfLifeComponent>().DeactivateCell();
             }
         }
     }
 }
Example #4
0
        public void Update(GameTime gameTime)
        {
            ParentObject.GetComponent <DoomMovementComponent>().Enabled = true;

            //when in combat, get much more frequent updates on enemy movements.
            apiHandler.frequentRequests.Find(x => x.Request.Resource.Contains("world")).Fequency = 4000;

            //check LOS to monsters. If
            if (worldObjects == null)
            {
                shotsFired = 0;
                return;
            }
            if (worldObjects.Count == 0)
            {
                shotsFired = 0;
                return;
            }



            //get all the monsters from the world object list.
            //monsters are ALL IN CAPS
            var monsters = worldObjects.Values.Where(x => IsAllUpper(x.GetComponent <DoomComponent>().DoomType)).ToList();

            //forget about the dead ones.
            monsters.RemoveAll(x => x.GetComponent <DoomComponent>().Health <= 0);

            //can we see any of these guys?
            List <GameObject> visibleMonsters = new List <GameObject>();

            foreach (GameObject monster in monsters)
            {
                if (!mapHandler.IntersectsLevel(ParentObject.Transform.AbsoluteTransform.Translation, monster.Transform.AbsoluteTransform.Translation, true))
                {
                    //we can see it.
                    visibleMonsters.Add(monster);

                    foreach (DoomLine door in mapHandler.Doors)
                    {
                        if (MonoMathHelper.LineIntersection(ParentObject.Transform.AbsoluteTransform.Translation.ToVector2XZ(),
                                                            monster.Transform.AbsoluteTransform.Translation.ToVector2XZ(),
                                                            door.start.ToVector2XZ(), door.end.ToVector2XZ()))
                        {
                            //there's a door between us and the monster. remove it
                            if (visibleMonsters.Contains(monster))
                            {
                                visibleMonsters.Remove(monster);
                            }
                        }
                    }
                }
            }

            if (visibleMonsters.Count == 0)
            {
                shotsFired = 0;
                return;
            }


            //when in combat, get much more frequent updates on enemy movements.
            apiHandler.frequentRequests.Find(x => x.Request.Resource.Contains("world")).Fequency = 500;


            GameObject target      = null;
            float      closestDist = float.MaxValue;

            foreach (GameObject vm in visibleMonsters)
            {
                Vector3 toMonsterVec = ParentObject.Transform.AbsoluteTransform.Translation - vm.Transform.AbsoluteTransform.Translation;

                if (toMonsterVec.Length() < closestDist)
                {
                    target      = vm;
                    closestDist = toMonsterVec.Length();
                }
            }

            if (closestDist > minimumCombatDistance)
            {
                shotsFired = 0;
                return;
            }

            //disable movement.
            ParentObject.GetComponent <DoomMovementComponent>().Enabled = false;

            DebugShapeRenderer.AddLine(ParentObject.Transform.AbsoluteTransform.Translation,
                                       target.Transform.AbsoluteTransform.Translation, Color.OrangeRed);


            Vector3 targetPosition = target.Transform.AbsoluteTransform.Translation;

            Vector3 toTarget = targetPosition - ParentObject.Transform.AbsoluteTransform.Translation;

            toTarget.Y = 0;
            toTarget.Normalize();


            Vector3 rightV = ParentObject.Transform.AbsoluteTransform.Right;

            rightV.Y = 0;
            rightV.Normalize();

            Vector3 forwardVec = ParentObject.Transform.AbsoluteTransform.Forward;

            forwardVec.Y = 0;
            forwardVec.Normalize();

            float dot = Vector3.Dot(toTarget, rightV);

            //game units are roughly 105 in a circle.
            //so 1 unit = 360 / 105 degrees
            //1 degree = 105 / 360
            var angle = MathHelper.ToDegrees(MonoMathHelper.GetAngleBetweenVectors(toTarget, forwardVec));

            float heading = MathHelper.ToDegrees(MonoMathHelper.GetHeadingFromVector((toTarget).ToVector2XZ()));

            heading = (heading + 360) % 360;

            if (dot > 0.05f)
            {
                if (!turning)
                {
                    //TurnLeft(2);
                    TurnLeftToHeading(heading);
                }
            }
            if (dot < -0.05f)
            {
                if (!turning)
                {
                    //TurnRight(2);
                    TurnRightToHeading(heading);
                }
            }

            if (dot > -0.3f && dot < 0.3f)
            {
                //the node we need is right behind us. Instigate a turn.
                if (MonoMathHelper.AlmostEquals(180d, angle, 10))
                {
                    TurnLeftToHeading(heading);
                    return;
                }

                Shoot();

                if (shotsFired > 8)
                {
                    //we keep missing. shift the aim a bit.
                    bool left = RandomHelper.CoinToss();
                    if (left)
                    {
                        TurnLeft(1);
                    }
                    else
                    {
                        TurnRight(1);
                    }
                    shotsFired = 0;
                }
            }
        }