WIP proper help and options panel

Keypresses not working. TweeningFns inputs are not synced.
This commit is contained in:
Tyler Hallada 2017-08-12 18:50:51 -04:00
parent ce38957abe
commit e97a4ee3ec
3 changed files with 378 additions and 233 deletions

View File

@ -4,19 +4,52 @@
}
html {
overflow: hidden;
background-color: #1e1e1e;
}
#help {
display: flex;
justify-content: center;
background-color: black;
button {
background-color: #2e2e2e;
border-color: #4a4a4a;
color: #fafafa;
padding: 2px;
}
td, th {
padding: 2px 5px;
}
input {
color: white;
background-color: #2e2e2e;
border-color: #4a4a4a;
}
input[type=number] {
padding: 3px;
}
div.panel {
background-color: rgba(0, 0, 0, 0.6);
border: 2px solid #1e1e1e;
color: white;
position: absolute;
top: 0;
top: 26px;
left: 0;
z-index: 11;
padding: 5px;
}
#help h2 {
text-align: center;
}
#help table {
color: white;
}
#options {
position: fixed;
top: 0;
left: 0;
z-index: 10;
}

View File

@ -16,7 +16,11 @@
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.2.2/pixi.min.js"></script>
<script src="js/proximity.js"></script>
<div id="help" style="display: none;">
<div id="options">
<button id="toggle-help">Help</button>
<button id="toggle-controls">Controls</button>
</div>
<div id="help" class="panel" style="display: none;">
<h2>Help</h2>
<table>
<tr>
@ -40,67 +44,83 @@
<td>speed up time</td>
</tr>
<tr>
<td>left</td>
<td><code>&larr;</code> (left)</td>
<td>hold to restrict points to the left of the screen</td>
</tr>
<tr>
<td>right</td>
<td><code>&rarr;</code> (right)</td>
<td>hold to restrict points to the right of the screen</td>
</tr>
<tr>
<td>up</td>
<td><code>&uarr;</code> (up)</td>
<td>hold to restrict points to the top of the screen</td>
</tr>
<tr>
<td>down</td>
<td><code>&darr;</code> (down)</td>
<td>hold to restrict points to the bottom of the screen</td>
</tr>
<tr>
<td>1</td>
<td><code>1</code></td>
<td>makes points move linearly</td>
</tr>
<tr>
<td>2</td>
<td><code>2</code></td>
<td>makes points meander</td>
</tr>
<tr>
<td>3</td>
<td><code>3</code></td>
<td>makes points snappy</td>
</tr>
<tr>
<td>4</td>
<td><code>4</code></td>
<td>makes points bouncy</td>
</tr>
<tr>
<td>5</td>
<td><code>5</code></td>
<td>makes points elastic</td>
</tr>
<tr>
<td>6</td>
<td><code>6</code></td>
<td>makes points overshoot</td>
</tr>
<tr>
<td>f</td>
<td><code>f</code></td>
<td>toggle FPS counter</td>
</tr>
<tr>
<td>d</td>
<td><code>d</code></td>
<td>toggles debug mode (including FPS counter)</td>
</tr>
<tr>
<td>n</td>
<td><code>n</code></td>
<td>toggles display of nodes</td>
</tr>
<tr>
<td>l</td>
<td><code>l</code></td>
<td>toggles display of lines</td>
</tr>
<tr>
<td>?</td>
<td><code>?</code></td>
<td>toggles this help modal</td>
</tr>
</table>
</div>
<div id="controls" class="panel" style="display: none;">
<form action="">
<label>Time:
<input type="range" name="timeRange" min="1" max="360" value="0" oninput="this.form.timeInput.value=this.value" />
<input type="number" name="timeInput" min="1" max="360" value="0" oninput="this.form.timeRange.value=this.value" />
</label><br />
<label>Point tweening:
<label><input type="radio" name="tweening" value="linear" /> Linear</label>
<label><input type="radio" name="tweening" value="meandering" checked /> Meandering</label>
<label><input type="radio" name="tweening" value="snappy" /> Snappy</label>
<label><input type="radio" name="tweening" value="bouncy" /> Bouncy</label>
<label><input type="radio" name="tweening" value="elastic" /> Elastic</label>
<label><input type="radio" name="tweening" value="back" /> Overshoot</label>
</label>
</form>
</div>
</body>
<!-- Google Analytics -->

View File

