SpriteWidget Viktor LidholtSpriteWidget [1143⭐] - Toolkit for building complex, high performance animations and 2D games by Viktor Lidholt.

Related tags

Gaming spritewidget
Overview

SpriteWidget

SpriteWidget is a toolkit for building complex, high performance animations and 2D games with Flutter. Your sprite render tree lives inside a widget that mixes seamlessly with other Flutter and Material widgets. You can use SpriteWidget to create anything from an animated icon to a full fledged game.

This guide assumes a basic knowledge of Flutter and Dart. Get support by posting a question tagged spritewidget on StackOverflow.

You can find examples in the examples directory, or check out the complete Space Blast game.

SpriteWidget

Adding SpriteWidget to your project

SpriteWidget is available as a standard package. Just add it as a dependency to your pubspec.yaml and you are good to go.

dependencies:
  flutter:
    sdk: flutter
  spritewidget:

Creating a SpriteWidget

The first thing you need to do to use SpriteWidget is to setup a root node that is used to draw it's contents. Any sprite nodes that you add to the root node will be rendered by the SpriteWidget. Typically, your root node is part of your app's state. This is an example of how you can setup a custom stateful widget with a SpriteWidget:

import 'package:flutter/material.dart';
import 'package:spritewidget/spritewidget.dart';

class MyWidget extends StatefulWidget {
  @override
  MyWidgetState createState() => new MyWidgetState();
}

class MyWidgetState extends State<MyWidget> {
  NodeWithSize rootNode;

  @override
  void initState() {
    super.initState();
    rootNode = new NodeWithSize(const Size(1024.0, 1024.0));
  }

  @override
  Widget build(BuildContext context) {
  	return new SpriteWidget(rootNode);
  }
}

The root node that you provide the SpriteWidget is a NodeWithSize, the size of the root node defines the coordinate system used by the SpriteWidget. By default the SpriteWidget uses letterboxing to display its contents. This means that the size that you give the root node will determine how the SpriteWidget's contents will be scaled to fit. If it doesn't fit perfectly in the area of the widget, either its top and bottom or the left and right side will be trimmed. You can optionally pass in a parameter to the SpriteWidget for other scaling options depending on your needs.

When you have added the SpriteWidget to your app's build method it will automatically start running animations and handling user input. There is no need for any other extra setup.

Adding objects to your node graph

Your SpriteWidget manages a node graph, the root node is the NodeWithSize that is passed in to the SpriteWidget when it's created. To render sprites, particles systems, or any other objects simply add them to the node graph.

Each node in the node graph has a transform. The transform is inherited by its children, this makes it possible to build more complex structures by grouping objects together as children to a node and then manipulating the parent node. For example the following code creates a car sprite with two wheels attached to it. The car is added to the root node.

Sprite car = new Sprite.fromImage(carImage);
Sprite frontWheel = new Sprite.fromImage(wheelImage);
Sprite rearWheel = new Sprite.fromImage(wheelImage);

frontWheel.position = const Offset(100, 50);
rearWheel.position = const Offset(-100, 50);

car.addChild(frontWheel);
car.addChild(rearWheel);

rootNode.addChild(car);

You can manipulate the transform by setting the position, rotation, scale, and skew properties.

Sprites, textures, and sprite sheets

To load image resources, the easiest way is to use the ImageMap class. The ImageMap can load one or multiple images at once.

The Image class isn't automatically imported through flutter/material, so you may need to add an import at the top of your file.

import 'dart:ui' as ui show Image;

Now you can load images using the ImageMap. Note that the loading methods are asynchronous, so this example code will need to go in an asynch method. For a full example of loading images see the Weather Demo.

ImageMap images = new ImageMap(rootBundle);

// Load a single image
ui.Image image = await images.loadImage('assets/my_image.png');

// Load multiple images
await images.load(<String>[
  'assets/image_0.png',
  'assets/image_1.png',
  'assets/image_2.png',
]);

// Access a loaded image from the ImageMap
image = images['assets/image_0.png'];

The most common node type is the Sprite node. A sprite simply draws an image to the screen. Sprites can be drawn from Image objects or SpriteTexture objects. A texture is a part of an Image. Using a SpriteSheet you can pack several texture elements within a single image. This saves space in the device's gpu memory and also make drawing faster. Currently SpriteWidget supports sprite sheets in json format and produced with a tool such as TexturePacker. It's uncommon to manually edit the sprite sheet files. You can create a SpriteSheet with a definition in json and an image:

SpriteSheet sprites = new SpriteSheet(myImage, jsonCode);
SpriteTexture texture = sprites['texture.png'];

The frame cycle

Each time a new frame is rendered to screen SpriteWidget will perform a number of actions. Sometimes when creating more advanced interactive animations or games, the order in which these actions are performed may matter.

This is the order things will happen:

  1. Handle input events
  2. Run animation motions
  3. Call update functions on nodes
  4. Apply constraints
  5. Render the frame to screen

Read more about each of the different phases below.

Handling user input

You can subclass any node type to handle touches. To receive touches, you need to set the userInteractionEnabled property to true and override the handleEvent method. If the node you are subclassing doesn't have a size, you will also need to override the isPointInside method.

class EventHandlingNode extends NodeWithSize {
  EventHandlingNode(Size size) : super(size) {
    userInteractionEnabled = true;
  }

  @override handleEvent(SpriteBoxEvent event) {
    if (event.type == PointerDownEvent)
      ...
    else if (event.type == PointerMoveEvent)
      ...

    return true;
  }
}

If you want your node to receive multiple touches, set the handleMultiplePointers property to true. Each touch down or dragged touch will generate a separate call to the handleEvent method, you can distinguish each touch by its pointer property.

Animating using motions

SpriteWidget provides easy to use functions for animating nodes through motions. You can combine simple motion blocks to create more complex animations.

To execute a motion animation you first build the motion itself, then pass it to the run method of a nodes motion manager (see the Tweens section below for an example).

Tweens

Tweens are the simplest building block for creating an animation. It will interpolate a value or property over a specified time period. You provide the MotionTween class with a setter function, its start and end value, and the duration for the tween.

After creating a tween, execute it by running it through a node's motion manager.

Node myNode = new Node();

MotionTween myTween = new MotionTween<Offset> (
  (a) => myNode.position = a,
  Offset.zero,
  const Offset(100.0, 0.0),
  1.0
);

myNode.motions.run(myTween);

You can animate values of different types, such as floats, points, rectangles, and even colors. You can also optionally provide the MotionTween class with an easing function.

Sequences

When you need to play two or more motions in a sequence, use the MotionSequence class:

MotionSequence sequence = new MotionSequence([
  firstMotion,
  middleMotion,
  lastMotion
]);

Groups

Use MotionGroup to play motions in parallel:

MotionGroup group = new MotionGroup([
  motion0,
  motion1
]);

Repeat

You can loop any motion, either a fixed number of times, or until the end of times:

MotionRepeat repeat = new MotionRepeat(loopedMotion, 5);

MotionRepeatForever longLoop = new MotionRepeatForever(loopedMotion);

Composition

It's possible to create more complex motions by composing them in any way:

MotionSequence complexMotion = new MotionSequence([
  new MotionRepeat(myLoop, 2),
  new MotionGroup([
  	motion0,
  	motion1
  ])
]);

Handle update events

Each frame, update events are sent to each node in the current node tree. Override the update method to manually do animations or to perform game logic.

MyNode extends Node {
  @override
  update(double dt) {
    // Move the node at a constant speed
  	position += new Offset(dt * 1.0, 0.0);
  }
}

Defining constraints

Constraints are used to constrain properties of nodes. They can be used to position nodes relative other nodes, or adjust the rotation or scale. You can apply more than one constraint to a single node.

For example, you can use a constraint to make a node follow another node at a specific distance with a specified dampening. The dampening will smoothen out the following node's movement.

followingNode.constraints = [
  new ConstraintPositionToNode(
    targetNode,
    offset: const Offset(0.0, 100.0),
    dampening: 0.5
  )
];

