FlatRedBall
  • 🖥️Downloading FlatRedBall
  • 🏗️Building FlatRedBall From Source
    • Linking Games to FlatRedBall Engine Source
    • Linking FNA
  • ❓Need Help?
  • ✨FlatRedBall Features
  • 🎓Tutorials
    • Introduction To FlatRedBall
    • Quick Start Guide
    • Beefball - A Full FlatRedBall Tutorial Project
      • Creating a FlatRedBall Project
      • Creating an Entity
      • Creating a Screen
      • Controlling an Entity
      • Creating the Screen Collision
      • Advanced PlayerBall Controls
      • Creating the Puck Entity
      • Adding Multiple Players
      • Scoring and Restarting Rounds
      • Scoring Hud
      • Scoring Hud Logic
      • Adding Dashing
    • Platformer Tutorials
      • Platformer Basics
        • Creating an Entity
        • Controlling a Platformer Entity
        • Movement Values
        • Double Jump
      • Checkpoint and Level End
      • Climbing Ladders
      • Doors
      • GroundCollidedAgainst and Movement Values
      • Moving Platforms
      • Multiple Players
      • NPC Dialog
      • Breaking Blocks
        • New Project Setup
        • Creating Level1 Map
        • Creating the Block Entity
        • Block Removal
      • Dealing Damage
        • New Project Setup
        • Enemy Entity
        • Shooting Bullets
        • Damaging the Enemy
      • Enemy Movement
        • New Project Setup
        • Enemy Entity
        • Enemy Input Logic
        • Detecting Platform Edges
      • Ground Type and Water Movement
        • New Project Setup
        • Creating Level1 Map
        • Adding Ice and Water
        • Platformer Movement Values
      • Animation and Platformer Values
        • New Project Setup
        • Creating AnimationLayers
        • Modifying Platformer Values
      • Wall Sliding and Jumping
    • Damage Dealing
      • Setup
      • Team Index
      • Damage Events
      • IDamageArea Removal
      • Melee Damage
    • Entity Variants Using Inheritance
    • FlatRedBall.Forms
      • Getting Started with FlatRedBall.Forms
        • Setup
        • Working with Common Controls
        • Forms vs Gum in Code
      • Forms and Xbox360GamePad
      • Data Binding (BindingContext)
        • BindingContext Property
        • Binding FlatRedBall.Forms
        • Parent and Children Binding using BindingContext
        • ListBox Templates
      • Styling Forms
      • Defining New Forms Types
        • Adding New Types to FlatRedBall.Forms Library
      • Accessing Forms Events in Gum Runtimes
    • Top Down Games
      • Top Down Basics
        • Setup
        • Input Device
        • CurrentMovement
      • Enemy Movement
        • Enemy Pathfinding
        • Direct Enemy Control
      • GroundVelocity
      • Animation
      • Sorting
    • Post Processing
    • Rock Blaster - A Full FlatRedBall Tutorial Project
      • Introduction
      • Setup
      • Game Skeleton
      • Player Entity
      • Player Behavior
      • Rock Entity
      • Collision
      • Rock States
      • HUD
      • Multiple Players
      • Health
      • Health Part 2
      • Destroying Entities
      • Cleaning Up
    • Code-Only Projects (No Editor)
      • Creating a FlatRedBall Project
      • Adding a Circle
      • Loading Textures and Using Sprites
    • Code Tutorials
      • 3D Camera Setup
      • Adding FlatRedBall to a MonoGame/FNA Project
      • Adding WPF to an Existing Game
      • async and await
      • CLR Profiler
      • Collision Jitter
      • Culling
      • Customizing Cursor Visuals
        • Windows Desktop
        • windows-rt
      • Depth Buffer Z Fighting
      • Dictionaries and Enum Keys
      • FlatRedBall XNA in Windows Form
      • Improving Performance
        • CustomActivity Performance
        • Identifying Screen Creation Performance Issues
        • Rendering Performance
        • Manually Updated Objects
          • Introduction
          • Measuring Automatic Updates
          • Measuring Sprite Automatic Updates
          • Manual Particle Systems
      • Object Sorting
      • Pix
      • Rendering Sprites with Shaders
      • Tile-Based Movement
      • Velocity
    • Distribution
      • App Icon
      • Emptying bin Folder Using Probing Path
      • itch.io
      • Release Build
      • Steam
    • FlatRedBall and Velcro Physics
      • Using Velcro Physics with the FlatRedBall Editor
      • Code-Only Velcro Projects
    • FlatRedBall Editor Plugins
      • Introduction to FlatRedBall Plugins
      • Creating a Plugin Project
      • Creating a Plugin Class
      • Adding UI to FlatRedBall
      • Using MVVM
      • Creating a NamedObjectSave-Editing Plugin
      • Adding File Format Support
      • Adding Code Files to a Game Project
      • Errors
      • Exporting a Plugin
    • Additional FlatRedBall Editor Tutorials
      • How to Create a First Person Camera
      • How to Play Sounds
      • How to Share Reference Data Between Screens and Entities
    • Math Tutorials
      • Circle Collision
      • Determining required magnitude for trajectory
      • Introduction to Collision
      • Power of Two
      • Rectangle Collision
      • rotation
      • statistics
      • trigonometry
      • vector
      • matrix
      • interpolation
    • Overworld Tutorials
      • Spinning Mode 7
        • New Project Setup
        • Adding Camera Code
        • Fading In and Out
  • 🎞️Videos
  • 📐FlatRedBall Editor
    • Display Settings
    • Entities
      • BaseEntity
      • Constructor
      • ConvertToManuallyUpdated
      • CreatedByOtherEntities
      • CustomActivity
      • CustomDestroy
      • CustomInitialize
      • Destroying Entities
      • Entity Performance
      • Export Entity
      • Implements IClickable
      • Implements ICollidable
      • Implements IDamageArea
      • Implements IDrawableBatch
      • Implements IGumCollidable
      • Implements IVisible
      • Implements IWindow
        • SlideOnClick
      • Import Entity
      • Inheriting from FlatRedBall Types
      • LayerProvidedByContainer
      • MoveToLayer
      • PooledByFactory
      • Top Down Movement
        • TopDownSpeedMultiplier
      • Use Global Content
    • Events
      • ResolutionRrOrientationChanged
    • Factories
      • CreateNew
      • EntitySpawned
      • Initialize
      • SortAxis
    • Files
      • File Types
        • Animation Chain List (.achx)
        • Comma Separated Values (.csv)
          • Combining .csvs With Entities
          • CreatesDictionary
          • Cross Referencing CSVs
          • Instantiating Custom Types
          • OrderedList
          • SetCreatedClass
            • generate-data-class
          • uniformrowtype
        • Effect (.fx, .fxb)
        • Font (.fnt)
        • JSON (.json)
        • Model (.fbx)
        • MP3
        • Node Network (.nntx)
        • OpenDocument Spreadsheet (.ods)
        • ShapeCollections (.shcx)
        • SplineList (.splx)
        • Texture2D (.png)
        • Wave (.wav)
      • Accessing Files in Code
      • Adding File Objects to Managers
      • Destroy on Unload
      • File Build Tool
      • Folders
      • Global Content Files
      • IsDatabaseForLocalizing
      • IsManuallyUpdated
      • IncludeDirectoryRelativeToContainer
      • LoadedAtRuntime
      • LoadedOnlyWhenReferenced
      • Name
      • Platform Inclusions
      • Project Specific Files
      • RuntimeType
      • SourceFile
      • UseContentPipeline
      • Wildcard Files
    • FileVersion (.gluj)
    • Generated Code
    • Global Content Files
      • LoadAsynchronously
      • Reload
      • Setting Files At Runtime
    • Live Edit
      • Render Targets
    • Menu
      • Content
        • Additional Content
          • Using Runtime Types as Objects
          • creating-runtime-objects
          • runtime-object-charateristics
          • simple-line-of-text-tutorial
        • Introduction
        • pipeline-settings
      • File
        • New Project
      • Edit
        • Find File References
      • Plugins
        • Install Plugin
        • Manage Plugins
      • Project
        • View Projects
      • Settings
        • Camera Settings
        • File Associations
        • File Build Tools
        • Performance Settings
      • Update
        • Introduction
        • glue-reference-menu-frbdk
        • glue-reference-menu-libraries
    • Multi-Platform
      • Synced Projects
      • Changing Main Project Type
      • Android
        • Distribution
        • Setup
      • iOS
        • Certificates and Profiles
        • Copying Projects to Mac
        • Using Xamarin Build Host
      • Switch (Nintendo)
      • Web
    • Objects
      • Object Types
        • AxisAlignedRectangle
        • Camera
        • CameraControllingEntity
        • Circle
        • CollisionRelationship
        • Layer
          • DestinationRectangle
          • Is2D
        • Polygon
        • PositionedObjectList
        • RenderTarget2D
        • ShapeCollection
        • SoundEffectInstance
        • Sprite
        • Text
        • TileNodeNetwork
      • AddToManagers
      • AttachToCamera
      • AttachToContainer
      • CallActivity
      • Collidable Objects
      • EntireFile
      • ExposedInDerived
      • HasPublicProperty
      • IgnoresPausing
      • IncludeInIClickable
      • IncludeInICollidable
      • IsContainer
      • LayerOn
      • Map
      • SetByDerived
      • SourceFile
      • SourceType
    • Plugins
      • glue-gluevault-component-pages-rendertargetrenderer
      • glue-gluevault-component-pages-simple-command-console
      • glue-gluevault-component-pages-squid-gui-integration
      • kalldrexx-interactive-debugging-console
    • Profiling
    • Screens
      • AsyncLoadingState
      • BaseScreen
      • Constructor
      • Creating a New Screen
      • CustomDestroy
      • CustomInitialize
      • DefaultLayer
      • GameScreen
      • IsActivityFinished
      • IsLoadingScreen
      • LoadStaticContent
      • MoveToScreen
      • PauseAdjustedCurrentTime
      • Set as StartUp Screen
      • UnloadsContentManagerWhenDestroyed
    • States
      • InterpolateToState
      • InterpolateToState vs InterpolateBetween
      • State Categories
      • State Classes
      • States and Inheritance
      • Tunneling Category Variables
    • Variables
      • CreatesEvent
      • HasAccompanyingVelocityProperty
      • IsShared
      • Proper Variable Naming
      • SetByDerived
      • Type
      • Variable Order
    • Visual Studio Project (.csproj)
  • 🏃Animation Editor
    • Frame Time
    • Animation Shapes and Collision
  • Tiled
    • Tiled Basics
      • Introduction
      • Creating a GameScreen
      • Adding Collision
      • Colliding Entities Against TileShapeCollections
      • Working with Multiple Levels
      • Creating Entities from Tiles
      • Creating Entities from Object Layers
      • Accessing Tiled Properties
      • Working with Tiled Shapes
    • Tiled Files in Entities
    • TileEntityInstantiator
    • Using TiledObjects.Generated.xml
    • LayeredTileMap
      • Collisions
      • Destroy
      • FromTiledMapSave
      • Z
    • MapDrawableBatch
      • AddTile
      • CoordinateAdjustment
      • GetBottomLeftWorldCoordinateForOrderedTile
      • MergeOntoThis
      • NamedTileOrderedIndexes
      • PaintTile
      • PaintTileTextureCoordinates
      • ParallaxX
      • Paste
      • Properties
      • RemoveQuads
      • RenderingScale
      • SortAxis
    • TiledMapSave
    • TileShapeCollection
      • AddCollisionAtWorld
      • AddCollisionFrom
      • AddCollisionFromTilesWithProperty
      • AddMergedCollisionFromLayer
      • AddMergedCollisionFromTilesWithProperty
      • AdjustRepositionDirectionsOnAddAndRemove
      • CollideAgainst
      • CollideAgainstClosest
      • GetRectangleAtPosition
      • InsertCollidables
      • LastCollisionAxisAlignedRectangles
      • Rectangles
      • RemoveFromManagers
      • RemoveSurroundedCollision
  • 🟩Gum
    • Tutorials
      • Introduction and Setup
      • Screens in Gum
      • Gum Objects in Code
      • Events on Gum Objects
      • Events on Gum Objects Part 2
      • Exposed Variables
      • States
      • Adding Code to Gum Objects
    • Accessing Gum Screens in Code
    • Adding Components to Layers
    • Adding Gum Screens to FlatRedBall
    • Animations in Code
    • Components in FlatRedBall Entities
    • Converting Gum Coordinates
    • Creating Components in Code
    • GraphicalUiElement as IWindow
    • Gum Resolution
    • Gum Properties Tab
    • Gum Animations
      • How to Play Gum Screen Animations
      • Named Events
      • Setting Gum Animationchain Achx in Code
  • 🦴Spine
    • Setup
    • Atlas
    • Changing Spine Textures at Runtime
    • SpineDrawableBatch
      • Event
      • PlayAnimation
      • SetCollision
      • Skeleton
  • ⏸️Aseprite
    • AnimationChainList
  • 🏫API Documentation
    • FlatRedBall Engine
      • AI
        • LineOfSight
          • VisibilityGrid
        • Pathfinding
          • PositionedNode
          • Link
            • Cost
            • NodeLinkingTo
          • NodeNetwork
            • GetPath
            • UpdateShapes
            • Visible
          • TileNodeNetwork
            • AddAndLinkTiledNode
            • AddAndLinkTiledNodeWorld
            • OccupyTileWorld
            • SetCosts
      • Audio
        • AudioManager
          • AreSoundEffectsEnabled
          • CurrentlyPlayingSong
          • MasterSongVolume
          • MasterSoundVolume
          • Play
          • PlaySong
          • PlaySongs
          • StopSong
        • PositionedSound
        • Sound
      • Camera
        • AbsoluteRightXEdge
        • AbsoluteRightXEdgeAt
        • AddLayer
        • AddSpriteToBillboard
        • AspectRatio
        • AttachTo
        • BackgroundColor
        • CameraCullMode
        • ClearMinimumsAndMaximums
        • ClearsDepthBuffer
        • DestinationRectangle
        • DrawsShapes
        • DrawsToScreen
        • DrawsWorld
        • FarClipPlane
        • FieldOfView
        • FixAspectRatioYConstant
        • ForceUpdateDependencies
        • GetViewport
        • IsSpriteInView
        • KeepSpriteInScreen
        • Layer
        • Layers
        • Main
        • MaximumX
        • Orthogonal
        • OrthogonalHeight
        • OrthogonalWidth
        • PixelsPerUnitAt
        • Position
        • PositionRandomlyInView
        • RelativeXEdgeAt
        • RemoveLayer
        • RotationMatrix
        • SetBordersAtZ
        • SetLookAtRotationMatrix
        • SetSplitScreenViewport
        • UpdateViewProjectionMatrix
        • UpVector
        • UsePixelCoordinates
        • UsePixelCoordinates3D
        • View
      • Content
        • ContentLoadBatch
        • AnimationChain
          • AnimationChainListSave
        • ContentManager
          • AddUnloadMethod
          • FileAliases
          • IsAssetLoadedByName
          • Load
          • LoadFromGlobalIfExists
          • Multiple Content Managers
        • Math
          • Geometry
            • ShapeCollectionSave
        • Polygon
          • PolygonSave
        • Scene
          • CameraSave
          • SceneSave
        • SpriteEditorScene
          • Camera
      • Debugging
        • Debugger
          • CommandLineWrite
          • GetFullPerformanceInformation
          • TextBlue
          • WriteAutomaticallyUpdatedObjectInformation
      • Entities
        • CameraControllingEntity
        • IDamageable
        • IDamageArea
      • FlatRedBallServices
        • AddDisposable
        • AddManager
        • CornerGrabbingResize
        • Draw
        • ForceClientSizeUpdates
        • Game
        • GetManagerInformation
        • GlobalContentManager
        • GraphicsOptions
        • Initialize
        • IsLoaded
        • Load
        • Owner
        • Random
        • RenderAll
        • Unload
        • Update
        • WindowHandle
      • Graphics
        • Animation
          • AnimationChain
            • Clone
            • FrameToFrame
            • TotalLength
          • AnimationChainList
          • AnimationController
          • AnimationFrame
            • RelativeX
            • ShapeCollectionSave
            • Texture
          • IAnimationChainAnimatable
            • Animate
            • Animation and Timing
            • AnimationChains
            • AnimationSpeed
            • CurrentChainName
            • CurrentFrameIndex
            • JustChangedFrame
            • JustCycled
            • UseAnimationRelativePosition
        • BitmapFont
          • BMFC File
          • BitmapCharacterInfo
          • FNT File
          • Glyphs
          • LineHeightInPixels
          • RenderToTexture2D
        • BlendOperation
        • ColorOperation
          • Add
          • Color
          • ColorTextureAlpha
          • InterpolateColor
          • Modulate
          • Texture
        • GraphicsOptions
          • Filtering
          • IsFullScreen
          • ResolutionHeight
          • SetFullScreen
          • SetResolution
          • SizeOrOrientationChanged
          • TextureFilter
          • TextureLoadingColorKey
          • UseMultisampling
        • IColorable
          • Alpha
          • BlendOperation
          • Blue
          • ColorOperation
        • IDrawableBatch
          • Z
          • RenderState
        • IVisible
          • IgnoresParentVisibility
        • Layer
          • Layer Membership Details
          • LayerCameraSettings
          • Remove
          • RenderTarget
          • SortType
          • Sprites
          • UsePixelCoordinates
        • LayerCameraSettings
          • OrthogonalWidth
          • TopDestination
        • Particle
          • EmissionSettings
            • Drag
            • PixelSize
            • ScaleX
          • Emitter
        • PostProcessing
          • SwapChain
        • RenderBreak
        • Renderer
          • Draw
          • LastFrameRenderBreakList
          • RenderBreaksAllocatedThisFrame
        • Text
          • AdjustPositionForPixelPerfectDrawing
          • ColorOperation
          • DisplayText
          • GetWidth
          • Font
          • HorizontalAlignment
          • InsertNewLines
          • MaxWidth
          • MaxWidthBehavior
          • NewLineDistance
          • NumberOfLines
          • ScaleX
          • SetColor
          • SetPixelPerfectScale
          • VerticalAlignment
          • Width
        • TextManager
          • AddManuallyUpdated
          • AddText
          • AddToLayer
          • FilterTexts
          • RemoveText
        • Texture
          • RenderTargetSprite
          • ImageData
            • ApplyColorOperation
            • Fill
            • FromTexture2D
      • Gui
        • Cursor
          • Camera
          • ClickNoSlideThreshold
          • CustomUpdate
          • GetRay
          • IngnoreInputThisFrame
          • IsInWindow
          • IsOn
          • IsOn3d
          • PrimaryClick
          • PrimaryClickNoSlide
          • PrimaryPushTime
          • ScreenX
          • SecondaryClick
          • SetControllingGamepad
          • SetJoystickControl
          • TransformationMatrix
          • WindowOver
          • WidowPushed
          • WorldPosition
          • WorldX
          • WorldXAt
          • WorldYAt
          • XForUi
        • GuiManager
          • AddDominantWindow
          • BringsClickedWindowsToFront
          • BringToFront
          • GamepadsForUiControl
          • MakeRegularWindow
          • RemoveWindow
          • SortZAndLayerBased
          • Windows
        • IClickable
        • IInputReceiver
          • IWindow
            • CallClick
            • Enabled
          • ReceiveInput
      • Input
        • AnalogButton
        • AnalogStick
          • IsMaxPositionNormalized
        • DelegateBased1DInput
        • DelegateBased2DInput
        • DelegateBasedPressableInput
        • I1DInput
        • I2DInput
        • IMouseOver
        • InputDeviceBase
        • InputManager
          • ClearAllInput
          • InputReceiver
        • IPressableInput
        • Keyboard
          • Clear
          • ControlPositionedObject
          • Get2DInput
          • GetKey
          • GetStringTyped
          • IgnoreKeyForOneFrame
          • KeyDown
          • KeyPushed
        • Mouse
          • GrabbedPositionedObject
          • IsOn3D
          • ModifyMouseState
          • Restricting Mouse to Screen Bounds
          • SetScreenPosition
        • TouchScreen
          • LastFrameGestures
          • ReadsGestures
        • Windows
          • WindowsInputEventManager
        • Xbox360GamePad
          • ButtonDown
          • ButtonMap
          • ButtonPosition vs Button
          • ButtonPushed
          • ControlPositionedObject
          • CreateDefaultButtonMap
          • Deadzone
          • DeadzoneType
          • FakeIsConnected
          • GamepadLayout
          • IgnoreButtonForOneFrame
      • Instructions
        • DelegateInstruction
        • IInstructable
          • Call
          • Cnstructions
          • Set
        • Instruction
        • InstructionList
          • ExecuteAndRemoveOrCyclePassedInstructions
        • InstructionManager
          • Add
          • AddSafe
          • Instructions
          • MoveThrough
          • MoveTo
          • MoveToAccurate
          • ObjectsIgnoringPausing
          • PauseEngine
          • Pulse
          • RotateToAccurate
        • Reflection
          • LateBinder
          • PropertyCollection
        • MethodInstruction
        • StaticMethodInstruction
      • IO
        • Csv
          • CsvHeader
          • CsvFilemanager
            • Cells with Multiple Lines
            • Color
            • CsvDeserializelist
            • Rows with Lists
          • RuntimeCsvRepresentation
            • FromList
            • GenerateCsvString
        • FileManager
          • BinarySerialize
          • CloneObject
          • FromFileText
          • GetAllFilesInDirectory
          • GetUserFolder
          • InitializeUserFolder
          • RelativeDirectory
          • SaveEmbeddedResource
          • SaveText
          • Standardize
          • UserApplicationDataForThisApplication
          • XmlDeserialize
          • XmlSerialize
      • Localization
        • LocalizationManager
      • Managers
        • IManager
      • Math
        • IAttachableRemovable
        • AttachableList
          • FindByName
          • MakeOneWay
        • Collision
          • CollisionManager
            • Relationships
            • Update
        • Geometry
          • AxisAlignedCube
            • CollideAgainstBounce
          • AxisAlignedRectangle
            • Axis Alignment And Rotation
            • CollideAgainstMoveSoft
            • Color
            • GetRandomPositionInThis
            • KeepThisInsideOf
            • LastMoveCollisionReposition
            • Left
            • RepositionDirections
          • Capsule2D
          • Circle
            • CollideAgainst
            • CollideAgainstBounce
            • CollideAgainstMove
            • IsPointInside
            • LastCollisionTangent
            • LastMoveCollisionReposition
            • ProjectParentVelocityOnLastMoveCollisionTangent
            • Visible
            • Z
          • Colliding a List of Shapes Against Itself
          • FloatRectangle
          • ICollidable
          • IScalable
            • Scale
          • Line
            • Color
            • LastCollisionPoint
            • RelativePoint1
            • SetFromAbsoluteEndpoints
          • Point
          • Polygon
            • AbsolutePointPosition
            • Clone
            • CollideAgainstBounce
            • CollideAgainstMove and Attachments
            • CollideAgainstMove
            • Color
            • CreateEquilateral
            • CreateRectangle
            • ForceUpdateDependencies
            • IsPointInside
            • LastMoveCollisionReposition
            • OptimizeRadius
            • Points
            • Position
            • ProjectParentVelocityOnLastMoveCollisionTangent
            • ScaleBy
            • Thin Polygon Problem
            • VectorFrom
            • Visible
            • Z
          • Segment
            • ClosestPointTo
          • Shape
          • ShapeCollection
            • AttachTo
            • AxisAlignedRectangles
            • CollideAgainst
            • CollideAgainstBounceWithoutSnag
            • CollideAgainstMove
            • CollideAgainstMoveWithoutSnag
            • LastCollisionAxisAlignedRectangles
            • SortAscending
            • Visible
          • ShapeManager
            • AddToLayer
            • Remove
            • ShapeDrawingOrder
          • ShapeMerger
          • Shapes and 2D Collision
          • Sphere
        • IAttachable
          • Attachment Updates in the Engine
          • Detach
          • ParentRotationChangesPosition
          • ParentRotationChangesRotation
          • TopParent
        • IRotatable
          • RotationMatrix
        • MathFunctions
          • AbsoluteToWindow
          • AngleToAngle
          • AngleToVector
          • GetPointInCircle
          • GetPositionAfterTime
          • RegulatAngle
          • RotatePointAroundPoint
          • RoundFloat
          • RoundToInt
          • WidowToAbsolute
        • Paths
          • Path
        • PositionedObjectList
          • Add
          • AttachTo
          • Clear
          • GetFirstAfter
          • GetFirstAfterPosition
          • SortXInsertionAscending
        • Splines
          • Spline
            • GetPositionAtLengthAlongSpline
      • Performance
        • Measurement
          • Section
            • GetAndStartContextAndTime
            • Save
            • ToStringVerbose
      • PositionedObject
        • Acceleration
        • AttachTo
        • Children
        • Clone
        • Drag
        • ForceUpdatedependencies
        • ForceUpdatedependenciesDeep
        • Initialize
        • KeepTrackOfReal
        • LastPosition
        • Mirrored properties
        • ParentRotationChangesPosition
        • ParentRotationChangesRotation
        • Position
        • RelativePosition
        • RelativeRotationZ
        • RelativeVelocity
        • RemoveSelfFromListsBelongingTo
        • RotationZ
        • SetRelativeFromAbsolute
        • TimedActivity
        • TopParent
        • UpdateDependencies
        • Velocity
        • Z
      • Screens
        • Screen
          • ContentManagerName
          • CustomDestroy
          • IsActivityFinished
          • MoveToScreen
          • PauseThisScreen
        • ScreenManager
          • Activity
          • CurrentScreen
          • Start
      • Sprite
        • Alpha
        • AnimateSelf
        • AnimationChains
        • AnimationSpeed
        • Bottom
        • BottomTextureCoordinate
        • Changing a Sprite's Origin
        • ColorOperation
        • CurrentChainName
        • CurrentFrameIndex
        • IgnoreAnimationChainTextureFlip
        • Inheriting from the Sprite Class
        • JustCycled
        • LeftTextureCoordinate
        • PixelSize
        • Position
        • RightTextureCoordinate
        • SetAnimationChain
        • SetScaleXRatioToY
        • Sorting and Overlapping
        • Sprite vs Texture2d
        • Texture Coordinates
        • Texture
        • TextureAddressMode
        • TextureCoordinate
        • TextureFilter
        • TextureScale
        • TimeIntoAnimation
        • TopTextureCoordinate
        • UseAnimationRelativePosition
        • Vertices
        • VerticesForDrawing
        • Visible
      • SpriteList
      • SpriteManager
        • AddDrawableBatch
        • AddManagedInvisibleSprite
        • AddManualSprite
        • AddParticleSprite
        • AddPositionedObject
        • AddSprite
        • AddToLayer
        • AddZBufferedDrawableBatch
        • AddZBufferedSprite
        • AutomaticallyUpdatedSprites
        • Camera
        • ConvertToAutomaticallyUpdated
        • ConvertToManagedInvisible
        • ConvertToManuallyUpdated
        • ConvertToZBufferedSprite
        • DrawableBatches
        • ManagedPositionedObjects
        • ManualUpdate
        • MaxParticleCount
        • MoveToBack
        • OrderedSortType
          • Z
        • OrderedSprites
        • RemoveDrawableBatch
        • RemoveLayer
        • RemovePositionedObject
        • RemoveSprite
        • RemoveSpriteOneWay
        • SortTexturesSecondary
        • SortYSpritesSecondary
        • UnderAllDrawnLayer
      • TimeManager
        • Accumulating Time
        • CurrentScreenSecondsSince
        • CurrentTime
        • Profiling
        • SecondDifference
        • SecondsSince
        • SumTimeSection
        • SystemCurrentTime
        • TimeFactor
        • Working with TimeSpan
      • Utilities
        • StringFunctions
    • FlatRedBall.Forms
      • Controls
        • Button
        • CheckBox
        • ComboBox
        • FrameworkElement
          • DefaultFormsComponents
          • HandleTab
          • Show
          • Visual
        • Games
          • DialogBox
          • OnScreenKeyboard
          • SettingsView
        • ListBox
        • ListBoxItem
        • RadioButton
        • ScrollBar
        • ScrollViewer
        • Slider
        • StackPanel
        • TextBox
        • TreeView
        • TreeViewItem
      • MVVM
        • DependsOnAttribute
    • FlatRedBall Editor Plugin
      • customvariable
      • Introduction
      • flatredball-glue-elements-objectfinder
      • flatredball-glue-guidisplay-propertygriddisplayer
      • Introduction
      • flatredball-glue-projectmanager
      • Introduction
      • flatredball-glue-saveclasses-namedobjectsave
      • flatredball-glue-saveclasses-referencedfilesave
      • flatredball-glue
        • plugins
          • flatredball-glue-exportedinterfaces-igluestate
          • flatredball-glue-exportedinterfaces-igluxcommands-addreferencedfiletoglobalcontent
          • flatredball-glue-exportedinterfaces-igluxcommands
          • Introduction
          • flatredball-glue-exportedinterfaces-iprojectcommands-makeabsolute
          • flatredball-glue-exportedinterfaces-iprojectcommands
          • flatredball-glue-interfaces-icodegeneratorplugin
          • flatredball-glue-interfaces-imenustripplugin
          • Introduction
          • flatredball-glue-pluginbase-getfilesreferencedby
          • flatredball-glue-pluginbase
          • Introduction
        • vshelpers
          • codebuilditemadder
    • FlatRedBall Editor (Glue)
      • AssetTypeInfo
      • Cleaning Up Screens
      • CodeGeneration
        • ICodeBlock
      • CustomActivity
      • CustomLoadStaticContent
      • Entity
        • Introduction
        • glue-reference-entities-destroy
      • Game1CodeGenerator
      • GetFile
      • PauseThisScreen
      • SaveClasses
        • GlueSettingsSave
      • Screen
        • glue-reference-screens-pauseadjustedsecondssince
    • Live Edit
      • EditorVisuals
        • Circle
        • Text
      • Instance Creation
    • Gum Runtime
      • GraphicalUiElement
        • GetAbsoluteLeft
        • GetGraphicalUiElementByName
        • HasCursorover
        • InterpolateBetween
        • InterpolateTo
        • MoveToFrbLayer
        • RaiseChildrenEventsOutsideOfBounds
        • SetProperty
        • ShowLineRectangles
        • TestCollision
      • RenderingLibrary
        • camera
        • ipositionedsizedobject
        • graphics
          • Layer
          • text
            • textrenderingmode
    • iOS
      • uikit-uiviewcontroller
    • Microsoft.Xna.Framework
      • Audio
        • SoundEffect
        • SoundEffectInstance
      • Color
      • Introduction
      • Game
        • IsActive
        • IsFixedTimeStep
        • IsMouseVisible
        • TargetElapsedTime
      • GameWindow
        • Introduction
        • Introduction
        • handle
      • Graphics
        • Shared Parameters
        • model
        • spritebatch
        • GraphicsDevice
          • renderstate
          • SetRenderTarget
        • renderstate
          • referencealpha
        • Texture2D
          • Creating New Textures Programatically
      • GraphicsDeviceManager
        • supportedorientations
      • Media
        • MediaPlayer
        • Song
          • FromUri
      • Vector3
    • NAudio
      • NAudio_Song
    • SkiaGum
      • SkiaSpriteCanvas
      • Renderables
        • RenderableSkiaObject
    • State Interpolation
      • Tween
      • Tweener
      • TweenerManager
  • 🏘️Contributing
    • How to Contribute
    • Builds (Releases)
      • Gum
    • Writing Documentation
    • Contributing Code (Pull Requests)
    • Automated Test Project
    • Programming Style Guide
  • 🎮FlatRedBall Games
    • angry-boy
    • avatar-skate
    • avatar-word-wave
    • bobble-biker
    • box-the-gopher
    • cargo-crush
    • combo-red-moon-rising
    • cubism
    • eat-my-shuriken-and-die
    • elemento
    • food-battler
    • free-towels
    • gravi-dot
    • hyperdodge
    • juice-factory
    • operation-sd-space-defense
    • picture-puzzle-revolution
    • prismatic
    • quarantine
    • quest-for-freshness
    • star-stepper
    • steambirds
    • sticky-bump
    • tile-trip
    • trashman
    • tumble-heads
    • udder-chaos
    • without-escape
    • games-oniro
  • 🔴FlatRedBall Logo
  • Installing XNA in Visual Studio 2017
