133 lines
No EOL
3.3 KiB
JavaScript
133 lines
No EOL
3.3 KiB
JavaScript
'use strict';
|
|
|
|
let fileInput;
|
|
let levelSelector;
|
|
let trackSelector;
|
|
let debugRenderCheckbox;
|
|
|
|
/**
|
|
* @type MRGFile?
|
|
*/
|
|
let parsedFile = null;
|
|
|
|
/**
|
|
*
|
|
* @param {P5File} file
|
|
*/
|
|
const handleFile = function (file) {
|
|
if (file.name.endsWith(".mrg")) {
|
|
loadBytes(file.data, (file) => {
|
|
parsedFile = MRGFile.parse(file.bytes);
|
|
print(parsedFile);
|
|
fileInput.hide();
|
|
levelSelector.show();
|
|
}, (error) => {
|
|
print(error);
|
|
})
|
|
} else {
|
|
alert("unknown file type");
|
|
}
|
|
}
|
|
|
|
const levelSelected = function () {
|
|
let item = ~~levelSelector.value();
|
|
if (item === -1) {
|
|
trackSelector.hide();
|
|
} else {
|
|
while (trackSelector.elt.length > 0) {
|
|
trackSelector.elt.remove(0);
|
|
}
|
|
|
|
trackSelector.option("Select track", -1);
|
|
for (let i = 0; i < parsedFile.levels[item].count; i++) {
|
|
trackSelector.option(parsedFile.getTrack(item, i).name, i);
|
|
}
|
|
|
|
trackSelector.show();
|
|
trackSelector.removeAttribute("disabled");
|
|
}
|
|
}
|
|
|
|
function setup() {
|
|
fileInput = createFileInput(handleFile);
|
|
fileInput.position(20, 50);
|
|
|
|
levelSelector = createSelect();
|
|
levelSelector.position(20, 50);
|
|
levelSelector.hide();
|
|
|
|
levelSelector.option("Select level", -1);
|
|
levelSelector.option("Level 1", 0);
|
|
levelSelector.option("Level 2", 1);
|
|
levelSelector.option("Level 3", 2);
|
|
|
|
levelSelector.changed(levelSelected);
|
|
|
|
trackSelector = createSelect();
|
|
trackSelector.position(20, 80);
|
|
trackSelector.disable();
|
|
trackSelector.hide();
|
|
|
|
debugRenderCheckbox = createCheckbox("Do debug rendering?", true);
|
|
debugRenderCheckbox.position(20, 20);
|
|
|
|
createCanvas(document.body.clientWidth, document.body.clientHeight);
|
|
}
|
|
|
|
let x = 100;
|
|
let y = 100;
|
|
|
|
function draw() {
|
|
translate(width / 2 - x, height / 2 - y);
|
|
background(55);
|
|
|
|
let lev = ~~levelSelector.value();
|
|
let trk = ~~trackSelector.value();
|
|
if (lev !== -1 && trk !== -1) {
|
|
push();
|
|
{
|
|
strokeCap(SQUARE);
|
|
|
|
strokeWeight(2);
|
|
stroke("lime");
|
|
const track = parsedFile.getTrack(lev, trk);
|
|
for (let i = 1; i < track.trackData.mapPoints.length; i++) {
|
|
const pp = track.trackData.mapPoints[i-1];
|
|
const cp = track.trackData.mapPoints[i];
|
|
line(pp.x, -pp.y, cp.x, -cp.y);
|
|
}
|
|
|
|
const taabb = track.trackData.getAABB();
|
|
strokeWeight(6);
|
|
stroke("yellow");
|
|
point(track.trackData.playerStartPos.x, -track.trackData.playerStartPos.y);
|
|
stroke("red");
|
|
line(track.trackData.finishPos.x, -taabb.topLeft.y, track.trackData.finishPos.x, -taabb.bottomRight.y);
|
|
|
|
if (debugRenderCheckbox.checked()) {
|
|
strokeWeight(1);
|
|
noFill();
|
|
rectMode(CORNERS);
|
|
stroke("cyan");
|
|
rect(taabb.topLeft.x, -taabb.topLeft.y, taabb.bottomRight.x, -taabb.bottomRight.y);
|
|
}
|
|
}
|
|
pop();
|
|
}
|
|
|
|
if (keyIsDown(LEFT_ARROW)) {
|
|
x -= 5;
|
|
}
|
|
|
|
if (keyIsDown(RIGHT_ARROW)) {
|
|
x += 5;
|
|
}
|
|
|
|
if (keyIsDown(UP_ARROW)) {
|
|
y -= 5;
|
|
}
|
|
|
|
if (keyIsDown(DOWN_ARROW)) {
|
|
y += 5;
|
|
}
|
|
} |