Code Monkey home page Code Monkey logo

monogame-aseprite's Introduction

MonoGame.Aseprite Logo
A Cross Platform C# Library That Adds Support For Aseprite Files in MonoGame Projects.

build-and-test NuGet 6.0.3 License: MIT Twitter

Monogame.Aseprite is a free and open source library for the MonoGame Framework that assists in importing Aseprite files into your game project. No need to export a spritesheet from Aseprite and have to deal with a PNG + JSON import. With MonoGame.Aseprite, you can use the Aseprite file directly.

Features

  • MonoGame.Aseprite internally uses AsepriteDotNet to read and parse the aseprite files. This means you get all the features of AsepriteDotNet including
    • Supports Aseprite files using RGBA, Grayscale, and Indexed color modes.
    • Supports all Aseprite layer blend modes.
    • Supports Aseprite tilesets, tilemap layers, and tilemap cels.
  • Provides processors to convert the Aseprite data into common formats including:
    • Sprite
    • SpriteSheet
    • TextureAtlas
    • Tileset
    • Tilemap
    • AnimatedTilemap

Installation

Install via NuGet

dotnet add package MonoGame.Aseprite --version 6.0.3

Usage

Please refer to the Examples directory for samples of how to use this library. Each example is thoroughly commented with information to show you how to load the Aseprite file and use it within Monogame.

What Next?

Games Made With MonoGame.Aseprite

The following are games that have been made using MonoGame.Aseprite as part of the content workflow in MonoGame

Game Developer Links

Superstar Strategy

Unnamed

Support

If you would like to support this project in any way, there are quite a few ways to do this no matter who you are.

If you would prefer to send me a tip/donation, you can do so at my Ko-fi page. This is always appreciated and all donations go towards funding projects of mine such as this one.

You can also support me through GitHub Sponsors. This and the Ko-Fi links can both be found in the sidebar to the right on this repository page.

The following is a list of amazing people that have donated to sponsor this project. If you have donated but weren't added to the list, please get in contact with me.


License

MonoGame.Aseprite is licensed under the MIT License. Please refer to the LICENSE file for full license text.

Contributors

Made with contrib.rocks.

monogame-aseprite's People

Contributors

aristurtledev avatar damarindra avatar fdrobidoux avatar manbeardgames avatar nobledemon avatar sephdb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

monogame-aseprite's Issues

`AsepriteFile.TryGetSlice(string, out AsepriteSlice)` Always Returns False

Description

User nobledemon reported on discord that AsepriteFile.TryGetSlice(string, out AsepriteSlice?) is returning false, even when the slice name provided exists.

Steps to Reproduce

  1. Create Aseprite file
  2. Add a slice to file named TestSlice
  3. Import Aspeirte File using MonoGame.Aseprite
  4. Use AsepriteFile.TryGetSlice("TestSlice", out AsepriteSlice? slice);

Expected Behavior

The method returns true and slice contains the AsepriteSlice instance found

Actual Behavior

The method returns false and slice is null

Configuration

  • Which version of .NET are you using?
    • .NET6.0
  • Which version of MonoGame are you using?
    • 3.8.1_HOTFIX
  • Which version of Aseprite are you using?
    • 1.3
  • What operating system and version, and what distro if applicable?
    • Windows 10 Home
  • What is the architecture (x86, x64)?
    • x64

Other Information

No response

`Slice.Origin` is not being set

Description

When any of the processors create a Slice object for a TextureRegion the constructor of the Slice class takes in the Origin as a parameter but the value is never set for the property.

Steps to Reproduce

  1. Import an Aseprite file that contains slices with pivot data
  2. Use the TextureAtlasProcessor or SpriteSheetProcessor to process the Aseprite file

Expected Behavior

The Slice.Origin value for any Slice element in any TextureRegion to contain the data from the slice's pivot data in Aseprite.

Actual Behavior