Powered by GitBook
On this page
  • Introduction
  • What kind of information can exist in CSVs?
  • Creating a new Project
  • Creating an Entity
  • Adding a Sprite to the Entity
  • Making the Sprite visible
  • Creating a Screen with an Animal
  • Creating a CSV
  • Making AnimalInfo a Dictionary
  • Including the AnimalInfo in the Animal Entity
  • Using AnimalInfo in behavior code
  • Loading content according to AnimalInfo
  • Order of Variables Matters!
  • Setting the AnimalInfo after initialization
  • Considerations and moving forward

Was this helpful?

Edit on GitHub
Export as PDF
  1. FlatRedBall Editor
  2. Files
  3. File Types
  4. Comma Separated Values (.csv)

Combining .csvs With Entities

PreviousComma Separated Values (.csv)NextCreatesDictionary

Last updated 10 months ago

Was this helpful?

Introduction

CSVs are a common way to define game data in FlatRedBall games. Examples of game data include the cost, damage, and rarity of weapons or stats of enemies like Orc, Dragon, and Elf. Usually this information is used in game logic to determine information like the maximum speed of a car or how much damage an attack deals. Fortunately Glue provides a flexible, powerful way to use CSV data in your game. This article provides an example of loading a CSV into an entity to control its movement speed.

What kind of information can exist in CSVs?

The type of information can be categorized into three groups:

  1. Simple coefficients like HP or AttackDamage for enemies in an RPG, or like Horsepower and Weight for cars in a racing game

  2. Content information such as which .PNG to use for a enemy, or which .scnx to load for a level

  3. Behavioral classes such as ability classes. Usually this feature requires usage of advanced CSV functionality such as lists and inheritance.

Creating a new Project

You will need a Glue project to follow along this tutorial. For information on how to create Glue projects, see .

Creating an Entity

In this tutorial we'll use an Entity called Animal. To create the Animal Entity:

  1. Right-click on the Entities item in Glue

  2. Select Add Entity

  3. Enter the name Animal and click OK

Adding a Sprite to the Entity

Next we'll add a Sprite to the Animal Entity so that it can be seen in our game. To do this:

  1. Expand the Animal Entity

  2. Right-click on Objects

  3. Select Add Object

  4. Select the Sprite type

  5. Enter the name MainSprite and click OK

Making the Sprite visible

The default Sprite will not have a Texture associated with it, therefore it won't be visible. To make the Sprite visible:

  1. Select the MainSprite object

  2. Set the ColorOperation value to "Color"

  3. Set the Red value to 1

  4. Set ScaleX to 64

  5. Set ScaleY to 64

Creating a Screen with an Animal

Next we'll create a Screen to verify that our Animal is working properly. To do this:

  1. Right-click on the Screens item in Glue

  2. Select "Add Screen"

  3. Enter the name "GameScreen" and click OK

  4. Move the mouse over the Animal Entity and push/hold the mouse button

  5. Drag the mouse down to the newly-created GameScreen and release the button

  6. Click "Yes" when prompted if you want to add an Animal to GameScreen

We will also want to set up our camera to be 2D. To do this:

  1. Click on the Settings menu item

  2. Select "Camera Settings"

  3. Change "Is 2D" to "True"

Now you can run the game and you should see your Animal appear as a red square:

Creating a CSV

At this point we have a basic project up and running: We can see our Animal Entity in our screen, although at this point the Animal Entity is simply a red square that doesn't do anything. Next we'll define a few animal types. To do this:

  1. Right-click on the "Global Content Files" item

  2. Select "Add File"->"New File"

  3. Select the "Spreadsheet (.csv)" file type

  4. Enter the name AnimalInfo for the file type

Once the file is created, double-click the file to open it in a spreadsheet editor. Modify the file so it contains the following information:

Name (required)

Speed (float)

Texture

Bear

60

Bear

Slug

20

Slug

Save the file to cause Glue to update the AnimalInfo class to match the new data entered in the CSV file.

Making AnimalInfo a Dictionary

Next we'll make the AnimalInfo file create a Dictionary - this will make working with the AnimalInfo easier. To do this:

  1. Select the AnimalInfo.csv file in "Global Content Files"

  2. Change the "CreatesDictionary" property to "True"

Including the AnimalInfo in the Animal Entity

If you have used Glue before, you may expect the next step to be adding a variable called "Speed" to the Animal Entity which can be assigned from the CSV. Instead of creating a new variable for Speed, we'll instead add a reference to the entire AnimalInfo inside the Animal Entity. To do this:

  1. Expand the Animal Entity

  2. Right-click on the Variables item

  3. Select "Add Variable"

  4. Select the "Create a new variable" radio button

  5. Select "GlobalContent/AnimalInfo.csv" as the type

  6. Enter "AnimalInfo" as the name

  7. Click "OK"

This new AnimalInfo variable can now be set in code or in Glue. For simplicity we'll set it in Glue; however, CSV variables like AnimalInfo are usually set in code according to player actions or game data. To set the variable:

  1. Select the newly-created AnimalInfo variable

  2. Set the DefaultValue to "Bear" using the drop-down

Using AnimalInfo in behavior code

Now we can use the AnimalInfo variable in our Animal's behavior code. To do this, add the following code in the CustomActivity in Animal.cs.

 InputManager.Keyboard.ControlPositionedObject(this, this.AnimalInfo.Speed);