Constraints are applied at the end of the frame cycle. If you need them to be applied at any other time, you can directly call the applyConstraints method of a Node object.

Perform custom drawing

SpriteWidget provides a default set of drawing primitives, but there are cases where you may want to perform custom drawing. To do this you will need to subclass either the Node or NodeWithSize class and override the paint method:

class RedCircle extends Node {
  RedCircle(this.radius);

  double radius;

  @override
  void paint(Canvas canvas) {
    canvas.drawCircle(
      Offset.zero,
      radius,
      new Paint()..color = const Color(0xffff0000)
    );
  }
}

If you are overriding a NodeWithSize you may want to call applyTransformForPivot before starting drawing to account for the node's pivot point. After the call the coordinate system is setup so you can perform drawing starting at origo to the size of the node.

@override
void paint(Canvas canvas) {
  applyTransformForPivot(canvas);

  canvas.drawRect(
    new Rect.fromLTWH(0.0, 0.0, size.width, size.height),
    myPaint
  );
}

Add effects using particle systems

Particle systems are great for creating effects such as rain, smoke, or fire. It's easy to setup a particle system, but there are very many properties that can be tweaked. The best way of to get a feel for how they work is to simply play around with the them.

This is an example of how a particle system can be created, configured, and added to the scene:

ParticleSystem particles = new ParticleSystem(
  particleTexture,
  posVar: const Point(100, 100.0),
  startSize: 1.0,
  startSizeVar: 0.5,
  endSize: 2.0,
  endSizeVar: 1.0,
  life: 1.5 * distance,
  lifeVar: 1.0 * distance
);