All Slice.Origin values are defaulted to Vector2.Zero

Configuration

Not Applicable

Other Information

This is occurring because the Slice.Origin value is never set in the constructor.
image

[Feature Request]: support for .ase files

Purpose

i tried to import .ase files in the mcgb content pipeline tool, but it used the OpenAssetImporter (wich obviously doesnt work here).

.aseprite extensions work but .ase would be good to have

Motivation

easier use

Use `TitleContainer.OpenStream` instead of `File.OpenRead()`

Purpose

For platform specific context, such as Android, File.OpenRead() is not well suited. MonoGame already offers a TitleContainer.OpenStream() method that considers the platform context when opening a file stream.

Motivation

Not using the TitleContainer could lead to issues for users. This request is also being opened to track #47

monogame update

Hello

Monogame 3.8.1 is released recently.
Would it be possible to update monogame-aseprite so it works with 3.8.1?

Thank you

XML Documentation not included in NuGet

Description

The auto generated XML documentation is not included in the version 4.0.0 NuGet package. Due to this, intellesense is not included for any types in the library.

Steps to Reproduce

  1. Create a new project dotnet new console -n Example -f net6.0
  2. Add MonoGame.Aseprite package dotnet add package MonoGame.Aseprite --version 4.0.0
  3. Reference any type from the library

Program.cs

using MonoGame.Aserpite;
AsperiteFile file;

Expected Behavior

When hovering over the AsepriteFile type in the example from the Steps to Produce section above, the intellesense should show the information included in the XML documentation like the <summary> tags.

Actual Behavior

The XML Documentation is not included int he intellesense.

Configuration

  • .NET Version: net6.0
  • MonoGame Not Applicable to issue.
  • Aserpite Version: Not applicable to issue.
  • Operating System: Mac OS Monterey 12.6.1
  • Architecture: x64

Other Information

No other information to provide.

[Feature Request]: AnimatedSprite Update with `double` parameter

Purpose

I'd like to have the option to pass a double instead of a float, for performance reasons.

Fix is basically to add this method in AnimatedSprite :

/// <summary>
///     Updates this <see cref="AnimatedSprite"/>.
/// </summary>
/// <remarks>
///     This should only be called once per update cycle.
/// </remarks>
/// <param name="deltaTimeInMilliseconds">
///     The amount of time, in milliseconds, that have elapsed since the last update cycle in the game.
/// </param>
public void Update(double deltaTimeInMilliseconds)
{
    GameTime fakeGameTime = new();
    fakeGameTime.ElapsedGameTime = TimeSpan.FromMilliseconds(deltaTimeInMilliseconds);
    Update(fakeGameTime);
}

Motivation

Improving performance so I don't have to convert a double to a float every single Update call.

Make it possible to edit animations

Make it possible to edit animations, especially the IsOneShot parameter would be useful to edit.
Currently I made a workaround where I duplicate an animation like this:

if (treeAnim.Animations.TryGetValue("anim", out Animation anim))
{
    anim.IsOneShot = false;
    anim.Name = "anim2";
    treeAnim.AddAnimation(anim);
}
treeAnim.Play("anim2");

Or is there a way to set oneshot animations from aseprite that I am not aware of?

Edit: I found your solution in #20, but I think it would still be useful to edit, delete or replace animations

Content Builder Failure

I'm using Monogame.Aseprite 2.0.3.3 and the the latest current Monogame packages (3.8.0.1641).

After adding the reference to the Monogame.Aseprite.ContentPipeline.dll in the content builder, I get an error when building stating:
Couldn't find a default importer for
'/build=/build/=reference../../../../Users/ME/=nuget/packages/monogame.aseprite/2.0.3.3/contentFiles/netstandar2.0/Monogage.Aseprite.ContentPipeline.dll'!

If I then add an aseprite file by adding an existing item in MGCB, I can assign the asprite importer and processor but the build fails with the same message and
"Failed to create importer 'AsepriteDocumentImporter'
on the imported aseprite file.

