/echo-flixel

A library to integrate echo physics with Haxeflixel!

Primary LanguageHaxeMIT LicenseMIT

echo-flixel

Integrate echo physics with Haxeflixel!

This library utilizes Haxeflixel's Plugin system to automatically work with the normal flixel workflow. It also adds a new button to Haxeflixel's debugger (click the new "E" icon in the top bar) for easy physics debugging.

Getting Started

echo-flixel requires Haxe 4.2+ to run.

Install the echo and echo-flixel libraries from haxelib:

haxelib install echo
haxelib install echo-flixel

Add the library into your Project.xml:

<haxelib name="echo-flixel" />

Usage

FlxEcho needs to be initialized, which should usually be done in your FlxState:

// using FlxEcho is the preferred way of interacting with the FlxEcho API
using echo.FlxEcho;

class PlayState extends FlxState 
{
  override function create() 
  {
    super.create();

    // Initialize  FlxEcho
    FlxEcho.init({width: FlxG.width, height: FlxG.height, gravity_y: 20});
  }
}

You can then add physics bodies to your FlxObjects:

// Create any kind of Sprite!
var sprite = new FlxSprite();

// Add a physics body
// (make sure you have the `using echo.FlxEcho` import in your hx file)
sprite.add_body();

// Add the Sprite to a FlxGroup
var player_group = new FlxGroup();

// NOTE! - This must be used instead of the normal way of adding objects to FlxGroups (ie - `player_group.add(sprite);`)
sprite.add_to_group(player_group);

Lastly, setup a listener and watch your new Physics bodies collide!

FlxEcho.listen(player_group, enemy_group);

Example

import flixel.FlxG;
import flixel.FlxObject;
import flixel.group.FlxGroup;
import flixel.FlxState;
import echo.util.verlet.Verlet;

// `using echo.FlxEcho`` is the preferred way of importing the FlxEcho API
using echo.FlxEcho;

class BasicSampleState extends FlxState {

  var objects:FlxGroup;
  var object_count:Int = 50;

  override function create() {
    super.create();

    // Initialize  FlxEcho
    FlxEcho.init({width: FlxG.width, height: FlxG.height, gravity_y: 20});

    // Draw the debug scene so we can see the Echo bodies
    FlxEcho.draw_debug = true;

    // Create a normal FlxGroup
    objects = new FlxGroup();

    // Create all the FlxObjects and their Echo bodies
    for (i in 0...object_count) {
      // Create a normal FlxObject
      var object = new FlxObject();

      var scale = FlxG.random.float(0.3, 1);

      // Add a body to the object
      object.add_body({
        x: FlxG.random.float(60, FlxG.width - 60),
        y: FlxG.random.float(0, FlxG.height / 2),
        elasticity: 0.7,
        rotation: FlxG.random.float(0, 360),
        shape: {
          type: POLYGON,
          radius:FlxG.random.float(16, 32),
          width: FlxG.random.float(16, 48),
          height: FlxG.random.float(16, 48),
          sides: FlxG.random.int(3, 8),
          scale_x: scale,
          scale_y: scale
        }
      });

      // Add the object to the FlxGroup
      // NOTE! - This must be used instead of the normal way of adding objects to FlxGroups (ie - `objects.add(object);`)
      object.add_to_group(objects);
    }

    // Add a Listener to collide all FlxObjects
    FlxEcho.listen(objects, objects);

    //  Add a Verlet Rope, just for fun!
    FlxEcho.instance.verlet.add(Verlet.rope([for (i in 0...10) new echo.math.Vector2(80 + i * 10, 70)], 0.7, [0]));
  }
}

Check the sample directory for all examples!