private static ICodeBlock GetLoadGlobalContentCode() { ICodeBlock codeBlock = new CodeDocument(); if (ProjectManager.GlueProjectSave.GlobalContentSettingsSave.LoadAsynchronously) { codeBlock .Struct("", "NamedDelegate") .Line("public string Name;") .Line("public System.Action LoadMethod;") .End() ._() .Line("static List<NamedDelegate> LoadMethodList = new List<NamedDelegate>();") ._(); } string className = "GlobalContent"; #region Instantiate the ClassProperties ClassProperties classProperties = new ClassProperties(); classProperties.Members = new List<FlatRedBall.Instructions.Reflection.TypedMemberBase>(); classProperties.UntypedMembers = new Dictionary<string, string>(); #endregion classProperties.NamespaceName = ProjectManager.ProjectNamespace; classProperties.ClassName = className; classProperties.IsStatic = true; classProperties.Partial = true; classProperties.UsingStatements = new List<string>(); #region Add using statements // todo: remove these, we don't need them anymore and they could cause ambiguity classProperties.UsingStatements.Add("System.Collections.Generic"); classProperties.UsingStatements.Add("System.Threading"); classProperties.UsingStatements.Add("FlatRedBall"); classProperties.UsingStatements.Add("FlatRedBall.Math.Geometry"); classProperties.UsingStatements.Add("FlatRedBall.ManagedSpriteGroups"); classProperties.UsingStatements.Add("FlatRedBall.Graphics.Animation"); classProperties.UsingStatements.Add("FlatRedBall.Graphics.Particle"); classProperties.UsingStatements.Add("FlatRedBall.AI.Pathfinding"); classProperties.UsingStatements.Add("FlatRedBall.Utilities"); classProperties.UsingStatements.Add("BitmapFont = FlatRedBall.Graphics.BitmapFont"); classProperties.UsingStatements.Add("FlatRedBall.Localization"); bool shouldAddUsingForDataTypes = false; for (int i = 0; i < ProjectManager.GlueProjectSave.GlobalFiles.Count; i++) { if (FileManager.GetExtension(ProjectManager.GlueProjectSave.GlobalFiles[i].Name) == "csv") { shouldAddUsingForDataTypes = true; break; } } if (shouldAddUsingForDataTypes) { classProperties.UsingStatements.Add(ProjectManager.ProjectNamespace + ".DataTypes"); classProperties.UsingStatements.Add("FlatRedBall.IO.Csv"); } #endregion var contents = GetGlobalContentFilesMethods(); codeBlock.InsertBlock(contents); classProperties.MethodContent = codeBlock; var toReturn = CodeWriter.CreateClass(classProperties); var block = new CodeBlockBaseNoIndent(null); block.Line("#if ANDROID || IOS"); block.Line("// Android doesn't allow background loading. iOS doesn't allow background rendering (which is used by converting textures to use premult alpha)"); block.Line("#define REQUIRES_PRIMARY_THREAD_LOADING"); block.Line("#endif"); toReturn.PreCodeLines.Add(block); return toReturn; }
public static ICodeBlock CreateClass(ClassProperties classProperties) { return CreateClass(classProperties.NamespaceName, classProperties.ClassName, classProperties.Partial, classProperties.Members, classProperties.IsStatic, classProperties.UsingStatements, classProperties.UntypedMembers, classProperties.MethodContent); }
public override string GetCode() { string entityClassName = FileManager.RemovePath(FileManager.RemoveExtension(EntitySave.Name)); if (entityClassName.StartsWith("I")) { int m = 3; } string baseEntityName = null; if (!string.IsNullOrEmpty(EntitySave.BaseEntity)) { EntitySave rootEntitySave = EntitySave.GetRootBaseEntitySave(); // There could be an invalid inheritance chain. We don't want Glue to bomb if so, so // we'll check for this. if (rootEntitySave != null && rootEntitySave != EntitySave) { baseEntityName = rootEntitySave.Name; } } string factoryClassName = ClassName; ClassProperties classProperties = new ClassProperties(); classProperties.NamespaceName = ProjectManager.ProjectNamespace + ".Factories"; classProperties.ClassName = factoryClassName + " : IEntityFactory"; classProperties.Members = new List<FlatRedBall.Instructions.Reflection.TypedMemberBase>(); classProperties.UntypedMembers = new Dictionary<string, string>(); string positionedObjectListType = string.Format("FlatRedBall.Math.PositionedObjectList<{0}>", entityClassName); // Factories used to be always static but we're going to make them singletons instead //classProperties.IsStatic = true; classProperties.UsingStatements = new List<string>(); classProperties.UsingStatements.Add(GlueCommands.Self.GenerateCodeCommands.GetNamespaceForElement(EntitySave)); classProperties.UsingStatements.Add("System"); if (!string.IsNullOrEmpty(baseEntityName)) { EntitySave baseEntity = ObjectFinder.Self.GetEntitySave(baseEntityName); classProperties.UsingStatements.Add(GlueCommands.Self.GenerateCodeCommands.GetNamespaceForElement(baseEntity)); } classProperties.UsingStatements.Add("FlatRedBall.Math"); classProperties.UsingStatements.Add("FlatRedBall.Graphics"); classProperties.UsingStatements.Add(ProjectManager.ProjectNamespace + ".Performance"); ICodeBlock codeContent = CodeWriter.CreateClass(classProperties); const int numberOfInstancesToPool = 20; var methodTag = codeContent.GetTag("Methods")[0]; var methodBlock = GetAllFactoryMethods(factoryClassName, baseEntityName, numberOfInstancesToPool, ShouldPoolObjects); methodTag.InsertBlock(methodBlock); var codeBlock = new CodeBlockBase(null); codeBlock.Line("static string mContentManagerName;"); codeBlock.Line("static PositionedObjectList<" + entityClassName + "> mScreenListReference;"); if (!string.IsNullOrEmpty(baseEntityName)) { codeBlock.Line("static PositionedObjectList<" + FileManager.RemovePath(baseEntityName) + "> mBaseScreenListReference;"); } codeBlock.Line(string.Format("static PoolList<{0}> mPool = new PoolList<{0}>();", entityClassName)); codeBlock.Line(string.Format("public static Action<{0}> EntitySpawned;", entityClassName)); codeBlock.Function("object", "IEntityFactory.CreateNew", "") .Line(string.Format("return {0}.CreateNew();", factoryClassName)); codeBlock.Function("object", "IEntityFactory.CreateNew", "Layer layer") .Line(string.Format("return {0}.CreateNew(layer);", factoryClassName)); #region ScreenListReference property var propertyBlock = new CodeBlockProperty(codeBlock, "public static " + positionedObjectListType, "ScreenListReference"); //codeContent.Property("ScreenListReference", Public: true, Static: true, Type: positionedObjectListType); propertyBlock.Get().Line("return mScreenListReference;").End(); propertyBlock.Set().Line("mScreenListReference = value;").End(); #endregion #region Self and mSelf codeBlock.Line("static " + factoryClassName + " mSelf;"); var selfProperty = codeBlock.Property("public static " + factoryClassName, "Self"); var selfGet = selfProperty.Get(); selfGet.If("mSelf == null") .Line("mSelf = new " + entityClassName + "Factory" + "();"); selfGet.Line("return mSelf;"); #endregion ((codeContent.BodyCodeLines.Last() as CodeBlockBase).BodyCodeLines.Last() as CodeBlockBase).InsertBlock(codeBlock); return codeContent.ToString(); }