Workaround:
Edit the Content.mgcb file directly and remove the lines:

#begin /build=/reference:..\..\..\..\Users\ME\.nuget\packages\monogame.aseprite\2.0.3.3\contentFiles\netstandard2.0\MonoGame.Aseprite.ContentPipeline.dll
/importer:
/processor:
/build=/build=/reference:..\..\..\..\Users\ME\.nuget\packages\monogame.aseprite\2.0.3.3\contentFiles\netstandard2.0\MonoGame.Aseprite.ContentPipeline.dll

and change relative path:
/reference:..\..\..\..\Users\ME\.nuget\packages\monogame.aseprite\2.0.3.3\contentFiles\netstandard2.0\MonoGame.Aseprite.ContentPipeline.dll

to and absolute path:
/reference:C:\Users\ME\.nuget\packages\monogame.aseprite\2.0.3.3\contentFiles\netstandard2.0\MonoGame.Aseprite.ContentPipeline.dll

Alpha Premultiply Not Applied

The pixel data from Aseprite does not have premultiplied alpha. The SpriteBatch in MonoGame defautls to using a blend state that assumed premultiplied alpha. Processor needs to be adjusted to premultiply alpha for all Color values to match what is expected by default.

Change namespaces

In order to facility allowing users to import and process files at runtime, need to look into changing the namespaces of both the MonoGame.Aseprite and MonoGame.Aseprite.ContentPipeline assemblies.

Currently all importing and processing is done through the MonoGame.Aseprite.ContentPipeline.dll library In order for importing and processing to be performed during runtime, users would need to reference that library in their game project as well as the MonoGame.Aseprite.dll library.

The problem here is that both of these contain .Aseprite in their respective root namespaces, and it could potentially be confusing having the .ContentPipeline namespace as part of a completely different assembly.

Would potentially need to rename the namespaces to resolve this, which would be a breaking change.

Originally posted by @manbeardgames in #7 (comment)

Add ability to import tags from Aseprite as non-looping

Description

In the previous version of MonoGame.Aseprite it was possible to add the text [oneshot] to a tag in Aseprite, and then when it was imported, it was imported as a non-looping animation.

This was not carried over with the Version 4.0.0 update and should be re-implemented.

