Skip to content

Latest commit

 

History

History
243 lines (135 loc) · 11.1 KB

flatredball-features.md

File metadata and controls

243 lines (135 loc) · 11.1 KB

✨ FlatRedBall Features

Introduction

FlatRedBall is a set of technology for creating games on a variety of platforms. FlatRedBall focuses primarily on creating 2D games, although it does provide 3D support and full access to the underlying XNA-like system (MonoGame, FNA, Kni) for creating full 3D games.

FlatRedBall has been used to create dozens of commercial games on a variety of platforms. FlatRedBall's ultimate goal is to boost your productivity as a game developer and to help you ship your game on your target platform.

FlatRedBall Editor

The FlatRedBall Editor is a visual tool for creating and organizing screens, entities, and files.

FlatRedBall Editor

Project Setup Wizard

Use the wizard to get your game up and running in seconds.

The Project Setup Wizard can be used to start making a game in seconds

Tiled Integration

Tiled maps can be drag+dropped into the FlatRedBall Editor and loaded with no extra code. Use Tiled to define visuals, collision, and add entity instances.

Tiled Map in the FRB Editor

Gum UI Integration

FlatRedBall provides full integration with the Gum tool. Gum projects are added to your project and loaded by generated code, enabling the creation of UI from the very first click.

Gum UI Title Screen

Game Live Edit

Run your game in edit mode to make changes in real time.

Live edit in FRB

Hot Reload Files

Make changes to files such as Tiled (.tmx), Textures (.png), and spreadsheet (.csv) files and see the changes update in realtime.

Changes in Tiled update a game in realtime

Aseprite Integration

Native support for .aseprite files enables creating animated characters by drag+dropping files into the FlatRedBall Editor.

.aseprite file in FlatRedBall as an Animated Character

Clean Design and Theme support

FlatRedBall Editor supports customizing accent colors and changing between light and dark mode.

FlatRedBall Editor in Dark Mode

Customizable Rendering Using Shaders

Add built-in effects like Bloom and CRT with a few clicks, or create your own fully customizable shaders.

Bloom and CRT effects on a game

Platformer Controls and Physics

Creating a platformer has never been easier. Mark your entity as a Platformer or use the new project wizard to get production quality platformer physics and movement.

FRB provides platformer physics and controls

Built-in Damage System

The flexible damage system simplifies and standardizes dealing damage and reacting to receiving damage.

FRB Damage system simplifies combat code

Pathfinding

Create node networks from Tiled maps or in code to navigate maps.

Enemies navigating a map and chansing the player with their path visualization enabled

AnimationEditor Integration

Use the AnimationEditor to define animations for your characters using individual files or sprite sheets. Preview animations, adjust timing, and add shapes for collision or defining key positions.

FRB AnimationEditor

FlatRedBall.Forms

FlatRedBall.Forms is a flexible UI system similar to WPF and MAUI. It is fully integrated with Gum and has MVVM support.

FlatRedBall.Forms Contros

SkiaSharp Integration

Use SkiaSharp to render GPU-accelerated vector graphics in your game. Perform layout purely in code or use Gum.

SkiaSharp provides vector art rendering support

Spine Integration

Use all features in the Spine tool including defining skeletons, animations, and events.

Animated character in Spine

Spine files can be dropped in to your project and loaded with no code. Play animations at runtime in response to input or game events.

Animated character using Spine

Tweening (Interpolation)

Use built-in interpolation systems to move, resize, rotate, and color objects over time.

Sprites scaling up using "elastic" interpolation

Physics

Physics engine handles collision between circles, rectangles, polygons, and lines.

Circles colliding against rectangles, polygons, and other circles

Collision Relationships

Define collision relationships in UI or code to add physics, damage dealing, and custom events.

CollisionRelationship in FRB

Display Settings

Set your initial game's resolution, whether it supports resizing, aspect ratio, and more.

Display Settings in FRB

Camera Controlling Entity

The camera controlling entity can follow one or more targets, supports zooming, provides customizable tweening, and respects map bounds.

Camera controlling entity following targets and zooming

Realtime File Reference Tracking

Turn difficult-to-find runtime errors into clear in-editor errors the moment a file is changed or removed.

Missing file references are reported in the FRB error tab

MonoGame/FNA and NAudio Music

MonoGame and FNA Song support included out of the box. For more flexibility song files can be loaded using NAudio.

Song settings in FRB

CSV and Open Office/Libre Office Integration

Use CSV files or open office spreadsheet files to define your game data. FlatRedBall automatically generates the classes for loading your data and deserializes the files in geneated code.

Creating a CSV automatically generates a class with matching properties

Flexible Input

FRB input supports mouse, keyboard, touchscreen, and a variety of gamepads (Xbox, Switch, PlayStation, and PC) including direct and abstract access through a variety of interfaces.

ShootingInput = gamePad.RightTrigger.
    // primary is the A/B button, which is usually for jumping
    // shooting is usually X/Y
    Or(gamePad.DefaultSecondaryActionInput);

ReviveInput = gamePad.DefaultPrimaryActionInput;

PreviousWeaponInput = gamePad.GetButton(Xbox360GamePad.Button.LeftShoulder);
NextWeaponInput = gamePad.GetButton(Xbox360GamePad.Button.RightShoulder);

Localization Support

Add multiple languages to your game using a simple spreadsheet. Localization is automatically loaded and can be accessed through a LocalizationManager static class. Include multiple pages per string ID and add custom columns for your game's specific needs.

Example Localization File

Multiple Platforms

Target multiple platforms with the same code and content. FRB games can run on:

  • Windows
  • Browser
  • Mac
  • Linux
  • Android
  • iOS
  • Switch/Xbox using FNA AOT
  • PS4/PS5 using MonoGame AOT (coming soon)

Target multiple platforms with FRB

Full .NET C# (not scripted)

FlatRedBall projects are regular .NET projects with full access to modern C# syntax, the full .NET library, and NuGet packages. FlatRedBall Projects are regular Visual Studio project, enabling you to use your favorite IDE and debugger.

Write any valid C# including LINQ and async code

Open Source

FlatRedBall is fully open source using the MIT License. It is built using libraries which themselves are also open source. You can build your games without the worry of future inconveniences caused by license changes.

FlatRedball uses the MIT license

All Data is Text

All data created by FlatRedBall is in text format. The FlatRedBall Editor saves .json files and generates pure C# code files. Never worry about binary file conflicts wiping out your work again.

FRB data is text so you can inspect, debug, and diff easily

XNA-Like Foundation

FlatRedBall was built in the early days of XNA and has continued to grow, adding support for MonoGame and FNA. Your FlatRedBall game is a MonoGame/FNA game, and the full flexibility of these libraries is available to you.

Fusion Sentient - a FlatRedBall game using XNA Models for 3D graphics

Async Programming

FlatRedBall provides a syncrhonization context and multiple methods returning Tasks to simplify async programming.

private async Task DoRepeatablePhase2Logic(CancellationToken token)
{
    while(true)
    {
        await ShakeAndSpawnAnglerFish();
        await DoSpawnPhase2Groups(token);
     
        await TimeManager.DelayUntil(() => 
           EnemyList.All(item => item is not AnglerFish));

        await TimeManager.DelaySeconds(SecondsAfterAnglerFishToRespawn);

        if (DagonPhase2Instance.ShouldSplitAfterSlideUp)
        {
            phase2CancellationTokenSource.Cancel();
            break;
        }
    }
}