rootNode.addChild(particles);
Comments
  • It's dead, Jim

    It's dead, Jim

    It seems that Victor left google in 2016 and has since almost stopped supporting this project and Google seems to not invest into it anymore.

    There are some stupid bugs like the 180.8 one in convreting deg->rad. There are also some other issues, like spriteBox not being propagated below the first level of root node children. I also feel like state management is missing / current way of handling root node goes against flutter stateless design etc...

    The biggest obstacle I see for forking is a lack of official license. Although, the pub.dev page lists Victor as author (but if he worked for Google at the time Google probably owns the IP) and BSD as license. I guess we could seek clarification through Victor / flutter team.

    Is there anyone interesting in contributing to a fork?

    opened by TheKashe 15
  • library not compatible with latest flutter dev version

    library not compatible with latest flutter dev version

    Running with flutter version:

    ~ flutter --version Flutter 1.6.3 • channel dev • https://github.com/flutter/flutter.git Framework • revision bc7bc94083 (5 days ago) • 2019-05-23 10:29:07 -0700 Engine • revision 8dc3a4cde2 Tools • Dart 2.3.2 (build 2.3.2-dev.0.0 e3edfd36b2)

    Error:

    Compiler message: /spritewidget-0.9.18/lib/src/image_map.dart:31:29: Error: The argument type 'void Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.

    • 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('/image_stream.dart').
    • 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('/image_stream.dart'). Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'. stream.removeListener(listener); ^ image_map.dart:33:24: Error: The argument type 'void Function(ImageInfo, bool)' can't be assigned to the parameter type 'ImageStreamListener'.
    • 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('/image_stream.dart').
    • '/image_stream.dart' ('/image_stream.dart'). Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'. stream.addListener(listener);
    opened by torvalde 7
  • Null safety version

    Null safety version

    Hi everyone,

    i've migrated spritewidget to null safety version, available here on nullsafety branch.

    The codebase is my slightly modified version with some minor bugfixes, check version history to see how it differs from spritewidget master.

    Regarding nullsafety, I've done very conservative migration with as little changes as possible. Original codebase is using some patterns which are IMO not the best practice with the current dart version, but I didn't touch that. On the plus side, there was a lot of null checks in the code base, so now nullable variables should make no problems.

    The biggest issue is that some fields are initialised late through some kind of state transitions. I did not analyse if everything is initialised properly, but my app and the examples work.

    I use a small subset of spritewidget in my project so some parts could break, mostly the late variables. In some cases I did't know how to handle null value and went with what seems sensible default (e.g. Offset.zero or double 0.0). Not sure on the potential effects.

    Hope somebody finds it valuable.

    opened by TheKashe 4
  • Spritewidget broken with flutter >= 1.23

    Spritewidget broken with flutter >= 1.23

    There are some changes in the beta channel of flutter (currently Flutter 1.23.0-18.1.pre • channel beta • https://github.com/flutter/flutter.git) that break spritewidget. This will likely impact more people as these changes make their way into stable, and therefore this should be considered a critical issue.

    1. PointerHoverEvent has been added to flutter: Spritewidget assumes only 4 pointer event types (Down, Move, Up, Cancel) and doesn't do anything with 'Hover'. As a result there can be null pointer exceptions that flutter reports from the gesture handing code. One fix is to check for null and replace with an empty list of Node in spritewidget Node::handleEvent() method.

    2. Sub-classes of PointerEvent types have been added in flutter. In spritewidget, the 4 assumed types are recognized using their .runTimeType method in a SpriteBoxEvent. With the addition of sub-classes of these pointer events, the runTimeTypes are not handled, and so are missed. For example, a _TransformedPointerDownEvent, which is a PointerDownEvent is not handled, and so is missed, resulting in unexpected (or no) behavior. A fix for this is to have the SpriteBoxEvent take, and then handle, the PointerEvents directly, rather than work with runTimeType.

    Below is an example of how to fix these problems.

    index 9418ad8..837e060 100644
    --- a/examples/particledesigner/lib/particle_world.dart
    +++ b/examples/particledesigner/lib/particle_world.dart
    @@ -31,11 +31,11 @@ class ParticleWorld extends NodeWithSize {
       }
    
       @override bool handleEvent(SpriteBoxEvent event) {
    -    if (event.type == PointerDownEvent || event.type == PointerMoveEvent) {
    +    if (event.type is PointerDownEvent || event.type is PointerMoveEvent) {
           particleSystem.insertionOffset = convertPointToNodeSpace(event.boxPosition) - const Offset(512.0, 512.0);
         }
    
    -    if (event.type == PointerDownEvent) {
    +    if (event.type is PointerDownEvent) {
           particleSystem.reset();
         }
    
    diff --git a/lib/src/sprite_box.dart b/lib/src/sprite_box.dart
    index c291dd1..3983ea9 100644
    --- a/lib/src/sprite_box.dart
    +++ b/lib/src/sprite_box.dart
    @@ -236,12 +236,12 @@ class SpriteBox extends RenderBox {
         }
    
         // Pass the event down to nodes that were hit by the pointerdown
    -    List<Node> targets = entry.nodeTargets;
    +    List<Node> targets = entry.nodeTargets ?? <Node>[];
         for (Node node in targets) {
           // Check if this event should be dispatched
           if (node.handleMultiplePointers || event.pointer == node._handlingPointer) {
             // Dispatch event
    -        bool consumedEvent = node.handleEvent(new SpriteBoxEvent(globalToLocal(event.position), event.runtimeType, event.pointer));
    +        bool consumedEvent = node.handleEvent(new SpriteBoxEvent(globalToLocal(event.position), event, event.pointer));
             if (consumedEvent == null || consumedEvent)
               break;
           }
    @@ -256,7 +256,7 @@ class SpriteBox extends RenderBox {
    
       @override
       bool hitTest(HitTestResult result, { Offset position }) {
    -    result.add(new _SpriteBoxHitTestEntry(this, position));
    +    result.add(_SpriteBoxHitTestEntry(this, position));
         return true;
       }
    @@ -538,7 +538,7 @@ class SpriteBoxEvent {
       ///     if (event.type == PointerDownEvent) {
       ///       // Do something!
       ///     }
    -  final Type type;
    +  final PointerEvent type;
    
       /// The id of the pointer. Each pointer on the screen will have a unique pointer id.
       ///
    diff --git a/lib/src/virtual_joystick.dart b/lib/src/virtual_joystick.dart
    index ac1df58..df0300a 100644
    --- a/lib/src/virtual_joystick.dart
    +++ b/lib/src/virtual_joystick.dart
    @@ -43,12 +43,12 @@ class VirtualJoystick extends NodeWithSize {
    
       @override
       bool handleEvent(SpriteBoxEvent event) {
    -    if (event.type == PointerDownEvent) {
    +    if (event.type is PointerDownEvent) {
           _pointerDownAt = event.boxPosition;
           motions.stopAll();
           _isDown = true;
         }
    -    else if (event.type == PointerUpEvent || event.type == PointerCancelEvent) {
    +    else if (event.type is PointerUpEvent || event.type is PointerCancelEvent) {
           _pointerDownAt = null;
           _value = Offset.zero;
           MotionTween moveToCenter = new MotionTween((a) { _handlePos = a; }, _handlePos, _center, 0.4, Curves.elasticOut);
    
    opened by squashmode 2
  • SpriteBox::handleEvent The method doesn't override an inherited method.

    SpriteBox::handleEvent The method doesn't override an inherited method.

    In sprite_box.dart handleEvent doesn't over ride a method in a parent class. And the signature for renderbox does not match. @override void handleEvent(PointerEvent event, _SpriteBoxHitTestEntry entry) {....}

    I believe this is causing my Nodes to not respond to event.s

    opened by arisbartee 2
  • TexturedLine

    TexturedLine

    So I'm trying to use the TexturedLine() class. I've searched for examples, I've poured over what there is of the documentation. I've failed to get it to produce any output. Then I've noticed the paint method of TexturedLine() currently says this:

    //TODO: Fix //canvas.drawVertices(VertexMode.triangles, vertices, textureCoordinates, verticeColors, BlendMode.modulate, indices, _cachedPaint);

    I'm guessing this explains my failures. Are there any plans to get this implemented? Or should I try and roll my own?

    opened by AndyAstrand 2
  • How to do collision detection?

    How to do collision detection?

    Hi. First of all, thanks for the great work on the library!

    I was wondering how you would recommend doing collision detection? I'm thinking that there should be a relatively easy way to check if a node is touching other nodes, but I can't seem to figure it out.

    Thank you in advance.

    opened by Lasse-Fisker 2
  • Need to modify filterQuality

    Need to modify filterQuality

    I'm using pixel art. Very low res sprites. And without setting the filterQuality on the Paint() object to 'none' they end up looking like trash. I forked just to make this one change to the code base.

    I know the project is dead, but I figured I'd create this issue to document the need.

    enhancement 
    opened by dragonfax 1
  • Performance questions

    Performance questions

    Hello. I'm considering Flutter and frameworks built on Flutter, to mak a mobile game, and i'm curious regarding Flutter's ability for performance compared to other cross platform frameworks like Love2d / Corona etc., where you have a C++ / OpenGL library, handling the low level graphics stuff, with Lua on top. I know Flutter is using Skia, which is a low level library, and using OpenGL / Metal for rendering, but i wonder how third party widgets are able to tap into low level API's in order to access this performance for fast rendering of let's say lot's of 2d sprites / textured quads etc, in the same manner that other mentioned frameworks would, which is built for this use case specifically. I have not looked deep into this framework or low level Flutter rendering capabilities yet, so excuse my ignorance. But i'm happy if you would like to explain some of the features, limitations. Thank you and feel free to close this. Btw the Space Blast game looks performant and awesome :-)

    opened by erf 1
  • Fix for breaking change in ImageStream in Flutter v1.6.2.

    Fix for breaking change in ImageStream in Flutter v1.6.2.

    Spritewidget was not able to compile after Flutter v1.6.2 due to a breaking change in ImageStream. See this link: https://groups.google.com/forum/#!topic/flutter-announce/NWTszrEq9U0

    opened by drost 1
  • Apple reject

    Apple reject

    I have the problem when upload the game to apple store when use this framework as the main graphics engine

    1. 7 Design: HTML5 Games, Bots, etc. Guideline 4.7 - Design - HTML5 Games, Bots, etc.

    We noticed that your app offers HTML5-based games, but the games appear to be an incidental feature that do not deeply enhance or enrich the user’s experience.

    Next Steps

    To resolve this issue, please remove any HTML5-based games from your app that are not directly related to your app’s core functionality.

    Please see attached screenshot for details.

    . attachment-3334981558162093448Screenshot-0528-093750

    opened by namtruongsg 1
  • Assigning SpriteBoxes to child trees

    Assigning SpriteBoxes to child trees

    In my game I add children in the constructor of dynamically added parent node classes. Currently this pattern is not possible when those child nodes uses operations that depends on their underlying SpriteBox, since only the parent node gets the SpriteBox assigned when it is added.

    This fixes it. Perhaps a bit of a bandaid solution to a bigger problem. You decide if it's worth it.

    opened by Feenposhleen 0
  • Support for

    Support for "multiply sprite sheets" and "one json file"

    Hello,

    I saw form the example that I can load one sprite sheet and one json file to SpriteSheet class.

    But what if I have multiply sprite sheets (generated from TexturePacker) and one json.

    Is there anyway the widget can support it?

    I'm trying to convert some 3D rendered animation into sprites and use it in my Flutter App.

    Thanks!

    Yishi

    enhancement 
    opened by yishiyang 1
  • Sprite box set rootNode should reset _eventTargets

    Sprite box set rootNode should reset _eventTargets

    Short story: if root node is changed, _eventTargets need to be reset (set to null), or future events will be raised on Nodes which are not part of active node tree anymore.

    The bigger picture is that spritewidget seems to expect that root node doesn't change between calls to State.build, e.g., the rootNode is expected to be a var in the state object, always passed to the SpriteWidget.

    If a new Node is created in .build, it will raise the issue with _evenTargets not being cleared.

    bug 
    opened by TheKashe 1
  • Pointer event not fired when Pivot is set

    Pointer event not fired when Pivot is set

    If a NodeWithSize has pivot set (e.g. to 0.5,0.5), SpriteBox doesn't add such Node to pointer event targets.

    I believe that's because in Offset posInNodeSpace = node.convertPointToNodeSpace(entry.localPosition); , the conversion is not considering pivot and returns un-pivoted coordinates, while the next line node.isPointInside(posInNodeSpace) calculates points relative to the pivot.

    The end result is that in some cases (depending on coordinates and pivot), node is not recognised as event target, even though it should be.

    This seems to be related to #26.

    bug 
    opened by TheKashe 2
  • Feature request, Clipping, Device Assets

    Feature request, Clipping, Device Assets

    You are the author of cocos2d! That's not strange if I'm very familiar with the structure and syntax of this library at the very beginning because I'm a heavy user of cocos2d.

    So for this issue, I want to request some features that lack very much.

    Clipping will make the library very useful if I'm using it in an app instead of a game. But I still see advantages to use in games, such as icons, cut scenes, etc.

    Using assets based on device is the most missing feature I think. Textures should be used as the way flutter does.

    Though I think it's a very good start point for flutter to make 2d games or rich animation widgets. Keep going, buddy! We are counting on you!

    enhancement 
    opened by rockingdice 2
  • Feature/lib gdx atlas loader

    Feature/lib gdx atlas loader

    Implement a laoding "Sprite Atlas", which is the spritesheet format of libgdx TexturePacker (https://github.com/libgdx/libgdx/wiki/Texture-packer)

    opened by RudolfVonKrugstein 1
Owner
null
An awesome list that curates the best Flame games, projects, libraries, tools, tutorials, articles and more.

Awesome Flame A curated list of games, libraries, and articles related to the Flame Engine for Flutter. Flame is a minimalist 2D game engine for Flutt

Flame Engine 650 Jan 9, 2023
A simple wrapper on top of Google Play Games Services (GPGS), including auth, achievement, and more.

play_games Use Google Play Games Services on your Flutter app; this allows for signin and achievements so far, but more additions are very welcome. If

Flame Engine 59 Sep 10, 2022
A graphics engine for creating 2D games. Creating objects based on composition and painting on canvas.

A graphics engine for creating 2D games. Creating objects based on composition and painting on canvas.

Stanislav 10 Oct 26, 2022
A Flutter plugin to support game center and google play games services.

A Flutter plugin to support game center and google play games services. Screenshot iOS Android Tutorials Written tutorial Video tutorial Will be added

Abedalkareem Omreyh 76 Jan 6, 2023
An example Flutter app showing how to easily integrate with Flame games

space_burger A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if

Erick 4 Jun 4, 2021
A social media for games.

Gamiac A gaming social media app. Play, Post & Interact . Download Gamiac Are you a Gamer ?? ? If yes then GAMIAC is especially for YOU ?? . What is G

ANIKET SINDHU 20 Jul 15, 2021
Epic Games Flutter UI

Epic Games Flutter UI A flutter implementation of the Epic Games Concept Home Page by Andrey Artamonov. A screenshot: Getting Started ?? You need the

Albert Oboh 115 Nov 5, 2022
🃏 Get coinched ! Flutter app using Firebase SDK to save your card games

?? Get coinched ! Flutter app using Firebase SDK to save your card games. You can save your games of French Belote, Coinche Belote, Contrée Belote or Tarot and compare your statistics with your friends

Valentin REVERSAT 4 Dec 26, 2022
Games Poker developed using Flutter

Adeku Akur (Aku dan Kamu Devs Games Asian Poker User) Games Poker developed usin

Ananda Rauf 1 Dec 21, 2021
Mini Game Manager for games

Mini-Game-Manager Mini Game Manager for games that don't come on your favorite platforms such as steam or origin. The focus of this app is to create a

Mehrzad Bazhdanzadeh 2 Nov 3, 2022
EscapeGameKit is a package, entirely built using Flutter, that helps creating escape games.

??️‍♂️ EscapeGameKit EscapeGameKit is a package, entirely built using Flutter, that helps creating escape games. It is better suited for web and deskt

Hugo Delaunay 10 Dec 24, 2022
Frame is yet another map editor for Pokémon GBA games

Frame Frame is yet another map editor for Pokémon GBA games. Features Undo / redo ... and many more to come! This project is still in its very early s

null 8 Oct 31, 2022
Collection of 2D mobile games in a single mobile application.

Omaplay A Collection of 2D mobile games in a single mobile application Oma what ? Omaplay... I had the idea to create a mobile application that will c

Brice Kamhoua 2 Sep 14, 2022
A Chess Dapp built on Polygon with staking, NFT art and collectible marketplace, and the best DAO

Pawn Wars A chess Dapp built on Polygon, Stake tokens and win $MATIC, BUY NFT powerups and chess board skins! Become the $GAMBIT master in Pawn Wars!!

Sameer Kashyap 23 Nov 14, 2022
Cyberpunk-inspired puzzle game prototype created with Flutter and Flame #Hack20 #FlutterHackathon

Ghost Rigger Prototype of a cyberpunk-inspired puzzle game set in a dystopian future: In the year 2078, the megacorporation Native Development Initiat

Float like a dash Sting like a dart 184 Dec 26, 2022
Snaake is a small and very simple clone of the classic snake game from Nokia phones.

Snaake Snaake is a small and very simple clone of the classic snake game from Nokia phones. Description The objective is very simple: eat the colorful

Lucas Nunes 64 Aug 9, 2022
Break Guns Using Gems is a fast paced side-scrolling platformer with innovative controls and a gun-related twist.

BGUG Break Guns Using Gems is an open-source mobile game for Android and iOS. It's a fast paced side-scrolling platformer with innovative controls and

Fire Slime Games 86 Nov 12, 2022
A game powered by Flutter and Flame

Flutters About Flutters is a demo game powered by Flutter and Flame. I wrote it to test out its performance and gaming capabilities and decided to ope

Florentin / 珞辰 184 Jan 8, 2023
A simple 2D multiplayer online game built using Flutter and Flame engine

Club Penguin Introduction ?? Club Penguin A multiplayer game involving penguins and anonymous chat in a virtual 2D world Before we start, you can take

Sanjeev Madhav 67 Dec 24, 2022