Steps to Reproduce

  1. Create an Aseprite file with multiple frames
  2. Create a Tag named anything as long as it has [oneshot] at the end of the name. (e.g. open_door[oneshot]
  3. Import the Asperite file in game using AsepriteFile.Load()
  4. Create a SpriteSheet with the SpriteSheetProcessor
  5. Create an AnimatedSprite based on the open_door tag
  6. Update the AnimatedSprite in the Update method and draw it in the Draw method
  7. Run the game

Expected Behavior

Since the tag has [oneshot] at the end of the name, it's expected it to not loop in line with the previous version of the library.

Actual Behavior

The animation continues to loop

Configuration

  • .NET Version: net6.0
  • MonoGame Version: 3.8.1
  • Aseprite Version: 1.3-beta21
  • Operating System: Mac OS Monterey 12.6.1
  • *Architecture: x64

Other Information

No other information to provide.

packages folder no being installed with VS 2019

Hi, I noticed the 'packages' folder doesn't get added when installing with NuGet on VS 2019.
I should mention Monogame templates don't work with vs2019 and I've had to use 'dotnet new mgdesktopgl' command to create project templates.

Luckily I have VS 2017 and just copied the packages folder from that. Just thought you might want to know

Stop method does nothing on a single animation document

Hello, I'm probably having an uncommon use case in my hands. I have an aseprite document with a single animation of 5 frames that I want it to run just once. I thought about doing this:

animatedSprite.OnAnimationEnd += animatedSprite.Stop;

but the animation loops anyway. I later found out the Pause method, but again it loops anyway with that too.

EDIT:
I tried OnAnimationLoop and it worked. I thought that OnAnimationEnd would fire after the last frame, my bad.

Using shared AnimatedSprite for multiple characters

Hi there, first let me thank you for this wonderful library.
Thanks to everyone who keeps this project going!

Scenario
Imagine a Lemmings-like scenario where you have multiple instances of the same animation. Since the animation is always the same, a single shared AnimationSprite should be sufficent to draw multiple characters at different positions. So far, this works as expected.

Problem
The animation of each character should be time-shifted, so that the animations do not run synchronously. Ideally there would be an offset that just shifts the animation in time. I have tried to forward and rewind the animation for each draw call with Update and IsReversed but nothing worked.

So, I'd like to suggest a feature that supports this use case - or find a workaround :-)

Aseprite v1.3 File Format Change

Aseprite Version 1.3 file format has changed. Importer/Processor needs to be updated to detect this change and handle file format appropriately

[Feature Request]: Add Support For Aseprite 1.3-rc1

Purpose

Support new features from Aseprite 1.3-rc1. Release notes can be found at https://community.aseprite.org/t/aseprite-v1-3-rc1/17224

Things from the release note that will need to be implemented are

  • [x] New Repeat field for animations tags
  • [x] New User Data Chunk fields for properties
  • [x] Possibly the new tagname format (--tagname-format). This might only affect the JSON export, so might not need to implement. (Doesn't need implementing)

Motivation

The motivation for this is to update MonoGame.Aseprite to support the latest release which is Aseprite 1.3-rc1.

example

Hi

Can wehave a bigger code example that is doing

  • load tilemap
  • load animated sprite
  • walk around the sprite character with arrow keys
  • collisions : howto define them in aseprite tilemap?

Thanks

Unable to compile json

I'm using MonoGame 3.8.0, with Newtonsoft.Json and Cross-Platform Desktop Development installed. I'm making a Cross-Platform project (OpenGL). Whenever I attempt to compile within MGCB it does this:
a Cannot find json The Newtonsoft.JSON errors appeared even before I had Newtonsoft installed. Any answers as to what's causing this problem?

Tilemap with flipped tiles renders in wrong orientation.

Description

Tile's that are flipped in a TileMap do not render in correct orientation.

Steps to Reproduce

Make tileset in aseprite.
Make tilemap in aseprite, with some flipped tiles (hold space then hit x,y and/or d to flip a tile when placing)
Import aseprite file directly into Monogame (not using the content pipeline)
When rendered, you should see the 'flipped' tiles in odd orientations. Results may vary.

Expected Behavior

Rendered tilemap looks the same in Aseprite as it does in Monogame.
expeceted-tilemap

Actual Behavior

Rendered tilemap looks off when rendered, only flipped tiles are off. They appear in the wrong orientation.
monogame-asepritre-flipped-tile-bug

Configuration

Aseprite v1.3.2
Monogame 3.8.1.whatever (the latest one)
MonoGame.Aseprite library version 5.1.3.-beta-2 (the latest one)

Other Information

No response

README links are all broken

Every link in your readme is broken. It seems you got rid of your github docs but never updated the README.

Dependency on DesktopGL causes DirectX projects to be forced to use OpenGL

Description

I'm using a DirectX project because of Monogame's limitations wrt texture arrays on OpenGL.
This project's dependency on MonoGame.Framework.DesktopGL causes that project to run in OpenGL mode, giving an exception that texture arrays aren't supported.

Steps to Reproduce

Create a DirectX Monogame project, and add this line to its LoadContent:

Texture2D tex = new(GraphicsDevice,100,100,false,SurfaceFormat.Color,2);

add the Monogame.Aseprite nuget package, try to run the project.

Expected Behavior

It should run and display the monogame cornflowerblue hello world.

Actual Behavior

When the nuget package is installed, you get an error on the creation of the texture array.

Configuration

  • .NET 7
  • Monogame 3.8.1
  • Windows x64

Other Information

You should in theory be able to not have the dependency on Monogame in the package, as Monogame.Extended does this too.

Error when building content. Pipeline needs reference to MonoGame.Aserpite assembly

Description

When attempting to build any content using the MonoGame.Aseprite.Content.Pipeline.dll reference in the mgcb-editor, an exception is thrown stating that it has no reference to the assembly MonoGame.Aseprite

Steps to Reproduce

  1. Create new monogame project, type doesn't matter, scenario below uses desktop gl
mkdir ./example
cd ./example
dotnet new sln -n Example
dotnet new mgdesktopgl -n Example
dotnet sln add ./Example
cd ./Example
dotnet add package MonoGame.Aseprite --version 5.0.0
dotnet restore
  1. Open the mgcb-editor
# from within the project directory
dotnet mgcb-editor ./Content/Content.mgcb
  1. Add the MonoGame.Aserpite.Content.Pipeline.dll reference to the mgcb-editor as documented here https://monogameaseprite.net/docs/getting-started/setup-mgcb-editor

  2. Add an aseprite file as content

  3. Choose any processor from the MonoGame.Aserpite.Content.Pipeline.dll reference

Expected Behavior

The content builds as expected

Actual Behavior

An exception is thrown stating that the MonoGame.Aseprite assembly could not be found

Configuration

  • Which version of .NET are you using?
    • any
  • Which version of MonoGame are you using?
    • 3.8.1
  • Which version of Aseprite are you using?
    • >= 1.2
  • What operating system and version, and what distro if applicable?
    • any
  • What is the architecture (x64, x64)?
    • any

Other Information

No response

Pipeline Extension doesn't appear to build .xnb on macOS

When I try to build a .ase file in my project when referencing this extension (I checked, it works without the .ase), I get the following error:

Unhandled exception. Microsoft.Xna.Framework.Content.ContentLoadException: The content file was not found.
---> System.IO.FileNotFoundException: Could not find file '/Users/gus/Projects/game-off-2021/src/GO21/Game/bin/Debug/netcoreapp3.1/Content/penguin.xnb'.
File name: '/Users/gus/Projects/game-off-2021/src/GO21/Game/bin/Debug/netcoreapp3.1/Content/penguin.xnb'
at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func2 errorRewriter)
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
at System.IO.FileStream.OpenHandle(FileMode mode, FileShare share, FileOptions options)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at Microsoft.Xna.Framework.TitleContainer.PlatformOpenStream(String safeName)
at Microsoft.Xna.Framework.TitleContainer.OpenStream(String name)
at Microsoft.Xna.Framework.Content.ContentManager.OpenStream(String assetName)

I checked and the file isn't there, and it doesn't appear to have been built. I'm on macOS M1, and I'm using Visual Studio for Mac. Thanks for any help!

`AnimatedSprite.Update(float)` and `AnimatedTilemap.Update(float)` both assume milliseconds when it should be seconds

Description

Both the AnimatedSprite.Update(float) and AnimatedTilemap.Update(float) functions have a parameter that expects the elapsed time in milliseconds. Using milliseconds is not a typical use case for delta time. Generally delta time is done in seconds.

Steps to Reproduce

The typical use case will use delta time as total seconds not total milliseconds

// Assume an AnimatedSprite was created during the LoadContent method

protected override void Update(GameTIme gameTime)
{
    float deltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
    _animatedSprite.Update(deltaTime);    
}

Expected Behavior

It would be expected that the animated sprite updates accordingly using the common format of delta time being in seconds.

Actual Behavior

The animated sprite is not updated as expected since it assumes delta time in milliseconds.

Configuration

Not applicable

Other Information

No response

Support importing for more than just animations

Currently the import process is designed for importing animations done in Aseprite. However, Aseprite can be used to create other types of assets like static images, such as background or icons. Aseprite also has support for slice data and can be used for things like ninepatch buttons.

Add link to sample project under the "Getting started" section of the documentation.

In the "Getting Started" section of the documentation, it recommends to the user that they should install nuget packages locally in the project, and then links to Microsoft's documentation about NuGet configuration. However MS's docs aren't always so clear. Adding a link to the sample project, or more specifically the nuget.config file within the sample project might make setup smoother for users who aren't as experienced with NuGet configuration (read: me), or are otherwise running into issue with configuring NuGet to install packages locally.

https://github.com/AristurtleDev/monogame-aseprite-examples/tree/main

Add option to import layers seperatly.

This was brought up on the discord server by Mooosik

I noticed that if I hide a layer in Aseprite, the layer will be hidden in Monogame aswell.
Being able to do enable / disable layers in Monogame would be super useful but I dont think its
possible yet, is it?

For example if I have one walk animation with several types of hand poses on other layers (for carrying
different types of items), i could just set the layer i need to "visible".

So ideally here, what would happen is instead of flattening the layers to a single layer texture, each layer itself would be its own texture data. One hurdle I can think of for this is how the blending between layers would be handled.

Extract loader to separate lib

This library seems to implement two separate pieces of functionality:

  • the monogame pipeline implementation, and
  • an Aseprite loader implementation.

As a separate package, the loader implementation could serve any kind of dotnet user, whether they're using the pipeline tool or not. The pipeline lib could then use this as a dependency and contain only the pipeline-related logic.

Import Aseprite File Directly

Support for importing an .ase/.aseprite file directly should be added instead of the current requirement of a PNG + JSON export from Aseprite for import.

Build issue trying to parse the first value

First, I must divulge that I have a very unorthodox way of importing my content into my game :

I have one project for each platform I currently support : DX and GL.

I also have a Content project, which holds all my content and the pipeline extension dlls. Those get imported later automatically using NoPipeline.

In my DX and GL projects, I have Content/Content.npl which is the file used by NoPipeline to create an MGCB file with all my assets from the Content project. It also automatically imports all the pipeline dlls like mentionned previously.

Here's the kicker : Your project isn't giving me your Pipeline dll in my bin folder, and I would need to refer to it from my .nuget folder, which isn't portable. I strive to keep things portable.

So I figured, what the heck, might as well just include the dlls directly in my Content project folder, then set them so they get copied into the bin folder like the rest.

Well... that fixed it. So yeah, a bit of a pain but it worked. That's my issue number 1 : I wish we could import the dll from the nuget without having to use an absolute path to the nuget package.


2nd issue is this : None of my aseprite files build correctly. They all get this error message in MGCB :

Unexpected character encountered while parsing value: ´┐¢. Path '', line 0, position 0.
7>   at Newtonsoft.Json.JsonTextReader.ParseValue()
7>   at Newtonsoft.Json.Linq.JObject.Load(JsonReader reader, JsonLoadSettings settings)
7>   at Newtonsoft.Json.Linq.JObject.Parse(String json, JsonLoadSettings settings)
7>   at Newtonsoft.Json.Linq.JObject.Parse(String json)
7>   at Ada2.Content.Pipeline.AsepriteSheet.AsepriteImporter.Import(String filename, ContentImporterContext context) in C:\Users\USERNAME\source\projects\Ada2\Ada2.Content\Pipeline\AsepriteSheet\AsepriteImporter.cs:line 22
7>   at Microsoft.Xna.Framework.Content.Pipeline.ContentImporter`1.Microsoft.Xna.Framework.Content.Pipeline.IContentImporter.Import(String filename, ContentImporterContext context) in /home/runner/work/MonoGame/MonoGame/MonoGame.Framework.Content.Pipeline/ContentImporter.cs:line 45

Any ideas if this is on my end or yours? I can give you a .aseprite file to test if needed.

EDIT: Here's a test file you can use.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.