Skip to content

Instantly share code, notes, and snippets.

@anissen
Last active March 26, 2016 16:53
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anissen/2e809b502708db273357 to your computer and use it in GitHub Desktop.
Save anissen/2e809b502708db273357 to your computer and use it in GitHub Desktop.
Luxe kitchen sink test
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
{
"textures": [
{ "id": "assets/images/bomb.png" }
],
"fonts": [
{ "id": "assets/fonts/montez/montez.fnt" }
],
"sounds": [
{ "id": "assets/sounds/sound.ogg", "name": "sound", "is_stream": false }
],
"shaders": [
{ "id": "wave", "frag_id": "assets/shaders/wave.glsl", "vert_id": "default" }
]
}
{
flow : {
build : {
android : {
sdk: '/usr/local/Cellar/android-sdk/r21.1/',
ant_path: '/usr/local/Cellar/ant/1.9.4/bin/ant'
}
}
},
project : {
name : 'test',
version : '0.0.2',
author : 'Anders Nissen',
app : {
name : 'luxe_test',
package : 'com.andersnissen.test',
mobile : {
orientation : 'portrait'
}
},
build : {
dependencies : {
luxe : '*'
}
},
files : {
assets : 'assets/'
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment