예제 #1
0
        public void GenerateStaticCollisionFunction(AssemblyQuadTree a_Tree)
        {
            ILGenerator ilGenerator = m_AssemblyBuilder.CreateFunction(m_TypeBuilder, "StaticCollisionCheck", MethodAttributes.Public, typeof(int), new Type[] { typeof(Rectangle) });
            //Generate the massive if statements

            Label trueLabel = ilGenerator.DefineLabel();
            Label falseLabel = ilGenerator.DefineLabel();

            LocalBuilder localRectangle = ilGenerator.DeclareLocal(typeof(Rectangle));
            LocalBuilder localIntX = ilGenerator.DeclareLocal(typeof(int));
            LocalBuilder localIntY = ilGenerator.DeclareLocal(typeof(int));
            LocalBuilder localIntWidth = ilGenerator.DeclareLocal(typeof(int));
            LocalBuilder localIntHeight = ilGenerator.DeclareLocal(typeof(int));

            ilGenerator.Emit(OpCodes.Ldarg_1);                                      //Load rectangle onto stack
            ilGenerator.Emit(OpCodes.Dup);                                          //Duplicate the rectangle
            ilGenerator.Emit(OpCodes.Ldfld, typeof(Rectangle).GetField("X") );      //Get the X field from the rectangle at the top of the stack ( gets popped and pushed )
            ilGenerator.Emit(OpCodes.Stloc_1);                                      //Store X in our local_1 variable
            ilGenerator.Emit(OpCodes.Dup);                                          //Duplicate the rectangle
            ilGenerator.Emit(OpCodes.Ldfld, typeof(Rectangle).GetField("Y"));       //Get the Y field from the rectangle at the top of the stack ( gets popped and pushed )
            ilGenerator.Emit(OpCodes.Stloc_2);                                      //Store Y in our local_2 variable
            ilGenerator.Emit(OpCodes.Dup);                                          //Duplicate the rectangle
            ilGenerator.Emit(OpCodes.Ldfld, typeof(Rectangle).GetField("Width"));   //Get the Width field from the rectangle at the top of the stack ( gets popped and pushed )
            ilGenerator.Emit(OpCodes.Stloc_3);                                      //Store Width in our local_3 variable
            ilGenerator.Emit(OpCodes.Ldfld, typeof(Rectangle).GetField("Height"));  //Get the Height field from the rectangle at the top of the stack ( gets popped and pushed )
            ilGenerator.Emit(OpCodes.Stloc, 4);                                     //Store Height in our local_4 variable

            a_Tree.GenerateAssembly(ilGenerator, falseLabel, trueLabel);

            ilGenerator.MarkLabel(falseLabel);
            ilGenerator.Emit(OpCodes.Ldc_I4, 0);
            ilGenerator.Emit(OpCodes.Ret);

            ilGenerator.MarkLabel(trueLabel);
            ilGenerator.Emit(OpCodes.Ret);
        }
예제 #2
0
        protected override void Initialize()
        {
            // setup player
            m_Player.Sprite = Content.Load<Texture2D>(@"Sprites\TileSet.png");
            m_Player.SpriteRectangle = new Rectangle(467, 302, 38, 192);
            m_Player.AABB = new Rectangle(0, 0, 38, 192);
            m_Player.InitBullets();
            m_PlayerCollisionRectangle = new Rectangle(0,0,0,0);

            // setup dynamic game and create genGame.dll
            BehaviorTypesXmlReader behaviorTypesXml = new BehaviorTypesXmlReader();
            behaviorTypesXml.Parse(Directory.GetCurrentDirectory() + @"\Content\BehaviorTypes.xml");

            GameTypesXmlReader gameTypesXml = new GameTypesXmlReader();
            gameTypesXml.Parse(Directory.GetCurrentDirectory() + @"\Content\GameTypes.xml", behaviorTypesXml.GameBehaviorProperties);
            gameTypesXml.ParseProperties(behaviorTypesXml.GameBehaviorProperties);

            GameTypesAssemblyBuilder ass = new GameTypesAssemblyBuilder();
            ass.GenerateAssembly(gameTypesXml.GameTypes);

            m_SceneXmlReader = new SceneXmlReader(Content);
            m_SceneXmlReader.Parse(Directory.GetCurrentDirectory() + @"\Content\Scene.xml", gameTypesXml.GameTypes);

            CloneDrawableObjects(gameTypesXml);
            InitDynamicObjects(gameTypesXml);

            m_SceneManager = new SceneManager();
            m_SceneManager.ParseObjects(m_SceneXmlReader.Objects, gameTypesXml.GameTypes, behaviorTypesXml.GameBehaviorProperties);

            List<Object> staticCollidableList = m_SceneManager.GetStaticObjectList("Collidable");
            List<Object> staticDrawableList = m_SceneManager.GetStaticObjectList("Drawable");
            m_DynamicObjects = m_SceneManager.GetObjectList("Movable");

            List<Tuple<Rectangle, int>> staticRectangles = new List<Tuple<Rectangle, int>>();
            foreach (Object obj in staticCollidableList)
                staticRectangles.Add(new Tuple<Rectangle, int>(GetRectangleFromObject(obj), GetHashFromObject(obj)));

            m_QuadTreeRect = new Rectangle(-3000, -3000, 6000, 6000);
            quadTree = new AssemblyQuadTree(m_QuadTreeRect, staticRectangles);

            // this class will generate the game assembly
            GameAssemblyBuilder gameAssemblyBuilder = new GameAssemblyBuilder();
            //gameAssemblyBuilder.GenerateGameObjects(m_SceneXmlReader.Objects, gameTypesXml.GameTypes);
            gameAssemblyBuilder.GenerateDrawFunction(staticDrawableList);
            gameAssemblyBuilder.GenerateStaticCollisionFunction(quadTree);
            gameAssemblyBuilder.Save();

            m_Collidables = staticCollidableList;

            // loads game dll (genGame.dll)
            LoadGameDLL();

            // clear all game objects, wont delete objects that are still referenced!
            m_SceneXmlReader.Clear();
            m_SceneManager.Clear();

            CreateDebugQuad();

            base.Initialize();
        }