238 lines
6.3 KiB
JavaScript
238 lines
6.3 KiB
JavaScript
// // force https
|
|
// var http_confirm = location.href.split(":")[0];
|
|
// if (http_confirm == "http") {
|
|
// window.location.replace("https://" + location.host);
|
|
// }
|
|
|
|
var socket = io(location.host);
|
|
var n = 0;
|
|
var fr = 20;
|
|
var arr = [];
|
|
var looper;
|
|
var score;
|
|
let logo;
|
|
var silence;
|
|
|
|
function preload() {
|
|
silence = loadSound("./audio/_silence.wav");
|
|
}
|
|
|
|
function setup() {
|
|
noCanvas();
|
|
if (windowWidth > 1500 && windowWidth > windowHeight) {
|
|
fr = 30;
|
|
} else {
|
|
fr = 20;
|
|
}
|
|
frameRate(fr);
|
|
}
|
|
|
|
//
|
|
var myroom = -1;
|
|
var intro;
|
|
var ready;
|
|
//
|
|
socket.on("connect", function() {
|
|
console.log("connected!");
|
|
//
|
|
|
|
//TESTING... fixed to room 1.
|
|
// myroom = 1;
|
|
|
|
if (myroom == -1 && selectAll(".roomsel").length == 0) {
|
|
//initial connection -> ask the room number.
|
|
|
|
intro = createP("《흐름을 향하여 걷는》 ...");
|
|
intro.style("font-size", windowHeight / 30 + "pt");
|
|
intro.class("intro");
|
|
var roomsel = createDiv();
|
|
roomsel.class("roomsel");
|
|
var b = createButton("시작하기!", 1);
|
|
b.mouseClicked(function() {
|
|
silence.play();
|
|
myroom = parseInt(this.value());
|
|
|
|
socket.emit("room", myroom, function(res) {
|
|
if (res) {
|
|
console.log("entered the room -> " + myroom);
|
|
createP(str(myroom));
|
|
// setTimeout(function() {
|
|
// ready = createP("퍼레이드 시작합니다!!");
|
|
// ready.position(
|
|
// windowWidth / 2 - windowWidth / 10,
|
|
// windowHeight / 2
|
|
// );
|
|
// }, 1000);
|
|
} else {
|
|
console.log("rejected!");
|
|
}
|
|
});
|
|
|
|
setTimeout(function() {
|
|
selectAll(".roomsel").forEach(function(item) {
|
|
item.remove();
|
|
});
|
|
selectAll(".intro").forEach(function(item) {
|
|
item.remove();
|
|
});
|
|
}, 1000);
|
|
});
|
|
roomsel.child(b);
|
|
} else {
|
|
//re-connection -> just connect to remembered room!
|
|
socket.emit("room", myroom, function(res) {
|
|
if (res) {
|
|
console.log("entered the room -> " + myroom);
|
|
} else {
|
|
console.log("rejected!");
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
socket.on("post", async function(post) {
|
|
|
|
console.log(post);
|
|
var resp = await new Promise((resolve, reject) => {
|
|
loadJSON("/entries", (json) => resolve(json));
|
|
})
|
|
console.log(resp.list);
|
|
|
|
// var object = post.object;
|
|
var object = {
|
|
"id": 1,
|
|
"type": "abc",
|
|
"src": "https://p.dianaband.info/public/sound-parade/" + resp.list[post] + "/pixels.png",
|
|
"audio": "https://p.dianaband.info/public/sound-parade/" + resp.list[post] + "/audio.mp3",
|
|
"alt": "알트",
|
|
"size": { "base": 40, "random": 20 },
|
|
"y": { "base": 20, "random": 10 },
|
|
"showtime": 30000
|
|
};
|
|
console.log(object);
|
|
|
|
var img = createImg(object.src, object.alt, "", function(im) {
|
|
var sound = loadSound(object.audio, function(snd) {
|
|
//로딩이 끝나면, play!
|
|
snd.loop();
|
|
|
|
//로딩이 끝나면, show!
|
|
im.show();
|
|
|
|
//그림의 크기와 초기 위치 ==> 가로 보기인 경우
|
|
var width = 0;
|
|
if (windowWidth > windowHeight) {
|
|
|
|
width = (windowHeight * (object.size.base * 1.4 + object.size.random * Math.random())) / 100; // 좀더 크게 + 40% (ratio)
|
|
im.size(width, AUTO);
|
|
|
|
im.position(
|
|
windowWidth * 1.5, // +150% 에서 생성되어서 접근 (sound fade-in)
|
|
(windowHeight * (object.y.base + object.y.random * Math.random()) * 0.5) / 100 // 좀더 위로 위로 - 50% (ratio)
|
|
);
|
|
|
|
//그림의 크기와 초기 위치 ==> 세로 보기인 경우
|
|
} else {
|
|
|
|
width = (windowHeight * (object.size.base + object.size.random * Math.random())) / 100; // json에서 정한 크기 그대로. (ratio)
|
|
im.size(width, AUTO);
|
|
|
|
im.position(
|
|
windowWidth * 1.5, // +150% 에서 생성되어서 접근 (sound fade-in)
|
|
(windowHeight * (object.y.base + object.y.random * Math.random())) / 100 // json에서 정한 위치 그대로. (ratio)
|
|
);
|
|
}
|
|
|
|
//추가 정보들
|
|
im.attribute("data-type", object.type);
|
|
im.attribute("data-showtime", object.showtime / 1000); //milli-sec. -> seconds.
|
|
|
|
//'아이콘' 들은 애니메이션을 시켜줘야 함...
|
|
if (object.type == "icon") {
|
|
//
|
|
im.class("rotate");
|
|
im.style("animation-duration", object.rotate + "s");
|
|
var orgs = im.style("transform-origin").split(" ");
|
|
var str = parseFloat(orgs[0]) + object.pivot.x + "px";
|
|
str = str + " " + parseFloat(orgs[1]) + object.pivot.y + "px";
|
|
im.style("transform-origin", str);
|
|
//
|
|
}
|
|
|
|
//로딩이 다 되면, rendering array에 추가.
|
|
var bundle = {
|
|
ref: object,
|
|
img: im,
|
|
sound: snd,
|
|
width: width
|
|
};
|
|
arr.push(bundle);
|
|
});
|
|
});
|
|
|
|
//첨에는 hide
|
|
img.hide();
|
|
|
|
});
|
|
|
|
function draw() {
|
|
for (var i = arr.length - 1; i >= 0; i -= 1) {
|
|
var bundle = arr[i];
|
|
var img = bundle.img;
|
|
var showtime = parseFloat(img.attribute("data-showtime"));
|
|
var type = img.attribute("data-type");
|
|
var x = img.position().x;
|
|
var y = img.position().y;
|
|
y = y + random(-1, 1);
|
|
x = x - windowWidth / (fr * showtime);
|
|
|
|
//
|
|
if (type == "icon") {
|
|
img.style("z-index", "-1");
|
|
}
|
|
3;
|
|
|
|
img.position(x, y);
|
|
var pan = (x / windowWidth) * 2 - 1;
|
|
|
|
//panning
|
|
var snd = bundle.sound;
|
|
if (x >= -bundle.width && x < windowWidth) {
|
|
pan = ((x + bundle.width) / (windowWidth + bundle.width)) * 2 - 1;
|
|
snd.pan(pan);
|
|
snd.setVolume(1);
|
|
} else {
|
|
var range;
|
|
var knob;
|
|
if (x >= windowWidth) {
|
|
range = windowWidth / 2;
|
|
knob = x - windowWidth;
|
|
snd.pan(1);
|
|
snd.setVolume(1 - knob / range);
|
|
} else if (x < -bundle.width) {
|
|
range = windowWidth / 2;
|
|
knob = (x + bundle.width) * -1;
|
|
snd.pan(-1);
|
|
snd.setVolume(1 - knob / range);
|
|
}
|
|
}
|
|
|
|
//remove at -50% (sound fade-out)
|
|
var exit_x = -bundle.width - windowWidth/2;
|
|
if (x < exit_x) {
|
|
img.remove();
|
|
snd.stop();
|
|
arr.splice(i, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// function randomvoiceplay() {
|
|
// (looper = function(timeout) {
|
|
// setTimeout(function() {
|
|
// voice[int(random(19))].play();
|
|
// looper(random(8000, 12000));
|
|
// }, timeout);
|
|
// })(8000);
|
|
// }
|