Last active
March 26, 2016 16:53
-
-
Save anissen/2e809b502708db273357 to your computer and use it in GitHub Desktop.
Luxe kitchen sink test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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" } | |
] | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
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