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