Notice that the AnimalInfo and Speed variables are both supported in Visual Studio's autocomplete. Working with these Glue-created types and variables provides full autocomplete support so you know that you're writing the code correctly. Now try running the game and using the arrow keys on the keyboard to move your Animal entity. Also, try changing between the Bear and the Slug and you'll notice the Slug moves much slower. You can also modify the values in the CSV, then run your program again to notice the changes.

Memory Benefits: Since the types defined in CSVs are reference types (classes), then the Entity simply points to a reference of an AnimalInfo. While this might seem like a small gain (in the case of one Entity, it may not be a gain at all), consider a situation where you have numerous variables defined in a CSV, and you may have dozens or even hundreds of Entities that use these CSV values. In this case the reference characteristics of the CSV types is very beneficial. Furthermore, these references are not destroyed or recreated, so you will save on memory allocation and garbage collection if you are creating and destroying Entity instances.

Loading content according to AnimalInfo

Next we'll look at how to load content dynamically according to information in the AnimalInfo CSV. The approach we're going to show is a very powerful approach because it only loads information as needed. We'll be loading a Texture2D to apply to the Animal Sprite, however this approach can be used for any other data such as AnimationChains, Scenes, and ShapeCollections. Also, keep in mind that this is not limited to Entities - you can also use it on Screens to dynamically load data according to information in a CSV that defines level info. To add the textures to your project:

  1. Return to Glue

  2. Expand the Animal Entity

  3. Right-click on the Files item under Animal

  4. Select "Add File"->"Existing File"

  5. Select the Bear and click OK

  6. Repeat the above 3 steps and add the Slug

  7. Select the Slug and also set its "LoadedOnlyWhenReferenced" to "True"