@ -248,6 +248,38 @@ function easeInOutCirc (t, b, c, d) {
/* UTILITY FUNCTIONS */
function toggleHelp () {
var help, controls;
help = document.getElementById('help');
controls = document.getElementById('controls');
if (help.style.display === 'none') {
help.style.display = 'block';
// hide controls if open (only want one panel open at a time)
if (controls.style.display === 'block') {
controls.style.display = 'none';
}
} else {
help.style.display = 'none';
}
}
function toggleControls () {
var help, controls;
help = document.getElementById('help');
controls = document.getElementById('controls');
if (controls.style.display === 'none') {
controls.style.display = 'block';
// hide help if open (only want one panel open at a time)
if (help.style.display === 'block') {
help.style.display = 'none';
}
} else {
controls.style.display = 'none';
}
}
function randomInt (min, max) {
// inclusive of min and max
return Math.floor(Math.random() * (max - min + 1)) + min;
@ -644,6 +676,12 @@ function loop () {
}
scrollDelta = 0;
polygonPoints = redistributeCycles(polygonPoints, oldCycleDuration, cycleDuration);
// Update control inputs
var timeRange = document.getElementsByName('timeRange')[0];
var timeInput = document.getElementsByName('timeInput')[0];
timeRange.value = cycleDuration;
timeInput.value = cycleDuration;
}
// Tell the `renderer` to `render` the `stage`
@ -694,6 +732,10 @@ function loopStart () {
scrollDelta = 0;
// Try to fix bug where click initializes to a bogus value
click = null;
hover = null;
window.requestAnimationFrame(loop);
}
@ -702,66 +744,80 @@ window.PIXI.loader
.add(nodeImg)
.load(loopStart);
/* MOUSE AND TOUCH EVENTS */
window.onload = function () {
var tweeningInputs;
tweeningInputs = document.getElementsByName('tweening');
/* MOUSE AND TOUCH EVENTS */
window.addEventListener('mousewheel', function (e) {
window.addEventListener('mousewheel', function (e) {
if (e.target.tagName !== 'CANVAS') return;
scrollDelta = scrollDelta + ((e.deltaY / 100) * 3);
});
});
window.addEventListener('touchstart', function (e) {
window.addEventListener('touchstart', function (e) {
if (e.target.tagName !== 'CANVAS') return;
click = getMousePos(e.changedTouches[0], resolution);
clickEnd = false;
});
});
window.addEventListener('touchmove', function (e) {
window.addEventListener('touchmove', function (e) {
if (e.target.tagName !== 'CANVAS') return;
if (click !== null) {
click = getMousePos(e.changedTouches[0], resolution);
}
});
});
window.addEventListener('touchend', function (e) {
window.addEventListener('touchend', function (e) {
if (e.target.tagName !== 'CANVAS') return;
clickEnd = true;
});
});
window.addEventListener('touchcancel', function (e) {
window.addEventListener('touchcancel', function (e) {
if (e.target.tagName !== 'CANVAS') return;
clickEnd = true;
});
});
window.addEventListener('mousedown', function (e) {
window.addEventListener('mousedown', function (e) {
if (e.target.tagName !== 'CANVAS') return;
click = getMousePos(e, resolution);
clickEnd = false;
});
});
window.addEventListener('mousemove', function (e) {
window.addEventListener('mousemove', function (e) {
if (e.target.tagName !== 'CANVAS') return;
var pos = getMousePos(e, resolution);
if (click !== null) {
click = pos;
}
hover = pos;
});
});
window.addEventListener('mouseup', function (e) {
window.addEventListener('mouseup', function (e) {
if (e.target.tagName !== 'CANVAS') return;
clickEnd = true;
hover = null;
lastHover = null;
});
});
window.addEventListener('mouseleave', function (e) {
window.addEventListener('mouseleave', function (e) {
if (e.target.tagName !== 'CANVAS') return;
clickEnd = true;
hover = null;
lastHover = null;
});
});
document.addEventListener('mouseleave', function (e) {
document.addEventListener('mouseleave', function (e) {
if (e.target.tagName !== 'CANVAS') return;
clickEnd = true;
hover = null;
lastHover = null;
});
});
/* KEYBOARD EVENTS */
/* KEYBOARD EVENTS */
window.addEventListener('keydown', function (e) {
var i, help;
window.addEventListener('keydown', function (e) {
var i;
if (e.target.tagName !== 'CANVAS' || e.target.tagName !== 'BODY') return;
if (e.keyCode === 37) { // left
pointShiftBiasX = -1;
} else if (e.keyCode === 38) { // up
@ -772,16 +828,22 @@ window.addEventListener('keydown', function (e) {
pointShiftBiasY = 1;
} else if (e.keyCode === 49) { // 1
tweeningFns = tweeningSets.linear;
tweeningInputs[0].checked = true;
} else if (e.keyCode === 50) { // 2
tweeningFns = tweeningSets.meandering;
tweeningInputs[1].checked = true;
} else if (e.keyCode === 51) { // 3
tweeningFns = tweeningSets.snappy;
tweeningInputs[2].checked = true;
} else if (e.keyCode === 52) { // 4
tweeningFns = tweeningSets.bouncy;
tweeningInputs[3].checked = true;
} else if (e.keyCode === 53) { // 5
tweeningFns = tweeningSets.elastic;
tweeningInputs[4].checked = true;
} else if (e.keyCode === 54) { // 6
tweeningFns = tweeningSets.back;
tweeningInputs[5].checked = true;
} else if (e.keyCode === 70) { // f
// toggle fpsCounter
if (fpsEnabled) {
@ -823,11 +885,41 @@ window.addEventListener('keydown', function (e) {
} else if (e.keyCode === 76) { // l
drawLines = !drawLines;
} else if (e.keyCode === 191) { // ?
help = document.getElementById('help');
if (help.style.display === 'none') {
help.style.display = 'flex';
} else {
help.style.display = 'none';
toggleHelp();
}
});
/* BUTTON EVENTS */
document.getElementById('toggle-help').addEventListener('click', function () {
toggleHelp();
}, false);
document.getElementById('toggle-controls').addEventListener('click', function () {
toggleControls();
}, false);
var timeRange, timeInput;
timeRange = document.getElementsByName('timeRange')[0];
timeRange.value = cycleDuration;
timeRange.addEventListener('input', function (e) {
var oldCycleDuration = cycleDuration;
cycleDuration = parseInt(this.value, 10);
polygonPoints = redistributeCycles(polygonPoints, oldCycleDuration, cycleDuration);
});
timeInput = document.getElementsByName('timeInput')[0];
timeInput.value = cycleDuration;
timeInput.addEventListener('input', function (e) {
var oldCycleDuration = cycleDuration;
cycleDuration = parseInt(this.value, 10);
polygonPoints = redistributeCycles(polygonPoints, oldCycleDuration, cycleDuration);
});
var i;
for (i = 0; i < tweeningInputs.length; i++) {
tweeningInputs[i].addEventListener('change', function (e) {
tweeningFns = tweeningSets[this.value];
});
}
});
};