Skip to content

Instantly share code, notes, and snippets.

@01010111
Created August 11, 2020 16:08
Show Gist options
  • Save 01010111/99f2615b37dce6ca9f9f70b5eec74eb1 to your computer and use it in GitHub Desktop.
Save 01010111/99f2615b37dce6ca9f9f70b5eec74eb1 to your computer and use it in GitHub Desktop.
Flixel - tags and single overlap test
package states;
import flixel.FlxG;
import flixel.FlxObject;
import flixel.FlxSprite;
import flixel.FlxState;
import flixel.group.FlxGroup;
class PlayState extends FlxState
{
var objects:FlxTypedGroup<TaggedSprite> = new FlxTypedGroup();
var listeners:Array<Listener> = [];
var overlap_pairs:Array<Pair>;
var do_new_update:Bool = true;
var rs:FlxGroup;
var gs:FlxGroup;
var bs:FlxGroup;
override function create() {
rs = new FlxGroup();
gs = new FlxGroup();
bs = new FlxGroup();
add(rs);
add(gs);
add(bs);
for (i in 0...64) {
var r = new TaggedSprite(FlxG.width * Math.random(), FlxG.height * Math.random());
var g = new TaggedSprite(FlxG.width * Math.random(), FlxG.height * Math.random());
var b = new TaggedSprite(FlxG.width * Math.random(), FlxG.height * Math.random());
r.tags.push('r');
g.tags.push('g');
b.tags.push('b');
r.makeGraphic(16, 16, 0xFFFF004D);
g.makeGraphic(16, 16, 0xFF20FF00);
b.makeGraphic(16, 16, 0xFF0040FF);
r.velocity.set(Math.random() * 100, Math.random() * 100);
g.velocity.set(Math.random() * 100, Math.random() * 100);
b.velocity.set(Math.random() * 100, Math.random() * 100);
rs.add(r);
gs.add(g);
bs.add(b);
objects.add(r);
objects.add(g);
objects.add(b);
}
listeners.push({ tag1: 'r', tag2: 'g', fn: (o1, o2) -> FlxObject.separate(o1, o2) });
listeners.push({ tag1: 'g', tag2: 'b', fn: (o1, o2) -> FlxObject.separate(o1, o2) });
listeners.push({ tag1: 'b', tag2: 'r', fn: (o1, o2) -> FlxObject.separate(o1, o2) });
listeners.push({ tag1: 'r', tag2: 'r', fn: (o1, o2) -> o1.angle += 5 });
listeners.push({ tag1: 'g', tag2: 'g', fn: (o1, o2) -> o1.angle += 5 });
listeners.push({ tag1: 'b', tag2: 'b', fn: (o1, o2) -> o1.angle += 5 });
}
override function update(e:Float) {
super.update(e);
do_new_update ? new_update(e) : classic_update(e);
if (FlxG.keys.justPressed.SPACE) do_new_update = !do_new_update;
for (o in objects) FlxSpriteUtil.screenWrap(cast o);
}
function classic_update(dt:Float) {
FlxG.collide(rs, gs);
FlxG.collide(gs, bs);
FlxG.collide(bs, rs);
FlxG.overlap(rs, rs, (o1, o2) -> o1.angle -= 5);
FlxG.overlap(gs, gs, (o1, o2) -> o1.angle -= 5);
FlxG.overlap(bs, bs, (o1, o2) -> o1.angle -= 5);
}
function new_update(dt:Float) {
overlap_pairs = [];
FlxG.overlap(objects, objects, (o1, o2) -> overlap_pairs.push({ o1: o1, o2: o2 }));
for (listener in listeners) for (pair in overlap_pairs) {
if (pair.o1.tags.contains(listener.tag1) && pair.o2.tags.contains(listener.tag2)) listener.fn(pair.o1, pair.o2);
else if (pair.o1.tags.contains(listener.tag2) && pair.o2.tags.contains(listener.tag1)) listener.fn(pair.o2, pair.o1);
}
}
}
class TaggedSprite extends FlxSprite {
public var tags:Array<String> = [];
}
typedef Pair = {
o1:TaggedSprite,
o2:TaggedSprite,
}
typedef Listener = {
tag1:String,
tag2:String,
fn:FlxObject -> FlxObject -> Void
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment