Luxe kitchen sink test

August 3, 2015 ยท View on GitHub

import luxe.Component; import luxe.Input; import luxe.Parcel; import luxe.ParcelProgress; import luxe.Rectangle; import luxe.Sprite; import luxe.Color; import luxe.tween.easing.*; import luxe.Text; import luxe.tween.Actuate; import luxe.Vector; import luxe.Quaternion; import luxe.utils.Maths; import luxe.Visual; import phoenix.Shader; import phoenix.Texture;

/* Features: Drawing geometry Loading images Timers Events Entities Components Tweening Shaders Geometry click test Play sound Pan sound Entity parent/child heirarchy Font loading Text rendering Bulk resource loading */

class EventOnClick extends Component { var visual :Visual;

override function init() {
    visual = cast entity;
}

override function onmousedown(event :MouseEvent) {
    if (event.button == luxe.MouseButton.left) {
        if (Luxe.utils.geometry.point_in_geometry(event.pos, visual.geometry)) {
            entity.events.fire('clicked');
        }
    }
}

}

class FollowMouse extends Component { override function init() { Actuate .tween(entity.pos, 0.5, { x: Luxe.screen.cursor.pos.x, y: Luxe.screen.cursor.pos.y }) .ease(Quad.easeInOut); }

override function onmousemove(event :MouseEvent) {
    entity.pos = event.pos.clone();
}

}

class Rotator extends Component { public var rotation_speed :Float = 40; var visual :Visual;

override function init() {
    visual = cast entity;
}

override function update(dt :Float) {
    visual.rotation_z += rotation_speed * dt;
}

override function onremoved() {
    Actuate
        .tween(visual, 0.5, { rotation_z: visual.rotation_z - (visual.rotation_z % 60) }) // nearest edge
        .ease(Elastic.easeInOut);
}

}

class SoundOnClick extends Component { override function init() { entity.events.listen("clicked", function(_) { Luxe.audio.play("sound"); }); }

override function update(dt :Float) {
    var pan_value = -1 + (entity.pos.x / Luxe.screen.w) * 2; // Pan between -1 and +1
    Luxe.audio.pan("sound", pan_value);
}

}

class Block extends Visual { override function init() { events.listen("clicked", function(e) { var newColor :luxe.options.ColorOptions = { r: 0.2, g: 0.2, b: 0.2 }; if (!has("follow_mouse")) { add(new FollowMouse({ name: "follow_mouse" })); add(new Rotator({ name: "rotator" })); newColor.b = 1.0; } else { remove("rotator"); remove("follow_mouse"); newColor.r = 1.0; } color.tween(0.5, newColor).ease(Quad.easeInOut); });

    add(new EventOnClick({ name: "event_on_click" }));
}

}

class Main extends luxe.Game { var wave_shader :Shader; var block :Block;

override function ready() {
    Luxe.resources.load_json('assets/parcel.json').then(function(jsonParcel) {
        var preload = new Parcel({
            onfailed: function(err) {
                trace('Parcel loading failed; $err');
            }
        });
        preload.from_json(jsonParcel.asset.json);

        new ParcelProgress({
            parcel: preload,
            background: Luxe.renderer.clear_color,
            oncomplete: assets_loaded
        });

        preload.load();
    }).error(function(s) {
        trace('Error $s');
        throw s;
    });
} //ready

function assets_loaded(_) {
    reset();
}

function reset() {
    create_hexagon();
    create_text();
    create_timed_events();
    create_horizontal_line();
}

function create_hexagon() {
    wave_shader = Luxe.resources.shader("wave");

    var image = Luxe.resources.texture("assets/images/bomb.png");
    image.filter_min = image.filter_mag = FilterType.nearest;

    var shape = Luxe.draw.ngon({
        r: 80,
        sides: 6,
        solid: true
    });

    block = new Block({
        name: "hexagon",
        pos: Vector.Multiply(Luxe.screen.size, Math.random()),
        color: new Color().rgb(0xf94b04),
        geometry: shape
    });
    block.add(new SoundOnClick({ name: "sound_on_click" }));

    var sprite = new Sprite({
        name: "sprite",
        size: new Vector(96, 96),
        texture: image,
        shader: wave_shader,
        parent: block
    });
}

function create_text() {
    //return;
    Luxe.draw.text({
        text: "Luxe Kitchen Sink Test",
        bounds: new Rectangle(0, 0, Luxe.screen.w, 100),
        color: new Color().rgb(0xf94b04),
        align: TextAlign.center,
        align_vertical: TextAlign.center,
        point_size: 36,
        font: Luxe.resources.font('montez'),
        immediate: false
    });
}

function create_timed_events() {
    function heartBeat() {
        Actuate
            .tween(block.scale, 1.0, { x: (Math.round(block.scale.x) % 3) + 1.0, y: (Math.round(block.scale.y) % 3) + 1.0 })
            .ease(Elastic.easeInOut);
    }
    Luxe.timer.schedule(2, heartBeat, true);
}

function create_horizontal_line() {
    // Draw line along top to test that landscape/portrait mode works
    Luxe.draw.line({
        p0: new Vector(100, 100),
        p1: new Vector(Luxe.screen.w - 100, 100),
        color0: new Color(1.0, 0.0, 0.0),
        color1: new Color(0.0, 0.0, 1.0)
    });
}

override function update(dt :Float) {
    if (wave_shader != null) wave_shader.set_float("time", Luxe.time);
}

override function onkeyup(e :KeyEvent) {
    switch (e.keycode) {
        case Key.key_f: app.app.window.fullscreen = true;
        case Key.key_r: reset();
        case Key.escape: Luxe.shutdown();
    }
} //onkeyup

} //Main