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); }
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(); }