Now we need to write a little bit of code to modify the Sprite according to the AnimalInfo. To do this:

  1. Open Animal.cs and delete the contents of CustomInitialize - we won't need this code anymore now that we're going to use textures.

  2. Select the AnimalInfo variable under Animal in Glue.

  3. Right-click on the "Events" item under Animal in Glue

  4. Select "Add Event"

  5. Verify "Expose an existing event" is selected

  6. Verify "AfterAnimalInfoSet" is selected as the existing event

  7. Click OK

  8. Expand the Events item and select the "AfterAnimalInfoSet" event

  9. Add the following code to the text box which appears on the left:

this.MainSprite.Texture = (Texture2D)GetFile(this.AnimalInfo.Texture);

Next we'll modify the Sprite's variables. To do this:

  1. Select the MainSprite object in Glue

  2. Right-click on the "ScaleX" variable and select "Reset to Default"

  3. Right-click on the "ScaleY" variable and select "Reset to Default"

  4. Set the PixelSize varaible to .5

  5. Set the ColorOpeartion to "Texture"

Order of Variables Matters!

A very common mistake when working with CSVs is to not properly order your variables. If you followed the tutorial above word-for-word, then your project will not have any variable order issues because there is only one variable - the CSV variable. However in larger Entities variable order problems can emerge. For starters, let's consider the example above where we have a single CSV variable which has a script that sets the Texture on a Sprite. The setup may look like this:

Specifically, we have just a CSV variable, and an event that is raised when the CSV variable (called AnimalInfo) is set. Next we'll tunnel in to the Sprite's Texture. To do this:

  1. Right-click on Variables

  2. Select the "Tunnel a variable in a contained object"

  3. Select "MainSprite" as the Object

  4. Select "Texture" as the Variable

  5. Set the Texture to "Slug"

  6. Set the AnimalInfo to "Bear"

Setting the AnimalInfo after initialization

So far we've shown how to set AnimalInfo in Glue. This is very handy for previewing things in GlueView, or for setting initial values; however it is likely that you will want to set values in custom code according to player actions or scripted events. To do this, you can simply access the AnimalInfo variable. To do this:

  1. Create a Screen (you don't need to do this if your game already has a Screen)

  2. Add an instance of Animal in your Screen

  3. Add the following code in your Screen's CustomInitialize:

this.AnimalInstance.AnimalInfo = GlobalContent.AnimalInfo[AnimalInfo.Bear];

Note: You may need to fully-qualify

AnimalInfo.Bear

Considerations and moving forward

While this example may seem to be simple, the approach we've taken here is incredibly scalable, efficient, and flexible. However, as with all approaches there are some things to consider:

  • All Entities that are given the same CSV object reference will share the same exact instance. This means that if you change a value (like the Bear's Speed) it will apply to all bears. Also, the CSVs are not destroyed when Entities or Screens are destroyed if put in Global Content Files, so changes will persist until the program is restarted. This can all cause confusing behavior if you are editing the CSV but not seeing changes that you expect to see. You should never change these values in code unless you have a very good reason to do so.

  • If you intend on modifying values, such as allowing each individual instance to have a speed boost according to the Animal's level, you should make a custom property that uses the base value and returns a modified value.

  • The texture for the Bear and Slug will not be loaded until either is needed. Since the AnimalInfo is set after content is done loading, it is done on a primary thread. In other words, this means you may notice a slowdown or freeze when loading content if you are loading a lot of content. For simplicity this tutorial only covers how to load the content on the primary thread, but you may want to pre-load content that you know you will need in CustomLoadStaticContent.

  • Changes in the CSV will immediately show up in code (as long as Glue is open). This means that if you remove a column from the CSV (such as the Speed column), then that variable will be removed from the matching class. Be careful removing or renaming columns as this may break existing code.

Save the following Bear.png and Slug.png images to your computer

Select the newly-added Bear file and set its "LoadedOnlyWhenReferenced" to "True"

Set its "CreatesEvent" variable to "True"

Run the game and you should see either the Slug or the Bear texture as your Entity.

At this point your Entity will show the Slug. You can verify this by either running GlueView, or by dropping the Animal Entity in a Screen and running the game. If you change the AnimalInfo variable, you will notice that the enemy continues to display the Slug no matter which value you set on AnimalInfo. The reason for this is because order matters. Since MainSpriteTexture appears below the AnimalInfo variable, it is set after. A good way to think about it is that variables are set from top to bottom - the same way that code is executed. You can fix this by right-clicking on the AnimalInfo variable and selecting to move it to bottom: This will make the CSV variable be set last. In general you will want to make CSV variables - and for that matter any variable which has events tied to it - as set last in your Entities and Screens.

. You can do this with CTRL+dot. More info

You can change this from Bear to Slug and the AnimalInstance will respond appropriately. Of course, you don't have to do this just in CustomInitialize, you can do this at any point, and on any Entity that supports this pattern, whether it is created in Glue, or .

📐
this page
here
created purely in code